From: Raphaël Barrois Date: Fri, 29 Mar 2013 22:33:24 +0000 (+0100) Subject: Move xnet/accounts to xnet/groups X-Git-Url: http://git.polytechnique.org/?p=xnet;a=commitdiff_plain;h=95fa5c138ee65686c6dd142b45f87183b0397f30 Move xnet/accounts to xnet/groups --- diff --git a/Makefile b/Makefile index c972b0d..e463792 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,9 @@ resetdb: rm -f xnet/db.sqlite $(MANAGE_PY) syncdb --noinput +clean: + find . "(" -name "*.pyc" -or -name "*.pyo" -or -name "*.mo" ")" -delete + find . -type d -empty -delete doc: $(MAKE) -C doc html diff --git a/xnet/accounts/admin.py b/xnet/accounts/admin.py index 41cf797..1a7fc52 100644 --- a/xnet/accounts/admin.py +++ b/xnet/accounts/admin.py @@ -4,26 +4,10 @@ from django.contrib.auth import admin as auth_admin from . import models -class XGroupAdmin(admin.ModelAdmin): - list_display = ['short', 'name', 'kind', 'domain', 'dns'] - list_filter = ['kind', 'domain'] - search_fields = ['name', 'short', 'dns'] - -admin.site.register(models.XGroup, XGroupAdmin) - - class AccountAdmin(auth_admin.UserAdmin): pass admin.site.register(models.Account, AccountAdmin) -class MembershipAdmin(admin.ModelAdmin): - list_display = ['xuser', 'xgroup', 'level'] - list_filter = ['level'] - search_fields = ( - ['xgroup__{0}'.format(field) for field in XGroupAdmin.search_fields] - + ['offer__{0}'.format(field) for field in AccountAdmin.search_fields]) - -admin.site.register(models.Membership, MembershipAdmin) admin.site.unregister(auth_admin.Group) diff --git a/xnet/accounts/factories.py b/xnet/accounts/factories.py index de56d20..5844d0e 100644 --- a/xnet/accounts/factories.py +++ b/xnet/accounts/factories.py @@ -1,49 +1,19 @@ # -*- coding: utf-8 -*- -from django.contrib.webdesign import lorem_ipsum import factory from . import models -class XGroupFactory(factory.DjangoModelFactory): - FACTORY_FOR = models.XGroup - - name = factory.Sequence(lambda n: u"Groupe n°%s" % n) - short = factory.Sequence(lambda n: u"Groupe%s" % n) - kind = factory.InfiniteIterator(k[0] for k in models.XGroup.KIND_CHOICES) - domain = models.XGroup.DOMAIN_REGION - web = u"http://google.fr" - description = factory.LazyAttribute(lambda _: lorem_ipsum.paragraph()) - - class AccountFactory(factory.DjangoModelFactory): FACTORY_FOR = models.Account username = factory.Sequence('mr_robinson{0}'.format) first_name = u"John" last_name = factory.Sequence(lambda n: u"D%se" % ((n % 10) * u"o"), type=int) - password = None + password = factory.PostGenerationMethodCall('set_password', '') is_staff = True - @classmethod - def _prepare(cls, create, **kwargs): - password = kwargs.pop('password', None) - user = super(AccountFactory, cls)._prepare(create, **kwargs) - if password is not None: - user.set_password(password) - if create: - user.save() - return user - class SuperAccountFactory(AccountFactory): is_superuser = True - - -class MembershipFactory(factory.DjangoModelFactory): - FACTORY_FOR = models.Membership - - xgroup = factory.SubFactory(XGroupFactory) - xuser = factory.SubFactory(AccountFactory) - state = models.MembershipWorkflow.states.enabled diff --git a/xnet/accounts/models.py b/xnet/accounts/models.py index 2deb4ed..588651e 100644 --- a/xnet/accounts/models.py +++ b/xnet/accounts/models.py @@ -8,76 +8,7 @@ from django_xworkflows import models as xwf_models from xnet.utils.images.fields import ImageWithThumbsField as ImageField -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, blank=True, verbose_name=u"domaine") - - dns = models.CharField(max_length=128, verbose_name=u"dns domain", blank=True) - - web = models.CharField(max_length=255, verbose_name=u"website", blank=True) - #contact = models.ForeignKey('Account') - description = models.TextField(blank=True) - logo = ImageField(upload_to='logos', null=True, blank=True) - - class Meta: - verbose_name = u"groupe" - verbose_name_plural = u"groupes" - - def __unicode__(self): - return self.name - - class Account(auth_models.AbstractUser): - xgroups = models.ManyToManyField( - XGroup, related_name='users', through='Membership', verbose_name=u"groupes") class Meta: verbose_name = u"utilisateur" @@ -85,26 +16,3 @@ class Account(auth_models.AbstractUser): def __unicode__(self): return self.username - - -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") - - class Meta: - verbose_name = u"adhérent" - verbose_name_plural = u"adhérents" - unique_together = ['xgroup', 'xuser'] - - def __unicode__(self): - return u"{} {} de {} [{}]".format(self.xuser, self.get_level_display(), self.xgroup, self.state) diff --git a/xnet/datasets/dev.py b/xnet/datasets/dev.py index 27221fb..8a9e881 100644 --- a/xnet/datasets/dev.py +++ b/xnet/datasets/dev.py @@ -2,8 +2,8 @@ from . import BaseSetup -from xnet.accounts import factories as accounts_factories -from xnet.accounts import models as accounts_models +from xnet.groups import factories as groups_factories +from xnet.groups import models as groups_models class Setup(BaseSetup): @@ -12,42 +12,42 @@ class Setup(BaseSetup): self.setup_groups() def setup_groups(self): - accounts_factories.XGroupFactory( + groups_factories.XGroupFactory( name='Polytechnique.org', short='xorg', - kind=accounts_models.XGroup.KIND_INSTIT, + kind=groups_models.XGroup.KIND_INSTIT, domain='', web='https://www.polytechnique.org/', ) - accounts_factories.XGroupFactory( + groups_factories.XGroupFactory( name='AX', short='ax', - kind=accounts_models.XGroup.KIND_INSTIT, + kind=groups_models.XGroup.KIND_INSTIT, domain='', web='https://www.polytechniciens.com/', ) - accounts_factories.XGroupFactory( + groups_factories.XGroupFactory( name='École polytechnique', short='ecole', - kind=accounts_models.XGroup.KIND_INSTIT, + kind=groups_models.XGroup.KIND_INSTIT, domain='', web='https://www.polytechnique.edu/', ) - accounts_factories.XGroupFactory( + groups_factories.XGroupFactory( name='FaëriX', short='faerix', - kind=accounts_models.XGroup.KIND_BINET, - domain=accounts_models.XGroup.DOMAIN_LEISURE, + kind=groups_models.XGroup.KIND_BINET, + domain=groups_models.XGroup.DOMAIN_LEISURE, web='http://www.faerix.net/', ) - accounts_factories.XGroupFactory( + groups_factories.XGroupFactory( name="Bal de l'X", short='bal', - kind=accounts_models.XGroup.KIND_BINET, - domain=accounts_models.XGroup.DOMAIN_EVENTS, + kind=groups_models.XGroup.KIND_BINET, + domain=groups_models.XGroup.DOMAIN_EVENTS, web='https://www.baldelx.com/', ) diff --git a/xnet/events/models.py b/xnet/events/models.py index ae2f08a..e8889e0 100644 --- a/xnet/events/models.py +++ b/xnet/events/models.py @@ -4,7 +4,8 @@ from django.utils.translation import ugettext_lazy as _ from django_xworkflows import models as xwf_models -import xnet.accounts.models as accounts_models +from xnet.accounts import models as accounts_models +from xnet.groups import models as groups_models class Event(models.Model): NOTIFICATION_RECIPIENT_CREATOR = 'creator' @@ -23,7 +24,7 @@ class Event(models.Model): help_text=_(u"Texte court utilisé dans les URLs.")) main_description = models.OneToOneField('events.EventPart', null=True, blank=True, verbose_name=_(u"description principale"), related_name='+') - group = models.ForeignKey(accounts_models.XGroup, verbose_name=_(u"groupe"), related_name='events') + group = models.ForeignKey(groups_models.XGroup, verbose_name=_(u"groupe"), related_name='events') creator = models.ForeignKey(accounts_models.Account, verbose_name=_(u"créateur"), related_name='created_events') simple = models.BooleanField(verbose_name=_(u"simple"), help_text=_(u"Un événement simple a un seul composant. Permet une mise en page plus légère.")) diff --git a/xnet/groups/__init__.py b/xnet/groups/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/xnet/groups/admin.py b/xnet/groups/admin.py new file mode 100644 index 0000000..81e229b --- /dev/null +++ b/xnet/groups/admin.py @@ -0,0 +1,22 @@ +from django.contrib import admin + +from xnet.accounts import admin as accounts_admin + +from . import models + +class XGroupAdmin(admin.ModelAdmin): + list_display = ['short', 'name', 'kind', 'domain', 'dns'] + list_filter = ['kind', 'domain'] + search_fields = ['name', 'short', 'dns'] + +admin.site.register(models.XGroup, XGroupAdmin) + + +class MembershipAdmin(admin.ModelAdmin): + list_display = ['xuser', 'xgroup', 'level'] + list_filter = ['level'] + search_fields = ( + ['xgroup__{0}'.format(field) for field in XGroupAdmin.search_fields] + + ['offer__{0}'.format(field) for field in accounts_admin.AccountAdmin.search_fields]) + +admin.site.register(models.Membership, MembershipAdmin) diff --git a/xnet/accounts/context_processors.py b/xnet/groups/context_processors.py similarity index 100% rename from xnet/accounts/context_processors.py rename to xnet/groups/context_processors.py diff --git a/xnet/accounts/decorators.py b/xnet/groups/decorators.py similarity index 100% rename from xnet/accounts/decorators.py rename to xnet/groups/decorators.py diff --git a/xnet/groups/factories.py b/xnet/groups/factories.py new file mode 100644 index 0000000..a8e8d5d --- /dev/null +++ b/xnet/groups/factories.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +from django.contrib.webdesign import lorem_ipsum + +import factory + +from xnet.accounts import factories as accounts_factories + +from . import models + + +class XGroupFactory(factory.DjangoModelFactory): + FACTORY_FOR = models.XGroup + + name = factory.Sequence(lambda n: u"Groupe n°%s" % n) + short = factory.Sequence(lambda n: u"Groupe%s" % n) + kind = factory.InfiniteIterator(k[0] for k in models.XGroup.KIND_CHOICES) + domain = models.XGroup.DOMAIN_REGION + web = u"http://google.fr" + description = factory.LazyAttribute(lambda _: lorem_ipsum.paragraph()) + + +class MembershipFactory(factory.DjangoModelFactory): + FACTORY_FOR = models.Membership + + xgroup = factory.SubFactory(XGroupFactory) + xuser = factory.SubFactory(accounts_factories.AccountFactory) + state = models.MembershipWorkflow.states.enabled + diff --git a/xnet/accounts/middleware.py b/xnet/groups/middleware.py similarity index 100% rename from xnet/accounts/middleware.py rename to xnet/groups/middleware.py diff --git a/xnet/groups/models.py b/xnet/groups/models.py new file mode 100644 index 0000000..e275c18 --- /dev/null +++ b/xnet/groups/models.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- + +from django.db import models + +from django_xworkflows import models as xwf_models + +from xnet.accounts import models as accounts_models +from xnet.utils.images.fields import ImageWithThumbsField as ImageField + +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, blank=True, verbose_name=u"domaine") + + dns = models.CharField(max_length=128, verbose_name=u"dns domain", blank=True) + + web = models.CharField(max_length=255, verbose_name=u"website", blank=True) + #contact = models.ForeignKey('Account') + description = models.TextField(blank=True) + logo = ImageField(upload_to='logos', null=True, blank=True) + + members = models.ManyToManyField(accounts_models.Account, + related_name='xgroups', through='Membership', verbose_name=u"membres") + + class Meta: + verbose_name = u"groupe" + verbose_name_plural = u"groupes" + + def __unicode__(self): + return self.name + + +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(accounts_models.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") + + class Meta: + verbose_name = u"adhérent" + verbose_name_plural = u"adhérents" + unique_together = ['xgroup', 'xuser'] + + def __unicode__(self): + return u"{} {} de {} [{}]".format(self.xuser, self.get_level_display(), self.xgroup, self.state) diff --git a/xnet/accounts/templates/accounts/base.html b/xnet/groups/templates/groups/base.html similarity index 66% rename from xnet/accounts/templates/accounts/base.html rename to xnet/groups/templates/groups/base.html index 14db8a8..d25db9e 100644 --- a/xnet/accounts/templates/accounts/base.html +++ b/xnet/groups/templates/groups/base.html @@ -4,17 +4,17 @@ {% block sidebar %} {% if group %}

