Setup events + add verbosity in gestion.models

- Mark more strings for further translations
    - in verbose names
    - in the __str__ method
- Turn all verbose names into lowercase
- Add more verbose names

- Set an ordering on gestion.EventCommentField

- More database constraints on EventCommentValue
    - `TextField` is not nullable
      (https://docs.djangoproject.com/en/1.11/ref/models/fields/#null)
    - `unique_together` constraint on the two fk
This commit is contained in:
Martin Pépin 2017-06-24 13:42:33 +01:00
parent cacdde3f87
commit a1ffb630c0
2 changed files with 350 additions and 54 deletions

View file

@ -0,0 +1,236 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11b1 on 2017-06-24 20:08
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('gestion', '0003_events'),
]
operations = [
migrations.AlterModelOptions(
name='event',
options={'verbose_name': 'événement', 'verbose_name_plural': 'événements'},
),
migrations.AlterModelOptions(
name='eventcommentfield',
options={'verbose_name': 'champ', 'verbose_name_plural': 'champs'},
),
migrations.AlterModelOptions(
name='eventoption',
options={'verbose_name': 'option des événements', 'verbose_name_plural': 'options des événements'},
),
migrations.AlterModelOptions(
name='eventoptionchoice',
options={'verbose_name': 'choix', 'verbose_name_plural': 'choix'},
),
migrations.AlterModelOptions(
name='eventregistration',
options={'verbose_name': 'inscription', 'verbose_name_plural': 'inscriptions'},
),
migrations.AlterModelOptions(
name='profile',
options={'verbose_name': 'profil', 'verbose_name_plural': 'profils'},
),
migrations.AddField(
model_name='eventcommentfield',
name='ordering',
field=models.IntegerField(default=0, help_text='plus petit en premier, ordre alphabétique sur le nom si ambiguïté', verbose_name='ordre des champs'),
preserve_default=False,
),
migrations.AlterField(
model_name='club',
name='cotisation_frequency',
field=models.CharField(blank=True, choices=[('ANN', 'Annuel'), ('SEM', 'Semestriel'), ('COU', 'Au cours')], default='ANN', max_length=3, verbose_name='fréquence de la cotisation'),
),
migrations.AlterField(
model_name='club',
name='description',
field=models.TextField(blank=True, verbose_name='description'),
),
migrations.AlterField(
model_name='club',
name='members',
field=models.ManyToManyField(blank=True, related_name='in_clubs', through='gestion.ClubUser', to=settings.AUTH_USER_MODEL, verbose_name='membres du club'),
),
migrations.AlterField(
model_name='club',
name='name',
field=models.CharField(max_length=200, unique=True, verbose_name='nom'),
),
migrations.AlterField(
model_name='club',
name='price',
field=models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=5, verbose_name='cotisation (€)'),
),
migrations.AlterField(
model_name='clubuser',
name='has_paid',
field=models.BooleanField(verbose_name='a payé sa cotisation'),
),
migrations.AlterField(
model_name='clubuser',
name='is_respo',
field=models.BooleanField(verbose_name='est responsable du club'),
),
migrations.AlterField(
model_name='event',
name='associations',
field=models.ManyToManyField(related_name='events', to='auth.Group', verbose_name='associations'),
),
migrations.AlterField(
model_name='event',
name='description',
field=models.TextField(blank=True, verbose_name='description'),
),
migrations.AlterField(
model_name='event',
name='end_date',
field=models.DateTimeField(blank=True, null=True, verbose_name="fin de l'événement"),
),
migrations.AlterField(
model_name='event',
name='image',
field=models.ImageField(blank=True, null=True, upload_to='public/imgs/events/', verbose_name='image'),
),
migrations.AlterField(
model_name='event',
name='location',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='gestion.Location', verbose_name='lieux'),
),
migrations.AlterField(
model_name='event',
name='old',
field=models.BooleanField(default=False, verbose_name='archiver (événement fini)'),
),
migrations.AlterField(
model_name='event',
name='registration_open',
field=models.BooleanField(default=True, verbose_name='les inscriptions sont ouvertes'),
),
migrations.AlterField(
model_name='event',
name='start_date',
field=models.DateTimeField(blank=True, null=True, verbose_name="début de l'événement"),
),
migrations.AlterField(
model_name='event',
name='title',
field=models.CharField(max_length=200, verbose_name='titre'),
),
migrations.AlterField(
model_name='eventcommentfield',
name='default',
field=models.TextField(blank=True, verbose_name='valeur par défaut'),
),
migrations.AlterField(
model_name='eventcommentfield',
name='event',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='commentfields', to='gestion.Event', verbose_name='événement'),
),
migrations.AlterField(
model_name='eventcommentfield',
name='fieldtype',
field=models.CharField(choices=[('text', 'Texte long'), ('char', 'Texte court')], default='text', max_length=10, verbose_name='type de champ'),
),
migrations.AlterField(
model_name='eventcommentfield',
name='name',
field=models.CharField(max_length=200, verbose_name='nom du champ'),
),
migrations.AlterField(
model_name='eventcommentvalue',
name='content',
field=models.TextField(blank=True, verbose_name='contenu'),
),
migrations.AlterUniqueTogether(
name='eventcommentvalue',
unique_together=set([('commentfield', 'registration')]),
),
migrations.AlterField(
model_name='eventoption',
name='event',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='options', to='gestion.Event', verbose_name='événement'),
),
migrations.AlterField(
model_name='eventoption',
name='multi_choices',
field=models.BooleanField(default=False, verbose_name='choix multiples'),
),
migrations.AlterField(
model_name='eventoption',
name='name',
field=models.CharField(max_length=200, verbose_name='option'),
),
migrations.AlterField(
model_name='eventoptionchoice',
name='event_option',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='choices', to='gestion.EventOption', verbose_name='événement'),
),
migrations.AlterField(
model_name='eventregistration',
name='event',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gestion.Event', verbose_name='événement'),
),
migrations.AlterField(
model_name='eventregistration',
name='filledcomments',
field=models.ManyToManyField(through='gestion.EventCommentValue', to='gestion.EventCommentField', verbose_name='commentaires'),
),
migrations.AlterField(
model_name='eventregistration',
name='options',
field=models.ManyToManyField(to='gestion.EventOptionChoice', verbose_name='choix'),
),
migrations.AlterField(
model_name='eventregistration',
name='paid',
field=models.BooleanField(default=False, verbose_name='a payé'),
),
migrations.AlterField(
model_name='eventregistration',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='utilisateur'),
),
migrations.AlterField(
model_name='location',
name='name',
field=models.CharField(max_length=200, verbose_name='nom du lieux'),
),
migrations.AlterField(
model_name='profile',
name='comments',
field=models.TextField(blank=True, verbose_name="commentaires visibles par l'utilisateur"),
),
migrations.AlterField(
model_name='profile',
name='departement',
field=models.CharField(blank=True, max_length=50, verbose_name='département'),
),
migrations.AlterField(
model_name='profile',
name='login_clipper',
field=models.CharField(blank=True, max_length=8, verbose_name='login clipper'),
),
migrations.AlterField(
model_name='profile',
name='occupation',
field=models.CharField(choices=[('exterieur', 'Extérieur'), ('1A', '1A'), ('2A', '2A'), ('3A', '3A'), ('4A', '4A'), ('archicube', 'Archicube'), ('doctorant', 'Doctorant'), ('CST', 'CST')], default='1A', max_length=9, verbose_name='occupation'),
),
migrations.AlterField(
model_name='profile',
name='phone',
field=models.CharField(blank=True, max_length=20, verbose_name='téléphone'),
),
migrations.AlterField(
model_name='profile',
name='user',
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL, verbose_name='utilisateur'),
),
]

