Commit 69ec31a6 authored by Hamza Dely's avatar Hamza Dely

[comptes/views] Mise à jour des codes renvoyés par l'API

parent 9e790c73
......@@ -83,3 +83,28 @@ Installation
$ sudo service nginx reload
Vous pouvez ensuite essayer d'accéder à la note depuis votre navigateur.
API RESTful
-----------
La Note Kfet possède une API RESTful, utilisant Django REST Framework. Après l'envoi d'une requête, le serveur
renverra un code HTTP en fonction du résultat de la requête. Le sens des codes HTTP reçus est résumé dans le tableau
ci-dessous :
| Code HTTP | Signification |
| ------------------------------ | --------------------------- |
| 200 (*OK*) | Opération effectuée |
| 201 (*Created*) | L'objet a bien été créé |
| 204 (*No Content*) | L'objet a été bien supprimé |
| 304 (*Not Modified*) | L'objet n'a pas été modifié |
| 400 (*Bad Request*) | Données erronnées |
| 401 (*Unauthorized*) | Authentification requise |
| 403 (*Forbidden*) | Autorisation requise |
| 404 (*Not Found*) | Objet introuvable |
| 405 (*Method Not Allowed*) | Méthode non autorisée |
| 422 (*Unprocessable Entity*) | Données illisibles |
| 429 (*Too Many Requests*) | Débit des requêtes anormal |
| 500 (*Internal Server Error *) | Erreur interne |
En cas d'erreur, le serveur retournera également un message détaillant indiquant plus précisément
les raisons de l'erreur.
......@@ -431,7 +431,7 @@ class AdherentViewSet(viewsets.GenericViewSet):
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)
return Response({}, status=status.HTTP_200_OK)
@detail_route(methods=['patch'])
def status(self, request, pk=None):
......@@ -466,7 +466,7 @@ class AdherentViewSet(viewsets.GenericViewSet):
serializer.is_valid(raise_exception=True)
serializer.save()
return Response({}, status=status.HTTP_204_NO_CONTENT)
return Response({}, status=status.HTTP_200_OK)
def list(self, request):
"""
......@@ -482,21 +482,20 @@ class AdherentViewSet(viewsets.GenericViewSet):
user = request.user
fields = ['id', 'pseudo', 'nom', 'prenom', 'type', 'aliases', 'last_adhesion']
if not user.has_perm("comptes.adherent_chercher", Acl.BASIQUE):
raise PermissionDenied
return Response({}, status=status.HTTP_403_FORBIDDEN)
if "flags" not in request.query_params:
try:
data = request.query_params.dict()
flags = int(data.pop("flags"))
except KeyError:
return Response(
{'detail' : 'Drapeaux non renseignés'},
status=status.HTTP_400_BAD_REQUEST,
)
try:
data = request.query_params.dict()
flags = int(data["flags"])
del data["flags"]
except ValueError:
return Response(
{'detail' : 'Drapeau invalide "%s"' % data["flags"]},
status=status.HTTP_400_BAD_REQUEST,
status=status.HTTP_422_UNPROCESSABLE_ENTITY,
)
lookup_args = {}
......@@ -508,7 +507,10 @@ class AdherentViewSet(viewsets.GenericViewSet):
elif set(data.keys()) <= {'nom', 'prenom', 'pseudo', 'sexe', 'type', 'remunere'}:
# Plusieurs paramètres de recherche -> Recherche avancée
if not user.has_perm("comptes.adherent_chercher", Acl.ETENDU):
raise PermissionDenied
return Response(
{"detail" : "Vous ne pouvez pas effectuer de recherche avancée"},
status=status.HTTP_403_FORBIDDEN,
)
for key in {'nom', 'prenom', 'sexe', 'type'}:
if key in data:
......@@ -604,7 +606,7 @@ class AdherentViewSet(viewsets.GenericViewSet):
except DataError as e:
return Response(
{'detail' : 'La RegExp donnée doit être une RegExp PostgreSQL valide'},
status=status.HTTP_400_BAD_REQUEST,
status=status.HTTP_422_UNPROCESSABLE_ENTITY,
)
def create(self, request):
......@@ -701,17 +703,9 @@ class AdherentViewSet(viewsets.GenericViewSet):
)
serializer = self.get_serializer(target_user, data=request.data, partial=True, fields=fields)
if serializer.is_valid():
serializer.save()
return Response(
{'detail': "Modification effectuée avec succès"},
status=status.HTTP_204_NO_CONTENT,
)
else:
return Response(
serializer.errors,
status=status.HTTP_400_BAD_REQUEST,
)
serializer.is_valid(raise_exception=True):
serializer.save()
return Response({}, status=status.HTTP_200_OK)
def destroy(self, request, pk=None):
"""
......@@ -724,7 +718,7 @@ class AdherentViewSet(viewsets.GenericViewSet):
le compte.
"""
if not request.user.has_perm("comptes.adherent_supprimé", Acl.BASIQUE):
raise PermissionDenied
return Response({}, status=status.HTTP_403_FORBIDDEN)
target_user = self.get_object()
if target_user.id == request.user.id:
......@@ -743,7 +737,7 @@ class AdherentViewSet(viewsets.GenericViewSet):
if target_user.type != Adherent.PERSONNE and not request.user.has_perm("comptes.adherent_supprimer", Acl.ETENDU):
return Response(
{"detail" : "Vous n'avez pas le droit de supprimer ce type de compte"},
status=status.HTTP_400_BAD_REQUEST,
status=status.HTTP_403_FORBIDDEN,
)
if (not should_shred) or (should_shred and not request.user.has_perm("comptes.adherent_supprimer", Acl.TOTAL)):
shred = False
......@@ -752,7 +746,10 @@ class AdherentViewSet(viewsets.GenericViewSet):
shred = True
detail = ""
target_user.delete(shred=shred)
return Response({'anonymisé' : shred, "detail" : detail})
return Response(
{"detail" : detail},
status=status.HTTP_204_NO_CONTENT if shred else status.HTTP_200_OK,
)
class AliasViewSet(viewsets.GenericViewSet):
"""
......@@ -782,10 +779,10 @@ class AliasViewSet(viewsets.GenericViewSet):
if alias.proprietaire is None:
status_code = status.HTTP_200_OK
else:
status_code = status.HTTP_417_EXPECTATION_FAILED
status_code = status.HTTP_403_FORBIDDEN
return Response({'id' : alias.id}, status=status_code)
except Alias.DoesNotExist:
return Response({'id' : None})
return Response({'id' : None}, status=status.HTTP_200_OK)
def create(self, request):
"""
......@@ -794,7 +791,7 @@ class AliasViewSet(viewsets.GenericViewSet):
Les données doivent être envoyées via une requête POST
"""
if not request.user.has_perm("comptes.alias_adopter", Acl.LIMITE):
raise PermissionDenied
return Response({}, status=status.HTTP_403_FORBIDDEN)
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
......@@ -805,7 +802,7 @@ class AliasViewSet(viewsets.GenericViewSet):
# Peut créer un alias pour soi-même
pass
else:
raise PermissionDenied
return Response({}, status=status.HTTP_403_FORBIDDEN)
new_alias = serializer.save()
return Response({'id' : new_alias.id}, status=status.HTTP_201_CREATED)
......@@ -816,7 +813,7 @@ class AliasViewSet(viewsets.GenericViewSet):
Les données doivent être envoyées via une requête DELETE
"""
if not request.user.has_perm("comptes.alias_abandonner", Acl.LIMITE):
raise PermissionDenied
return Response({}, status=status.HTTP_403_FORBIDDEN)
alias = self.get_object()
if request.user.has_perm("comptes.alias_abandonner", Acl.TOTAL):
......@@ -824,7 +821,7 @@ class AliasViewSet(viewsets.GenericViewSet):
elif alias.proprietaire == request.user.id:
pass
else:
raise PermissionDenied
return Response({}, status=status.HTTP_403_FORBIDDEN)
alias.delete()
return Response({}, status=status.HTTP_204_NO_CONTENT)
......@@ -837,13 +834,13 @@ class AliasViewSet(viewsets.GenericViewSet):
- être envoyées via une requête PATCH
"""
if not request.user.has_perm("comptes.alias_adopter", Acl.LIMITE):
raise PermissionDenied
return Response({}, status=status.HTTP_403_FORBIDDEN)
if "alias" in request.data:
# Les aliases sont inaltérables
return Response(
{'detail' : 'Un alias ne peut être modifié'},
status=status.HTTP_400_BAD_REQUEST,
status=status.HTTP_422_UNPROCESSABLE_ENTITY,
)
serializer = self.get_serializer(self.get_object(), data=request.data, partial=True)
......@@ -855,10 +852,10 @@ class AliasViewSet(viewsets.GenericViewSet):
# Peut adopter un alias
pass
else:
raise PermissionDenied
return Response({}, status=status.HTTP_403_FORBIDDEN)
serializer.save()
return Response({}, status=status.HTTP_204_NO_CONTENT)
return Response({}, status=status.HTTP_200_OK)
class AccreditationViewSet(viewsets.GenericViewSet):
"""
......@@ -882,7 +879,7 @@ class AccreditationViewSet(viewsets.GenericViewSet):
if self.get_queryset().filter(adherent=target_user, droit__codename=droit.codename).exists():
return Response(
{'detail' : "Cette attribution existe déjà."},
status=status.HTTP_400_BAD_REQUEST,
status=status.HTTP_422_UNPROCESSABLE_ENTITY,
)
meta = serializer.validated_data['meta']
if not request.user.has_perm("%s.%s" % (droit.content_type.app_label, droit.codename), droit.niveau, True):
......
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