{{ group }}

{% endif %} diff --git a/xnet/accounts/templates/accounts/directory.html b/xnet/groups/templates/groups/directory.html similarity index 93% rename from xnet/accounts/templates/accounts/directory.html rename to xnet/groups/templates/groups/directory.html index f331954..4dac21e 100644 --- a/xnet/accounts/templates/accounts/directory.html +++ b/xnet/groups/templates/groups/directory.html @@ -1,4 +1,4 @@ -{% extends "accounts/base.html" %} +{% extends "groups/base.html" %} {% load static %} {% block content %} @@ -49,7 +49,7 @@ {% if is_admin %} - + {% endif %} diff --git a/xnet/accounts/templates/accounts/home.html b/xnet/groups/templates/groups/home.html similarity index 93% rename from xnet/accounts/templates/accounts/home.html rename to xnet/groups/templates/groups/home.html index dacc3dc..5876512 100644 --- a/xnet/accounts/templates/accounts/home.html +++ b/xnet/groups/templates/groups/home.html @@ -1,4 +1,4 @@ -{% extends "accounts/base.html" %} +{% extends "groups/base.html" %} {% block content %}
diff --git a/xnet/accounts/templates/accounts/index.html b/xnet/groups/templates/groups/index.html similarity index 89% rename from xnet/accounts/templates/accounts/index.html rename to xnet/groups/templates/groups/index.html index 082e649..6e6d0d4 100644 --- a/xnet/accounts/templates/accounts/index.html +++ b/xnet/groups/templates/groups/index.html @@ -1,4 +1,4 @@ -{% extends "accounts/base.html" %} +{% extends "groups/base.html" %} {% block js %}