| 1 | # -*- coding: utf-8 -*- |
| 2 | |
| 3 | from django.contrib.auth import models as auth_models |
| 4 | from django.db import models |
| 5 | |
| 6 | from django_xworkflows import models as xwf_models |
| 7 | |
| 8 | from xnet.utils.images.fields import ImageWithThumbsField as ImageField |
| 9 | |
| 10 | |
| 11 | class MembershipWorkflow(xwf_models.Workflow): |
| 12 | states = ( |
| 13 | ('pending', u"En attente"), |
| 14 | ('enabled', u"Actif"), |
| 15 | ('removed', u"Supprimé"), |
| 16 | ) |
| 17 | transitions = ( |
| 18 | ('accept', ['pending'], 'enabled'), |
| 19 | ('remove', ['pending', 'enabled'], 'removed'), |
| 20 | ) |
| 21 | initial_state = 'pending' |
| 22 | |
| 23 | log_model = '' # We don't want logs |
| 24 | |
| 25 | |
| 26 | class XGroup(models.Model): |
| 27 | """A model for an XGroup.""" |
| 28 | KIND_PROMO = 'promo' |
| 29 | KIND_GROUP = 'group' |
| 30 | KIND_BINET = 'binet' |
| 31 | KIND_INSTIT = 'instit' |
| 32 | |
| 33 | KIND_CHOICES = ( |
| 34 | (KIND_PROMO, u"Promo"), |
| 35 | (KIND_GROUP, u"Groupe"), |
| 36 | (KIND_BINET, u"Binet"), |
| 37 | (KIND_INSTIT, u"Institution"), |
| 38 | ) |
| 39 | |
| 40 | DOMAIN_HISTORY = 'history' |
| 41 | DOMAIN_INTERNATIONAL = 'international' |
| 42 | DOMAIN_EVENTS = 'events' |
| 43 | DOMAIN_LEISURE = 'leisure' |
| 44 | DOMAIN_SPORTS = 'sports' |
| 45 | DOMAIN_PRO = 'pro' |
| 46 | DOMAIN_REGION = 'region' |
| 47 | |
| 48 | DOMAIN_CHOICES = ( |
| 49 | (DOMAIN_HISTORY, u"Histoire"), |
| 50 | (DOMAIN_INTERNATIONAL, u"International"), |
| 51 | (DOMAIN_EVENTS, u"Événements"), |
| 52 | (DOMAIN_LEISURE, u"Loisirs"), |
| 53 | (DOMAIN_SPORTS, u"Sports"), |
| 54 | (DOMAIN_PRO, u"Pro"), |
| 55 | (DOMAIN_REGION, u"Région"), |
| 56 | ) |
| 57 | |
| 58 | name = models.CharField(max_length=100, verbose_name=u"nom", unique=True) |
| 59 | short = models.SlugField(max_length=10, verbose_name=u"nom court", unique=True) |
| 60 | kind = models.CharField(max_length=10, choices=KIND_CHOICES, verbose_name=u"type") |
| 61 | domain = models.CharField(max_length=20, choices=DOMAIN_CHOICES, verbose_name=u"domaine") |
| 62 | |
| 63 | dns = models.CharField(max_length=128, verbose_name=u"dns domain", blank=True) |
| 64 | |
| 65 | web = models.CharField(max_length=255, verbose_name=u"website", blank=True) |
| 66 | #contact = models.ForeignKey('') |
| 67 | description = models.TextField() |
| 68 | logo = ImageField(upload_to='logos', null=True, blank=True) |
| 69 | |
| 70 | class Meta: |
| 71 | verbose_name = u"groupe" |
| 72 | verbose_name_plural = u"groupes" |
| 73 | |
| 74 | def __unicode__(self): |
| 75 | return self.name |
| 76 | |
| 77 | |
| 78 | class Account(auth_models.AbstractUser): |
| 79 | xgroups = models.ManyToManyField( |
| 80 | XGroup, related_name='users', through='Membership', verbose_name=u"groupes") |
| 81 | |
| 82 | class Meta: |
| 83 | verbose_name = u"utilisateur" |
| 84 | verbose_name_plural = u"utilisateurs" |
| 85 | |
| 86 | def __unicode__(self): |
| 87 | return self.username |
| 88 | |
| 89 | |
| 90 | class Membership(xwf_models.WorkflowEnabled, models.Model): |
| 91 | LEVEL_MEMBER = 0 |
| 92 | LEVEL_ADMIN = 10 |
| 93 | LEVEL_CHOICES = ( |
| 94 | (LEVEL_MEMBER, u"membre"), |
| 95 | (LEVEL_ADMIN, u"administrateur"), |
| 96 | ) |
| 97 | |
| 98 | xgroup = models.ForeignKey(XGroup, related_name='memberships', verbose_name=u"groupe") |
| 99 | xuser = models.ForeignKey(Account, related_name='memberships', verbose_name=u"utilisateur") |
| 100 | |
| 101 | level = models.IntegerField(choices=LEVEL_CHOICES, default=LEVEL_MEMBER, verbose_name=u"droits") |
| 102 | state = xwf_models.StateField(MembershipWorkflow, verbose_name=u"état") |
| 103 | |
| 104 | class Meta: |
| 105 | verbose_name = u"adhérent" |
| 106 | verbose_name_plural = u"adhérents" |
| 107 | unique_together = ['xgroup', 'xuser'] |
| 108 | |
| 109 | def __unicode__(self): |
| 110 | return u"{} {} de {} [{}]".format(self.xuser, dict(Membership.LEVEL_CHOICES)[self.level], self.xgroup, self.state) |