Commit 851b6815 authored by Hamza Dely's avatar Hamza Dely

[activites] Finalisation de l'API

parent c324676c
......@@ -12,6 +12,7 @@ Les paquets peuvent être récupérés via APT ou PIP.
* python3-jinja2 (>= 2.9)
* python3-django-filters (>= 1.0)
* python3-djangorestframework (>= 3.4.0)
* drf-nested-routers (>= 0.90.2)
* python3-pil (>= 4.0.0)
* postgresql (>= 9.6)
* postgresql-plpython3 (>= 9.6)
......
......@@ -2,13 +2,19 @@
Vues de l'API de l'application « Comptes »
"""
from rest_framework import routers
from django.conf.urls import url, include
from activites.views import ActiviteViewSet #, InviteViewSet
from rest_framework_nested import routers
router = routers.DefaultRouter()
from activites.views import ActiviteViewSet, InviteViewSet
router = routers.DefaultRouter()
router.register(r'activites', ActiviteViewSet)
#router.register(r'invites', InviteViewSet)
urlpatterns = router.urls
activite_router = routers.NestedSimpleRouter(router, r'activites', lookup="activite")
activite_router.register(r'invites', InviteViewSet, base_name="activite-invites")
urlpatterns = [
url('^', include(router.urls)),
url('^', include(activite_router.urls)),
]
......@@ -15,9 +15,10 @@ class ActiviteSerializer(mixins.DynamicFieldsMixin, serializers.ModelSerializer)
class Meta:
model = Activite
fields = [
'intitule', 'description', 'debut', 'fin',
'liste_invitation', 'organisateur', 'valide_par',
'id', 'intitule', 'description', 'debut',
'fin', 'liste_invitation', 'organisateur', 'valide_par',
]
read_only_fields = ['id']
default_empty = False
class InviteSerializer(serializers.ModelSerializer):
......@@ -26,4 +27,5 @@ class InviteSerializer(serializers.ModelSerializer):
"""
class Meta:
model = Invite
fields = ['nom', 'prenom', 'naissance', 'activite', 'invite_par', 'present',]
fields = ['id', 'nom', 'prenom', 'naissance', 'invite_par', 'activite']
read_only_fields = ['id']
......@@ -30,7 +30,7 @@ from comptes.models import Adherent
from activites.models import Activite, Invite
from activites.filters import ActiviteRechercheFilter
from activites.serializers import ActiviteSerializer
from activites.serializers import ActiviteSerializer, InviteSerializer
################################################################################
## Vues concernant le site Web ##
......@@ -399,7 +399,7 @@ class ActiviteViewSet(viewsets.GenericViewSet):
serializer = self.get_serializer(
qs,
many=True,
fields=['intitule', 'description', 'debut', 'fin', 'liste_invitation'],
fields=['id', 'intitule', 'description', 'debut', 'fin', 'liste_invitation'],
)
return Response(serializer.data, status=status.HTTP_200_OK)
......@@ -409,7 +409,7 @@ class ActiviteViewSet(viewsets.GenericViewSet):
Les données doivent:
- être envoyées via une requête GET
"""
fields = ['intitule', 'description', 'debut', 'fin', 'liste_invitation']
fields = ['id', 'intitule', 'description', 'debut', 'fin', 'liste_invitation']
if self.request.user.has_perm("activites.activite_gerer", Acl.LIMITE):
fields += ['organisateur', 'valide_par']
......@@ -533,3 +533,95 @@ class ActiviteViewSet(viewsets.GenericViewSet):
activite.delete()
return Response({}, status=status.HTTP_204_NO_CONTENT)
class InviteViewSet(viewsets.GenericViewSet):
"""
Un ensemble du vues pour gérer les invités
"""
serializer_class = InviteSerializer
def get_queryset(self):
return Invite.objects.filter(activite=self.kwargs['activite_pk'])
def list(self, request, activite_pk=None):
"""
Renvoie la liste des invités à une activité donnée.
Les données doivent :
- être envoyées via une requête GET
"""
if not request.user.has_perm("activites.activite_gerer", Acl.TOTAL):
return Response({}, status=status.HTTP_403_FORBIDDEN)
if not Activite.objects.get(pk=self.kwargs['activite_pk']).liste_invitation:
return Response(
{"detail" : "Cette activité n'a pas de liste d'invités"},
status=status.HTTP_404_NOT_FOUND,
)
serializer = self.get_serializer(self.get_queryset(), many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def retrieve(self, request, pk=None, activite_pk=None):
"""
Renvoie les informations concernant un invité donné.
Les données doivent :
- être envoyées via une requête GET
"""
if not request.user.has_perm("activites.activite_gerer", Acl.TOTAL):
return Response({}, status=status.HTTP_403_FORBIDDEN)
invite = self.get_object()
serializer = self.get_serializer(invite)
return Response(serializer.data, status=status.HTTP_200_OK)
def create(self, request, pk=None, activite_pk=None):
"""
Ajoute un invité à l'activité courante
Les données doivent :
- être envoyées via une requête POST
"""
if not request.user.has_perm("activites.invite_inviter", Acl.LIMITE):
return Response({}, status=status.HTTP_403_FORBIDDEN)
activite = Activite.objects.get(pk=activite_pk)
if not activite.liste_invitation:
# Pas de liste d'invités pour cette activité
return Response(
{"detail" : "Il n'y a pas de liste d'invités pour cette activité"},
status=status.HTTP_400_BAD_REQUEST,
)
if ('invite_par' in request.data
and not request.user.has_perm("activites.invite_inviter", Acl.TOTAL)):
return Response(
{"detail" : "Vous ne pouvez inviter une personne qu'en vôtre nom"},
status=status.HTTP_403_FORBIDDEN,
)
else:
request.data['invite_par'] = request.user.pk
request.data['activite'] = activite.pk
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response({}, status=status.HTTP_201_CREATED)
def destroy(self, request, pk=None, activite_pk=None):
"""
Supprime un invité à une activité donnée.
Les données doivent :
- être envoyées via une requête DELETE
"""
if not request.user.has_perm("activites.invite_supprimer", Acl.LIMITE):
return Response({}, status=status.HTTP_403_FORBIDDEN)
invite = self.get_object()
if (invite.invite_par != request.user
and not request.user.has_perm("activites.invite_supprimer", Acl.TOTAL)):
return Response(
{"detail" : "Vous ne pouvez pas supprimer une invitation d'un autre adhérent"},
status=status.HTTP_403_FORBIDDEN,
)
invite.delete()
return Response({}, status=status.HTTP_204_NO_CONTENT)
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