View file

@ -27,23 +27,29 @@ class Profile(models.Model):
user = models.OneToOneField(
User,
on_delete=models.CASCADE,
related_name="profile"
related_name="profile",
verbose_name=_("utilisateur"),
)
login_clipper = models.CharField("Login clipper", max_length=8, blank=True)
phone = models.CharField("Téléphone", max_length=20, blank=True)
occupation = models.CharField(_("Occupation"),
login_clipper = models.CharField(
_("login clipper"),
max_length=8,
blank=True,
)
phone = models.CharField(_("téléphone"), max_length=20, blank=True)
occupation = models.CharField(_("occupation"),
default="1A",
choices=OCCUPATION_CHOICES,
max_length=choices_length(
OCCUPATION_CHOICES))
departement = models.CharField(_("Département"), max_length=50,
departement = models.CharField(_("département"), max_length=50,
blank=True)
comments = models.TextField(
"Commentaires visibles par l'utilisateur", blank=True)
_("commentaires visibles par l'utilisateur"), blank=True
)
class Meta:
verbose_name = "Profil"
verbose_name_plural = "Profils"
verbose_name = _("profil")
verbose_name_plural = _("profils")
def __str__(self):
return self.user.username
@ -76,23 +82,24 @@ class Club(models.Model):
]
associations = models.ManyToManyField(Group, related_name="clubs")
name = models.CharField(_("Nom"), max_length=200, unique=True)
description = models.TextField("Description", blank=True)
name = models.CharField(_("nom"), max_length=200, unique=True)
description = models.TextField("description", blank=True)
members = models.ManyToManyField(
User,
through="ClubUser",
related_name="in_clubs",
blank=True
blank=True,
verbose_name=_("membres du club"),
)
price = models.DecimalField(
_("Cotisation (€)"),
_("cotisation (€)"),
decimal_places=2,
max_digits=5,
blank=True,
default=0
)
cotisation_frequency = models.CharField(
_("Fréquence de la cotisation"),
_("fréquence de la cotisation"),
default=ANNUAL,
choices=COTISATION_FREQUENCY_CHOICES,
max_length=3,
@ -101,17 +108,18 @@ class Club(models.Model):
def __str__(self):
template = (
self.price and "{name} ({price}€ / {cotisation_frequency})"
or "{name}"
self.price
and _("%(name)s (%(price).2f€ / %(cotisation_frequency)s)")
or _("%(name)s")
)
return template.format(**vars(self))
return template % vars(self)
class ClubUser(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
club = models.ForeignKey(Club, on_delete=models.CASCADE)
is_respo = models.BooleanField(_("Est responsable du club"))
has_paid = models.BooleanField(_("A payé sa cotisation"))
is_respo = models.BooleanField(_("est responsable du club"))
has_paid = models.BooleanField(_("a payé sa cotisation"))
# ---
@ -119,30 +127,51 @@ class ClubUser(models.Model):
# ---
class Location(models.Model):
name = models.CharField("Lieu", max_length=200)
name = models.CharField(_("nom du lieux"), max_length=200)
class Meta:
verbose_name = "lieu"
verbose_name_plural = "lieux"
verbose_name = _("lieu")
verbose_name_plural = _("lieux")
def __str__(self):
return self.name
class Event(models.Model):
associations = models.ManyToManyField(Group, related_name="events")
title = models.CharField("Titre", max_length=200)
location = models.ForeignKey(Location, on_delete=models.PROTECT)
start_date = models.DateTimeField("Date de début", blank=True, null=True)
end_date = models.DateTimeField("Date de fin", blank=True, null=True)
description = models.TextField("Description", blank=True)
associations = models.ManyToManyField(
Group,
related_name="events",
verbose_name=_("associations"),
)
title = models.CharField(_("titre"), max_length=200)
location = models.ForeignKey(
Location,
on_delete=models.PROTECT,
verbose_name=_("lieux"),
)
start_date = models.DateTimeField(
_("début de l'événement"),
blank=True, null=True,
)
end_date = models.DateTimeField(
_("fin de l'événement"),
blank=True, null=True,
)
description = models.TextField(_("description"), blank=True)
image = models.ImageField(
"Image", blank=True, null=True, upload_to="imgs/events/"
_("image"),
blank=True, null=True,
upload_to="public/imgs/events/",
)
registration_open = models.BooleanField(
"Inscriptions ouvertes", default=True
_("les inscriptions sont ouvertes"),
default=True
)
old = models.BooleanField("Archiver (événement fini)", default=False)
old = models.BooleanField(_("archiver (événement fini)"), default=False)
class Meta:
verbose_name = "Événement"
verbose_name = _("événement")
verbose_name_plural = _("événements")
def __str__(self):
return self.title
@ -160,16 +189,27 @@ class EventCommentField(models.Model):
event = models.ForeignKey(
Event,
on_delete=models.CASCADE,
related_name="commentfields"
related_name="commentfields",
verbose_name=_("événement"),
)
name = models.CharField("Champ", max_length=200)
name = models.CharField(_("nom du champ"), max_length=200)
fieldtype = models.CharField(
"Type", max_length=10, choices=FIELD_TYPE, default=TEXT
_("type de champ"),
max_length=10,
choices=FIELD_TYPE, default=TEXT,
)
default = models.TextField(_("valeur par défaut"), blank=True)
ordering = models.IntegerField(
_("ordre des champs"),
help_text=_(
"plus petit en premier, ordre alphabétique sur le nom si "
"ambiguïté"
),
)
default = models.TextField("Valeur par défaut", blank=True)
class Meta:
verbose_name = "Champ"
verbose_name = _("champ")
verbose_name_plural = _("champs")
def __str__(self):
return self.name
@ -186,24 +226,31 @@ class EventCommentValue(models.Model):
on_delete=models.CASCADE,
related_name="comments"
)
content = models.TextField("Contenu", blank=True, null=True)
content = models.TextField(_("contenu"), blank=True)
class Meta:
unique_together = ("commentfield", "registration")
def __str__(self):
return "Commentaire de {}".format(self.commentfield)
return (
_("Commentaire de %(field_name)s")
% {"field_name": self.commentfield}
)
class EventOption(models.Model):
event = models.ForeignKey(
Event,
on_delete=models.CASCADE,
related_name="options"
related_name="options",
verbose_name=_("événement"),
)
name = models.CharField("Option", max_length=200)
multi_choices = models.BooleanField("Choix multiples", default=False)
name = models.CharField(_("option"), max_length=200)
multi_choices = models.BooleanField(_("choix multiples"), default=False)
class Meta:
verbose_name = "Option des événements"
verbose_name_plural = "Options des événements"
verbose_name = _("option des événements")
verbose_name_plural = _("options des événements")
def __str__(self):
return self.name
@ -213,13 +260,14 @@ class EventOptionChoice(models.Model):
event_option = models.ForeignKey(
EventOption,
on_delete=models.CASCADE,
related_name="choices"
related_name="choices",
verbose_name=_("événement"),
)
value = models.CharField("Valeur", max_length=200)
class Meta:
verbose_name = "Choix"
verbose_name_plural = "Choix"
verbose_name = _("choix")
verbose_name_plural = _("choix")
def __str__(self):
return self.value
@ -228,20 +276,32 @@ class EventOptionChoice(models.Model):
class EventRegistration(models.Model):
user = models.ForeignKey(
User,
on_delete=models.CASCADE
on_delete=models.CASCADE,
verbose_name=_("utilisateur"),
)
event = models.ForeignKey(
Event,
on_delete=models.CASCADE
on_delete=models.CASCADE,
verbose_name=_("événement"),
)
options = models.ManyToManyField(EventOptionChoice)
filledcomments = models.ManyToManyField(EventCommentField,
through=EventCommentValue)
paid = models.BooleanField("A payé", default=False)
options = models.ManyToManyField(
EventOptionChoice,
verbose_name=_("choix"),
)
filledcomments = models.ManyToManyField(
EventCommentField,
through=EventCommentValue,
verbose_name=_("commentaires"),
)
paid = models.BooleanField(_("a payé"), default=False)
class Meta:
verbose_name = "Inscription"
verbose_name = _("inscription")
verbose_name_plural = _("inscriptions")
unique_together = ("user", "event")
def __str__(self):
return "Inscription de {} à {}".format(self.user, self.event.title)
return (
_("Inscription de %(user)s à %(event)s")
% {"user": self.user, "event": self.event}
)