text: from rest_framework import viewsets, status, permissions
  from django.contrib.auth import get_user_model, logout
  from rest_framework.response import Response
  from django.core.exceptions import ImproperlyConfigured
  from rest_framework.decorators import action
  from rest_framework.permissions import AllowAny, IsAuthenticated
  from django_filters.rest_framework import DjangoFilterBackend
  
  from .serializers import (
      UserRegisterSerializer,
      UserLoginSerializer,
      EmptySerializer,
      AuthUserSerializer,
      PasswordChangeSerializer,
      PalestranteSerializer,
      PalestraSerializer,
  )
  
  from .permissions import AnonPermissionOnly
  from core.utils import get_and_authenticate_user
  from core.models import Palestrante, Palestra
  
  
  User = get_user_model()
  
  
  class RegisterUserAPI(viewsets.ModelViewSet):
  
      queryset = User.objects.all()
      serializer_class = UserRegisterSerializer
      permission_classes = [AnonPermissionOnly]
  
      def create(self, request, *args, **kwargs):
          serializer = self.get_serializer(data=request.data)
          serializer.is_valid(raise_exception=True)
          self.perform_create(serializer)
          headers = self.get_success_headers(serializer.data)
          return Response(
              serializer.data,
              status=status.HTTP_201_CREATED,
              headers=headers
          )
  
  
  class AuthAPIView(viewsets.GenericViewSet):
      permission_classes = [AllowAny, ]
      serializer_class = EmptySerializer
      serializer_classes = {
          'login': UserLoginSerializer,
          'password_change': PasswordChangeSerializer,
      }
  
      @action(methods=['POST', ], detail=False)
      def login(self, request):
          serializer = self.get_serializer(data=request.data)
          serializer.is_valid(raise_exception=True)
          user = get_and_authenticate_user(**serializer.validated_data)
          data = AuthUserSerializer(user).data
          return Response(data=data, status=status.HTTP_200_OK)
  
      @action(methods=['POST', ], detail=False)
      def logout(self, request):
          logout(request)
          data = {'success': 'Sucessfully logged out'}
          return Response(data=data, status=status.HTTP_200_OK)
  
      @action(methods=['POST'], detail=False, permission_classes=[IsAuthenticated, ])
      def password_change(self, request):
          serializer = self.get_serializer(data=request.data)
          serializer.is_valid(raise_exception=True)
          request.user.set_password(serializer.validated_data['new_password'])
          request.user.save()
          return Response(status=status.HTTP_204_NO_CONTENT)
  
      def get_serializer_class(self):
          if not isinstance(self.serializer_classes, dict):
              raise ImproperlyConfigured("serializer_classes should be a dict mapping.")
  
          if self.action in self.serializer_classes.keys():
              return self.serializer_classes[self.action]
          return super().get_serializer_class()
  
  
  class PalestranteAPIView(viewsets.ModelViewSet):
  
      permission_classes = [permissions.IsAuthenticatedOrReadOnly]
      serializer_class = PalestranteSerializer
      queryset = Palestrante.objects.all()
  
      filter_backends = [DjangoFilterBackend]
      filterset_fields = ['nome']
  
      lookup_field = 'pk'
  
      def create(self, request, *args, **kwargs):
          serializer = self.get_serializer(data=request.data)
          serializer.is_valid(raise_exception=True)
          self.perform_create(serializer)
          headers = self.get_success_headers(serializer.data)
          return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
  
      def list(self, request, *args, **kwargs):
          queryset = self.filter_queryset(self.queryset)
  
          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 retrieve(self, request, *args, **kwargs):
          instance = self.get_object()
          serializer = self.get_serializer(instance)
          return Response(serializer.data)
  
      def update(self, request, *args, **kwargs):
          partial = kwargs.pop('partial', False)
          instance = self.get_object()
          serializer = self.get_serializer(instance, data=request.data, partial=partial)
          serializer.is_valid(raise_exception=True)
          self.perform_update(serializer)
          return Response(serializer.data)
  
      def destroy(self, request, *args, **kwargs):
          instance = self.get_object()
          self.perform_destroy(instance)
          return Response(status=status.HTTP_204_NO_CONTENT)
  
  
  class PalestraAPIView(viewsets.ModelViewSet):
  
      permission_classes = [permissions.IsAuthenticatedOrReadOnly]
      serializer_class = PalestraSerializer
      queryset = Palestra.objects.all()
  
      filter_backends = [DjangoFilterBackend]
      filterset_fields = ['data']
  
      lookup_field = 'pk'
  
      def create(self, request, *args, **kwargs):
          serializer = self.get_serializer(data=request.data)
          serializer.is_valid(raise_exception=True)
          self.perform_create(serializer)
          headers = self.get_success_headers(serializer.data)
          return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
  
      def list(self, request, *args, **kwargs):
          queryset = self.filter_queryset(self.queryset)
          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 retrieve(self, request, *args, **kwargs):
          instance = self.get_object()
          serializer = self.get_serializer(instance)
          return Response(serializer.data)
  
      def update(self, request, *args, **kwargs):
          partial = kwargs.pop('partial', False)
          instance = self.get_object()
          serializer = self.get_serializer(instance, data=request.data, partial=partial)
          serializer.is_valid(raise_exception=True)
          self.perform_update(serializer)
          return Response(serializer.data)
  
      def destroy(self, request, *args, **kwargs):
          instance = self.get_object()
          self.perform_destroy(instance)
          return Response(status=status.HTTP_204_NO_CONTENT)
  