forked from DGNum/gestioCOF
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:
parent
cacdde3f87
commit
a1ffb630c0
2 changed files with 350 additions and 54 deletions
236
gestion/migrations/0004_verbose_names.py
Normal file
236
gestion/migrations/0004_verbose_names.py
Normal 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'),
|
||||
),
|
||||
]
|
|
@ -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}
|
||||
)
|
||||
|
|
Loading…
Reference in a new issue