from django.contrib.auth import login from rest_framework.decorators import action from rest_framework.permissions import AllowAny, IsAdminUser, IsAuthenticated from rest_framework.response import Response from rest_framework.viewsets import ModelViewSet from core.mixins import ActionBasedMixin from market.serializers import PostSerializer from .models import User from .serializers import UserSerializer, UserCreateSerializer class UserViewset(ActionBasedMixin, ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer serializer_class_map = { "create": UserCreateSerializer, "posts": PostSerializer, } permission_classes = [IsAdminUser] permission_classes_map = { "create": [AllowAny], "me": [IsAuthenticated], "posts": [IsAuthenticated], } @action(detail=True, methods=["GET"]) def posts(self, request, pk): user = self.get_object() queryset = user.posts.all() page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) def create(self, request, *args, **kwargs): serializer = UserCreateSerializer(data=request.data) serializer.is_valid(raise_exception=True) user = self.perform_create(serializer) login(request, user) return Response(serializer.data, status=201) @action(detail=False, methods=["GET"]) def me(self, request): serializer = self.get_serializer(request.user) return Response(serializer.data)