Commit 5a4d9c55 authored by Hamza Dely's avatar Hamza Dely
Browse files

[comptes/views] Réécriture du code de l'API pour changer les mots de passe

parent f07f8d58
......@@ -143,3 +143,13 @@ class AdherentSerializer(mixins.DynamicFieldsMixin, serializers.ModelSerializer)
)
return data
def update(self, instance, validated_data):
"""
Mets à jour un adhérent.
Cette méthode est surchargée pour gérer le cas d'un changement de mot de passe.
"""
new_password = validated_data.pop('password', '')
if new_password:
instance.set_password(new_password)
super().update(instance, validated_data)
......@@ -389,42 +389,48 @@ class AdherentViewSet(viewsets.GenericViewSet):
Les données doivent :
- être envoyées via une requête PATCH
- contenir le nouveau mot de passe dans le paramètre 'password'
- Si l'adhérent n'est pas suffisamment accrédité, il doit également
fournir l'ancien mot de passe dans le champ 'old_password'
"""
if not request.user.has_perm("comptes.adherent_change_pw", Acl.LIMITE):
raise PermissionDenied
old_pass = request.data.get('old_password', '')
password = request.data.get('password', '')
target_user = self.get_object()
if not isinstance(request.data.get('password', None), str):
if (request.user.has_perm("comptes.adherent_change_pw", Acl.LIMITE)
and request.user.id == target_user.id):
# Changement de son propre mot de passe en renseignant le précédent
need_old_pass = True
elif target_user.is_superuser:
# Personne ne peut changer le mot de passe d'un superutilisateur, mis
# à part lui même
return Response(
{"detail" : "Le mot de passe renseigné n'est pas valide"},
status=status.HTTP_400_BAD_REQUEST,
{"detail" : "Vous ne pouvez pas changer ce mot de passe"},
status=status.HTTP_403_FORBIDDEN,
)
if target_user.id == request.user.id:
# Changement de son propre mot de passe
pass
elif request.user.has_perm("comptes.adherent_change_pw", Acl.TOTAL):
# Changement de n'importe quel mot de passe sans renseigner le
# précédent
need_old_pass = False
elif (target_user.type == Adherent.PERSONNE
and request.user.has_perm("comptes.adherent_change_pw", Acl.ETENDU)):
# Changement du mot de passe d'une autre personne
pass
elif request.user.has_perm("comptes.adherent_change_pw", Acl.TOTAL):
# Changement du mot de passe d'un club/section/compte de débit
pass
need_old_pass = True
else:
# Pas suffisamment de droits pour changer un mot de passe
return Response(
{"detail" : "Vous n'avez pas les droits pour changer ce mot de passe"},
{"detail" : "Vous ne pouvez pas changer ce mot de passe"},
status=status.HTTP_403_FORBIDDEN,
)
try:
validate_password(request.data['password'], user=target_user)
except ValidationError as e:
# On vérifie l'ancien mot de passe
if need_old_pass and not target_user.check_password(old_pass):
return Response(
{"detail" : e.messages},
{"detail" : "Ancien mot de passe incorrect"},
status=status.HTTP_400_BAD_REQUEST,
)
target_user.set_password(request.data['password'])
target_user.save()
serializer = self.get_serializer(target_user, data=request.data, fields=['password'])
serializer.is_valid(raise_exception=True)
serializer.save()
return Response({}, status=status.HTTP_204_NO_CONTENT)
@detail_route(methods=['patch'])
......
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