Commit 45e637d1 authored by Hamza Dely's avatar Hamza Dely
Browse files

[comptes/serializers] Fusionne AdherentCreationSerializer et AdherentSierializer

parent a3d437cf
......@@ -2,19 +2,11 @@
Sérialiseurs de l'app « Comptes »
"""
from datetime import timedelta
from django.db import transaction
from django.contrib.auth.models import Permission
from django.contrib.auth.password_validation import validate_password
from django.utils import timezone
from django.contrib.auth.password_validation import validate_password as django_validate_password
from rest_framework import serializers
from note_kfet.mixins import DynamicFieldsMixin
from note_kfet.droits import Acl
from note_kfet.environnement import ACCREDITATIONS_DEFAUT
from comptes.models import (
Section, Alias, Historique, Droit, Accreditation, Adhesion, Adherent
)
......@@ -79,20 +71,57 @@ class AliasSerializer(serializers.ModelSerializer):
### Sérialiseurs pour le modèle Adhérent
class AdherentCreationSerializer(serializers.ModelSerializer):
class AdherentSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
"""
Sérialiseur pour le modèle Adhérent conçu pour
l'inscription de nouveaux adhérents.
Sérialiseur pour le modèle Adhérent
"""
password = serializers.CharField()
accreditations = AccreditationSerializer(many=True, read_only=True, fields=['droit', 'meta'])
aliases = AliasSerializer(many=True, read_only=True)
adhesions = AdhesionSerializer(many=True, read_only=True)
last_adhesion = AdhesionSerializer(read_only=True)
section = serializers.CharField(max_length=10)
class Meta:
model = Adherent
fields = [
'pseudo', 'nom', 'prenom', 'email', 'password',
'sexe', 'type', 'telephone', 'adresse', 'remunere',
'pbsante', 'remarque', 'section',
'id', 'pseudo', 'nom', 'prenom', 'email', 'sexe',
'type', 'telephone', 'adresse', 'remunere', 'pbsante', 'remarque',
'supprime', 'is_staff', 'is_active', 'aliases', 'adhesions', 'last_adhesion',
'accreditations', 'password', 'section',
]
read_only_fields = ['id']
extra_kwargs = {'password': {'write_only': True}}
def validate_section(self, value):
"""
Vérifie que la section demandée n'est pas fermée
"""
qs = Section.objects.filter(sigle=value)
if not qs.exists():
raise serializers.ValidationError("Cette section n'existe pas")
elif qs.get().ferme:
raise serializers.ValidationError("Cette section est fermée.")
else:
return value
def validate_pseudo(self, value):
"""
Vérifie que le pseudo demandé n'est pas déjà pris
"""
pseudo = Adherent.normalize_username(value)
qs = Alias.objects.filter(alias=pseudo)
if not self.instance and qs.filter(proprietaire__isnull=False).exists():
raise serializers.ValidationError("Le pseudo %s est déjà pris." % pseudo)
elif self.instance and not qs.filter(proprietaire=self.instance).exists():
raise serializers.ValidationError("%s n'est pas l'un de vos aliases" % pseudo)
else:
return pseudo
def validate_password(self, value):
"""
Vérifie que le mot de passe fourni répond aux exigences imposées
"""
django_validate_password(value)
return value
def validate(self, data):
"""
......@@ -100,26 +129,6 @@ class AdherentCreationSerializer(serializers.ModelSerializer):
la section du nouvel adhérent n'est pas fermée et que le
formulaire est complet relativement au type de compte.
"""
pseudo = Adherent.normalize_username(data['pseudo'])
qs = Alias.objects.filter(alias=pseudo)
if qs.filter(proprietaire__isnull=False).exists():
self.add_error(
'pseudo',
serializers.ValidationError(
"Le pseudo %s est déjà pris." % data['pseudo']
),
)
try:
if Section.objects.get(sigle=data['section']).ferme:
self.add_error(
'section',
serializers.ValidationError("Cette section est fermée."),
)
except Section.objects.DoesNotExist:
self.add_error(
'section',
serializers.ValidationError("Cette section n'existe pas"),
)
if data['type'] != Adherent.DEBIT and not data.get('nom', ''):
self.add_error(
'nom',
......@@ -130,61 +139,5 @@ class AdherentCreationSerializer(serializers.ModelSerializer):
'prenom',
serializers.ValidationError("Veuillez rensigner votre prénom."),
)
try:
validate_password(data['password'])
except serializers.ValidationError as e:
self.add_error('password', e)
return data
def create(self, validated_data):
"""
Crée l'adhérent, l'alias allant avec le pseudo, l'historique
associé, l'adhésion qui va avec et met en place les droits de
base pour le type de compte demandé.
Toute l'opération est effectuée de manière atomique dans
la base de données.
"""
with transaction.atomic():
section = validated_data.pop('section')
print(section)
adh = Adherent(**validated_data)
adh.set_password(validated_data['password'])
adh.save()
pseudo, _ = Alias.objects.get_or_create(alias=adh.pseudo)
pseudo.proprietaire = adh
pseudo.save()
Historique.objects.create(alias=pseudo, suivant=adh)
Adhesion.objects.create(
adherent=adh,
fin=timezone.now() + timedelta(days=365),
section=Section.objects.get(sigle=section),
)
for codename, acl, meta in DROITS_DEFAUT.get(adh.type, []):
perm = Permission.objects.get(codename=codename)
Attribution.objects.create(
adherent=adh,
droit=perm,
accreditation=Accreditation.objects.get(droit=perm, niveau=acl),
meta=meta,
)
return adh
class AdherentSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
"""
Sérialiseur pour le modèle Adhérent
"""
accreditations = AccreditationSerializer(many=True, read_only=True, fields=['droit', 'meta'])
aliases = AliasSerializer(many=True, read_only=True)
adhesions = AdhesionSerializer(many=True, read_only=True)
last_adhesion = AdhesionSerializer(read_only=True)
class Meta:
model = Adherent
fields = [
'id', 'pseudo', 'nom', 'prenom', 'email', 'sexe',
'type', 'telephone', 'adresse', 'remunere', 'pbsante', 'remarque',
'supprime', 'is_staff', 'is_active', 'aliases', 'adhesions', 'last_adhesion',
'accreditations',
]
read_only_fields = ['id']
......@@ -46,8 +46,7 @@ from comptes.forms import (
)
from comptes.filters import AdherentRechercheFilter
from comptes.serializers import (
AdherentCreationSerializer, AdherentSerializer, AliasSerializer,
AccreditationSerializer,
AdherentSerializer, AliasSerializer, AccreditationSerializer,
)
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
......@@ -623,23 +622,22 @@ class AdherentViewSet(viewsets.GenericViewSet):
- être envoyées via un requête POST
- ne contenir que des champs indiqués en réponse à une requête OPTIONS
"""
if not request.user.has_perm("comptes.adherent_inscrire", Acl.BASIQUE):
raise PermissionDenied
fields = [
'pseudo', 'nom', 'prenom', 'email', 'password', 'sexe', 'type',
'telephone', 'adresse', 'remunere', 'pbsante', 'remarque', 'section',
]
serializer = AdherentCreationSerializer(data=request.data)
serializer = self.get_serializer(data=request.data, fields=fields)
if not serializer.is_valid():
return Response(
{"detail" : serializer.errors},
status=status.HTTP_400_BAD_REQUEST,
)
if (serializer.validated_data['type'] == Adherent.DEBIT
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif (serializer.validated_data['type'] == Adherent.DEBIT
and request.user.has_perm("comptes.adherent_inscrire", Acl.TOTAL)):
pass
elif (serializer.validated_data['type'] in [Adherent.CLUB, Adherent.SECTION]
and request.user.has_perm("comptes.adherent_inscrire", Acl.ETENDU)):
pass
elif serializer.validated_data['type'] == Adherent.PERSONNE:
elif (serializer.validated_data['type'] == Adherent.PERSONNE
and request.user.has_perm("comptes.adherent_inscrire", Acl.BASIQUE)):
pass
else:
return Response(
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment