from django.http import Http404 from djangoldp.views import LDPViewSet from datetime import datetime from rest_framework import status from rest_framework.views import APIView from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from .models import Poll,Vote from .serializers import PollOptionSerializer class CanVoteOnPollViewSet(APIView): permission_classes = (IsAuthenticated,) def get(self, request, pk): '''returns True if the user can vote, or False if they have already voted''' try: poll = Poll.objects.get(pk=pk) can_vote = True if Vote.objects.filter(relatedPoll=poll, user=request.user).exists(): can_vote = False return Response(can_vote, status=status.HTTP_200_OK) except Poll.DoesNotExist: return Response(data={'error': {'poll': ['Could not find poll with this ID!']}}, status=status.HTTP_404_NOT_FOUND) class FuturePollViewset(LDPViewSet): model = Poll def get_queryset(self): return super().get_queryset().filter(enddate__gte=datetime.now()) class TotalVotes(LDPViewSet): '''view to GET the total counts of votes selecting a particular option''' serializer_class = PollOptionSerializer def _get_poll_or_404(self): pk = self.kwargs['pk'] try: return Poll.objects.get(pk=pk) except Poll.DoesNotExist: raise Http404('could not get a Poll with this ID!') def get_serializer_context(self): poll = self._get_poll_or_404() votes = poll.votes.all() context = super().get_serializer_context() context.update({'votes_queryset': votes}) return context def get_queryset(self, *args, **kwargs): poll = self._get_poll_or_404() return poll.pollOptions.all() def get_serializer_class(self): # NOTE: this is required because currently DjangoLDP overrides the serializer_class during __init__ # https://git.startinblox.com/djangoldp-packages/djangoldp/issues/241 return PollOptionSerializer