from django.contrib.auth.models import User from django.utils.translation import ugettext_lazy as _ from django.core import exceptions from django.db import models from re import search as re_search def validate_color(value): def is_hex_color(s): return re_search(r'^#(?:[0-9a-fA-F]{3}){1,2}$', s) if not is_hex_color(value): raise exceptions.ValidationError( _("%(value)s n'est pas une couleur"), code='invalid_choice', params={'value': value}, ) class Event(models.Model): title = models.CharField( _("Nom de l'évènement"), max_length=200, ) slug = models.SlugField( _('Identificateur'), unique=True, primary_key=True, help_text=_("Seulement des lettres, des chiffres ou \ les caractères '_' ou '-'."), ) created_by = models.ForeignKey( User, related_name="created_events", editable=False, ) creation_date = models.DateTimeField( _('Date de création'), auto_now_add=True, ) description = models.TextField(_('Description')) beginning_date = models.DateTimeField(_('Date de début')) ending_date = models.DateTimeField(_('Date de fin')) class Meta: verbose_name = _("évènement") verbose_name_plural = _("évènements") def __str__(self): return self.title class Place(models.Model): name = models.CharField( _("Nom du lieu"), max_length=200, ) description = models.TextField(blank=True) class Meta: verbose_name = _("lieu") verbose_name_plural = _("lieux") def __str__(self): return self.name class ActivityTag(models.Model): name = models.CharField( _("Nom du tag"), max_length=200, ) is_public = models.BooleanField( help_text=_("TODO"), ) color = models.CharField( _('Couleur'), max_length=7, validators=[validate_color], ) class Meta: verbose_name = _("tag") verbose_name_plural = _("tags") def __str__(self): return self.name class ActivityTemplate(models.Model): title = models.CharField( _("Nom de l'activité"), max_length=200, blank=True, null=True, ) # FIXME: voir comment on traite l'héritage de `event` event = models.ForeignKey( Event, related_name="activities", blank=True, null=True, ) is_public = models.NullBooleanField( blank=True, ) has_perm = models.NullBooleanField( blank=True, ) min_perm = models.PositiveSmallIntegerField( _('Nombre minimum de permanents'), blank=True, null=True, ) max_perm = models.PositiveSmallIntegerField( _('Nombre maximum de permanents'), blank=True, null=True, ) description = models.TextField( _('Description'), help_text=_("Public, Visible par tout le monde."), blank=True, null=True, ) remarks = models.TextField( _('Remarques'), help_text=_("Visible uniquement par les organisateurs"), blank=True, null=True, ) tags = models.ManyToManyField( ActivityTag, related_name="activities", blank=True, ) place = models.ManyToManyField( Place, related_name="activities", blank=True, ) class Meta: verbose_name = _("template activité") verbose_name_plural = _("templates activité") def __str__(self): return self.title class Activity(ActivityTemplate): parent = models.ForeignKey( ActivityTemplate, related_name="children", ) staff = models.ManyToManyField( User, related_name="in_perm_activities", blank=True, ) def get_herited(self, attrname): attr = super(Activity, self).__getattribute__(attrname) if (attrname == 'parent' or attrname == 'staff' or attrname == 'equipment'): return attr elif (attrname == 'place' or attrname == 'tags'): if attr.exists(): return attr else: return self.parent.__getattribute__(attrname) elif attr is None: return self.parent.__getattribute__(attrname) else: return attr class Meta: verbose_name = _("activité") verbose_name_plural = _("activités") def __str__(self): return self.get_herited('title') # Si le champ de l'activité n'est pas spécifié # alors on va chercher celui de self.parent # def __getattribute__(self, attrname): # attr = super(Activity, self).__getattribute__(attrname) # if (attrname == 'parent' # or attrname == 'staff' # or attrname == 'equipment'): # return attr # elif attr is None: # return self.parent.__getattribute__(attrname) # else: # return attr # def __setattr__(self, name, value): # self.__dict__[name] = value