From fa3aca906f0cc10d4bb6f8e2f2a26edbd5899f8e Mon Sep 17 00:00:00 2001 From: grisel-davy Date: Thu, 30 Aug 2018 17:25:15 +0200 Subject: [PATCH 1/6] =?UTF-8?q?Les=20nouveau=20users=20ne=20sont=20pas=20a?= =?UTF-8?q?dh=C3=A9rents=20et=20n'ont=20pas=20de=20home?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/views.py | 2 +- cotisations/models.py | 8 ++++++++ users/migrations/0077_auto_20180824_1750.py | 20 ++++++++++++++++++++ users/models.py | 6 ++++-- users/templates/users/profil.html | 11 +++++++---- 5 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 users/migrations/0077_auto_20180824_1750.py diff --git a/api/views.py b/api/views.py index 0f6301bc..e9528622 100644 --- a/api/views.py +++ b/api/views.py @@ -421,7 +421,7 @@ class UserViewSet(viewsets.ReadOnlyModelViewSet): class HomeCreationViewSet(viewsets.ReadOnlyModelViewSet): """Exposes infos of `users.models.Users` objects to create homes. """ - queryset = users.User.objects.all() + queryset = users.User.objects.filter(state = 0) serializer_class = serializers.HomeCreationSerializer class ClubViewSet(viewsets.ReadOnlyModelViewSet): diff --git a/cotisations/models.py b/cotisations/models.py index fe89aa5d..06791f89 100644 --- a/cotisations/models.py +++ b/cotisations/models.py @@ -243,6 +243,9 @@ def facture_post_save(**kwargs): """ facture = kwargs['instance'] user = facture.user + if facture.valid and facture.vente_set.filter(Q(type_cotisation='All') | Q(type_cotisation='Adhesion')).exists(): + user.state = 0 + user.save() user.ldap_sync(base=False, access_refresh=True, mac_refresh=False) @@ -473,6 +476,11 @@ def vente_post_save(**kwargs): purchase.cotisation.save() user = purchase.facture.user user.ldap_sync(base=False, access_refresh=True, mac_refresh=False) + if purchase.facture.valid and (purchase.type_cotisation == 'All' or purchase.type_cotisation == 'Adhesion'): + user = purchase.facture.user + if user.state == 3: + user.state = 0 + user.save() # TODO : change vente to purchase diff --git a/users/migrations/0077_auto_20180824_1750.py b/users/migrations/0077_auto_20180824_1750.py new file mode 100644 index 00000000..b9510257 --- /dev/null +++ b/users/migrations/0077_auto_20180824_1750.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-08-24 15:50 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0076_auto_20180818_1321'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='state', + field=models.IntegerField(choices=[(0, 'STATE_ACTIVE'), (1, 'STATE_DISABLED'), (2, 'STATE_ARCHIVE'), (3, 'STATE_NOT_YET_ACTIVE')], default=3), + ), + ] diff --git a/users/models.py b/users/models.py index de342031..3e6128a3 100755 --- a/users/models.py +++ b/users/models.py @@ -186,10 +186,12 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, STATE_ACTIVE = 0 STATE_DISABLED = 1 STATE_ARCHIVE = 2 + STATE_NOT_YET_ACTIVE = 3 STATES = ( (0, 'STATE_ACTIVE'), (1, 'STATE_DISABLED'), (2, 'STATE_ARCHIVE'), + (3, 'STATE_NOT_YET_ACTIVE'), ) surname = models.CharField(max_length=255) @@ -231,7 +233,7 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, blank=True ) pwd_ntlm = models.CharField(max_length=255) - state = models.IntegerField(choices=STATES, default=STATE_ACTIVE) + state = models.IntegerField(choices=STATES, default=STATE_NOT_YET_ACTIVE) registered = models.DateTimeField(auto_now_add=True) telephone = models.CharField(max_length=15, blank=True, null=True) uid_number = models.PositiveIntegerField( @@ -329,7 +331,7 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, @property def is_active(self): """ Renvoie si l'user est à l'état actif""" - return self.state == self.STATE_ACTIVE + return self.state == self.STATE_ACTIVE or self.state == self.STATE_NOT_YET_ACTIVE @property def is_staff(self): diff --git a/users/templates/users/profil.html b/users/templates/users/profil.html index 0f4f8b2c..76b3daeb 100644 --- a/users/templates/users/profil.html +++ b/users/templates/users/profil.html @@ -211,11 +211,14 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endif %} {% trans "State" %} {% if users.state == 0 %} - {% trans "Active" %} + {% trans "Active" %} {% elif users.state == 1 %} - {% trans "Disabled" %} - {% else %} - {% trans "Archived" %} + {% trans "Disabled" %} + {% elif users.state == 2 %} + {% trans "Archived" %} + {% elif users.state == 3 %} + {% trans "Not yet Member" %} + {% endif %} From 5ab8bb4f0ec2685a421f35e656809d0930f28ea2 Mon Sep 17 00:00:00 2001 From: grisel-davy Date: Thu, 30 Aug 2018 23:08:23 +0200 Subject: [PATCH 2/6] Empeche la syncronisation ldap pour les users_not_yet_member --- users/models.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/users/models.py b/users/models.py index 3e6128a3..d73d5b98 100755 --- a/users/models.py +++ b/users/models.py @@ -563,10 +563,11 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, try: user_ldap = LdapUser.objects.get(uidNumber=self.uid_number) except LdapUser.DoesNotExist: - user_ldap = LdapUser(uidNumber=self.uid_number) - base = True - access_refresh = True - mac_refresh = True + if self.state != 3: + user_ldap = LdapUser(uidNumber=self.uid_number) + base = True + access_refresh = True + mac_refresh = True if base: user_ldap.name = self.pseudo user_ldap.sn = self.pseudo From 0ffdde5a6a5af991c5e67aa93fce68c0e0663628 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Fri, 31 Aug 2018 13:26:54 +0200 Subject: [PATCH 3/6] Cree une fonction pour set active les utilisateurs cotisant --- api/views.py | 3 ++- cotisations/models.py | 14 ++++---------- users/models.py | 8 ++++++++ 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/api/views.py b/api/views.py index e9528622..d117057a 100644 --- a/api/views.py +++ b/api/views.py @@ -29,6 +29,7 @@ the response (JSON or other), the CSRF exempting, ... import datetime from django.conf import settings +from django.db.models import Q from rest_framework.authtoken.views import ObtainAuthToken from rest_framework.authtoken.models import Token from rest_framework.response import Response @@ -421,7 +422,7 @@ class UserViewSet(viewsets.ReadOnlyModelViewSet): class HomeCreationViewSet(viewsets.ReadOnlyModelViewSet): """Exposes infos of `users.models.Users` objects to create homes. """ - queryset = users.User.objects.filter(state = 0) + queryset = users.User.objects.exclude(Q(state=User.STATE_DISABLED) | Q(state=User.STATE_NOT_YET_ACTIVE)) serializer_class = serializers.HomeCreationSerializer class ClubViewSet(viewsets.ReadOnlyModelViewSet): diff --git a/cotisations/models.py b/cotisations/models.py index 06791f89..8734c17c 100644 --- a/cotisations/models.py +++ b/cotisations/models.py @@ -243,10 +243,8 @@ def facture_post_save(**kwargs): """ facture = kwargs['instance'] user = facture.user - if facture.valid and facture.vente_set.filter(Q(type_cotisation='All') | Q(type_cotisation='Adhesion')).exists(): - user.state = 0 - user.save() - user.ldap_sync(base=False, access_refresh=True, mac_refresh=False) + user.set_active() + user.ldap_sync(base=True, access_refresh=True, mac_refresh=False) @receiver(post_delete, sender=Facture) @@ -475,12 +473,8 @@ def vente_post_save(**kwargs): purchase.create_cotis() purchase.cotisation.save() user = purchase.facture.user - user.ldap_sync(base=False, access_refresh=True, mac_refresh=False) - if purchase.facture.valid and (purchase.type_cotisation == 'All' or purchase.type_cotisation == 'Adhesion'): - user = purchase.facture.user - if user.state == 3: - user.state = 0 - user.save() + user.set_active() + user.ldap_sync(base=True, access_refresh=True, mac_refresh=False) # TODO : change vente to purchase diff --git a/users/models.py b/users/models.py index d73d5b98..212754e2 100755 --- a/users/models.py +++ b/users/models.py @@ -333,6 +333,14 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, """ Renvoie si l'user est à l'état actif""" return self.state == self.STATE_ACTIVE or self.state == self.STATE_NOT_YET_ACTIVE + def set_active(self): + """Enable this user if he subscribed successfully one time before + Active l'utilisateur définitivement si il a adhéré au moins une fois""" + if self.state == self.STATE_NOT_YET_ACTIVE: + if self.facture_set.filter(valid=True).filter(Q(vente__type_cotisation='All') | Q(vente__type_cotisation='Adhesion')).exists(): + self.state = self.STATE_ACTIVE + self.save() + @property def is_staff(self): """ Fonction de base django, renvoie si l'user est admin""" From 48773668d1e3d35b8b220e7704993adb95ee0524 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Fri, 31 Aug 2018 13:35:33 +0200 Subject: [PATCH 4/6] No harcoded var --- users/models.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/users/models.py b/users/models.py index 212754e2..9c4f5f4e 100755 --- a/users/models.py +++ b/users/models.py @@ -571,11 +571,13 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, try: user_ldap = LdapUser.objects.get(uidNumber=self.uid_number) except LdapUser.DoesNotExist: - if self.state != 3: - user_ldap = LdapUser(uidNumber=self.uid_number) - base = True - access_refresh = True - mac_refresh = True + # Freshly created users are NOT synced in ldap base + if self.state == self.STATE_NOT_YET_ACTIVE: + return + user_ldap = LdapUser(uidNumber=self.uid_number) + base = True + access_refresh = True + mac_refresh = True if base: user_ldap.name = self.pseudo user_ldap.sn = self.pseudo From ea78da87e0cb6021a75e2f2908a0f5309ce0b0be Mon Sep 17 00:00:00 2001 From: chirac Date: Fri, 31 Aug 2018 13:37:08 +0200 Subject: [PATCH 5/6] Que en anglais docstring models.py --- users/models.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/users/models.py b/users/models.py index 9c4f5f4e..41090ab1 100755 --- a/users/models.py +++ b/users/models.py @@ -334,8 +334,7 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, return self.state == self.STATE_ACTIVE or self.state == self.STATE_NOT_YET_ACTIVE def set_active(self): - """Enable this user if he subscribed successfully one time before - Active l'utilisateur définitivement si il a adhéré au moins une fois""" + """Enable this user if he subscribed successfully one time before""" if self.state == self.STATE_NOT_YET_ACTIVE: if self.facture_set.filter(valid=True).filter(Q(vente__type_cotisation='All') | Q(vente__type_cotisation='Adhesion')).exists(): self.state = self.STATE_ACTIVE From ded8f89ba824bb9fc0faf07ef21f4038c3f1322e Mon Sep 17 00:00:00 2001 From: Hugo LEVY-FALK Date: Fri, 31 Aug 2018 22:25:38 +0200 Subject: [PATCH 6/6] =?UTF-8?q?Fix=20couleurs=20du=20texte=20pour=20l'?= =?UTF-8?q?=C3=A9tat=20'actif'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- users/templates/users/profil.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/users/templates/users/profil.html b/users/templates/users/profil.html index 76b3daeb..e0868247 100644 --- a/users/templates/users/profil.html +++ b/users/templates/users/profil.html @@ -52,7 +52,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {% elif not users.has_access %}