import django from rest_framework import mixins, generics from workouts.mixins import CreateListModelMixin from rest_framework import permissions from users.serializers import ( UserSerializer, OfferSerializer, AthleteFileSerializer, UserPutSerializer, UserGetSerializer, ProfilePutSerializer ) from rest_framework.permissions import ( AllowAny, IsAdminUser, IsAuthenticated, IsAuthenticatedOrReadOnly, ) from users.models import Offer, AthleteFile from django.contrib.auth import get_user_model from django.db.models import Q from django.shortcuts import get_object_or_404 from rest_framework.parsers import MultiPartParser, FormParser from users.permissions import IsCurrentUser, IsAthlete, IsCoach from workouts.permissions import IsOwner, IsReadOnly # Create your views here. class UserList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView): serializer_class = UserSerializer users = [] admins = [] def get(self, request, *args, **kwargs): self.serializer_class = UserGetSerializer return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs) def get_queryset(self): qs = get_user_model().objects.all() if self.request.user: # Return the currently logged in user status = self.request.query_params.get("user", None) if status and status == "current": qs = get_user_model().objects.filter(pk=self.request.user.pk) return qs class UserDetail( mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView, ): lookup_field_options = ["pk", "username"] serializer_class = UserSerializer queryset = get_user_model().objects.all() permission_classes = [permissions.IsAuthenticated & (IsCurrentUser | IsReadOnly)] def get_object(self): for field in self.lookup_field_options: if field in self.kwargs: self.lookup_field = field break return super().get_object() def get(self, request, *args, **kwargs): self.serializer_class = UserGetSerializer return self.retrieve(request, *args, **kwargs) def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs) def put(self, request, *args, **kwargs): self.serializer_class = UserPutSerializer return self.update(request, *args, **kwargs) def patch(self, request, *args, **kwargs): return self.partial_update(request, *args, **kwargs) class ProfileUpdate( mixins.RetrieveModelMixin, mixins.UpdateModelMixin, generics.GenericAPIView, ): serializer_class = ProfilePutSerializer queryset = get_user_model().objects.all() permission_classes = [permissions.IsAuthenticated & IsCurrentUser] def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) class OfferList( mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView ): permission_classes = [IsAuthenticatedOrReadOnly] serializer_class = OfferSerializer def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs) def perform_create(self, serializer): serializer.save(owner=self.request.user) def get_queryset(self): qs = Offer.objects.none() result = Offer.objects.none() if self.request.user: qs = Offer.objects.filter( Q(owner=self.request.user) | Q(recipient=self.request.user) ).distinct() qp = self.request.query_params u = self.request.user # filtering by status (if provided) s = qp.get("status", None) if s is not None and self.request is not None: qs = qs.filter(status=s) if qp.get("status", None) is None: qs = Offer.objects.filter(Q(owner=u)).distinct() # filtering by category (sent or received) c = qp.get("category", None) if c is not None and qp is not None: if c == "sent": qs = qs.filter(owner=u) elif c == "received": qs = qs.filter(recipient=u) return qs else: return result class OfferDetail( mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView, ): permission_classes = [IsAuthenticatedOrReadOnly] queryset = Offer.objects.all() serializer_class = OfferSerializer def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) def patch(self, request, *args, **kwargs): return self.partial_update(request, *args, **kwargs) def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs) class AthleteFileList( mixins.ListModelMixin, mixins.CreateModelMixin, CreateListModelMixin, generics.GenericAPIView, ): queryset = AthleteFile.objects.all() serializer_class = AthleteFileSerializer permission_classes = [permissions.IsAuthenticated & (IsAthlete | IsCoach)] parser_classes = [MultiPartParser, FormParser] def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs) def perform_create(self, serializer): serializer.save(owner=self.request.user) def get_queryset(self): qs = AthleteFile.objects.none() if self.request.user: qs = AthleteFile.objects.filter( Q(athlete=self.request.user) | Q(owner=self.request.user) ).distinct() return qs class AthleteFileDetail( mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView, ): queryset = AthleteFile.objects.all() serializer_class = AthleteFileSerializer permission_classes = [permissions.IsAuthenticated & (IsAthlete | IsOwner)] def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs)