accounts - add user models
[xnet] / xnet / accounts / models.py
diff --git a/xnet/accounts/models.py b/xnet/accounts/models.py
new file mode 100644 (file)
index 0000000..e4f83ab
--- /dev/null
@@ -0,0 +1,85 @@
+# -*- coding: utf-8 -*-
+
+from django.contrib.auth import models as auth_models
+from django.db import models
+
+from django_xworkflows import models as xwf_models
+
+
+class MembershipWorkflow(xwf_models.Workflow):
+    states = (
+        ('pending', u"En attente"),
+        ('enabled', u"Actif"),
+        ('removed', u"Supprimé"),
+    )
+    transitions = (
+        ('accept', ['pending'], 'enabled'),
+        ('remove', ['pending', 'enabled'], 'removed'),
+    )
+    initial_state = 'pending'
+
+    log_model = ''  # We don't want logs
+
+
+class XGroup(models.Model):
+    """A model for an XGroup."""
+    KIND_PROMO = 'promo'
+    KIND_GROUP = 'group'
+    KIND_BINET = 'binet'
+    KIND_INSTIT = 'instit'
+
+    KIND_CHOICES = (
+        (KIND_PROMO, u"Promo"),
+        (KIND_GROUP, u"Groupe"),
+        (KIND_BINET, u"Binet"),
+        (KIND_INSTIT, u"Institution"),
+    )
+
+    DOMAIN_HISTORY = 'history'
+    DOMAIN_INTERNATIONAL = 'international'
+    DOMAIN_EVENTS = 'events'
+    DOMAIN_LEISURE = 'leisure'
+    DOMAIN_SPORTS = 'sports'
+    DOMAIN_PRO = 'pro'
+    DOMAIN_REGION = 'region'
+
+    DOMAIN_CHOICES = (
+        (DOMAIN_HISTORY, u"Histoire"),
+        (DOMAIN_INTERNATIONAL, u"International"),
+        (DOMAIN_EVENTS, u"Événements"),
+        (DOMAIN_LEISURE, u"Loisirs"),
+        (DOMAIN_SPORTS, u"Sports"),
+        (DOMAIN_PRO, u"Pro"),
+        (DOMAIN_REGION, u"Région"),
+    )
+
+    name = models.CharField(max_length=100, verbose_name=u"nom", unique=True)
+    short = models.SlugField(max_length=10, verbose_name=u"nom court", unique=True)
+    kind = models.CharField(max_length=10, choices=KIND_CHOICES, verbose_name=u"type")
+    domain = models.CharField(max_length=20, choices=DOMAIN_CHOICES, verbose_name=u"domaine")
+
+    dns = models.CharField(max_length=128, verbose_name=u"dns domain", blank=True)
+
+    class Meta:
+        verbose_name = u"group"
+        verbose_name_plural = u"groups"
+
+
+class Account(auth_models.AbstractUser):
+    xgroups = models.ManyToManyField(
+        XGroup, related_name='users', through='Membership', verbose_name=u"groupes")
+
+
+class Membership(xwf_models.WorkflowEnabled, models.Model):
+    LEVEL_MEMBER = 0
+    LEVEL_ADMIN = 10
+    LEVEL_CHOICES = (
+        (LEVEL_MEMBER, u"membre"),
+        (LEVEL_ADMIN, u"administrateur"),
+    )
+
+    xgroup = models.ForeignKey(XGroup, related_name='memberships', verbose_name=u"groupe")
+    xuser = models.ForeignKey(Account, related_name='memberships', verbose_name=u"utilisateur")
+
+    level = models.IntegerField(choices=LEVEL_CHOICES, default=LEVEL_MEMBER, verbose_name=u"droits")
+    state = xwf_models.StateField(MembershipWorkflow, verbose_name=u"état")