Files
zod-backend/web_admin/views/user_management.py
abutalib-kiwi baacb1a18f user edit api
2023-08-04 16:37:46 +05:30

97 lines
4.8 KiB
Python

"""
web_admin user_management views file
"""
# django imports
from rest_framework.viewsets import GenericViewSet, mixins
from rest_framework.filters import OrderingFilter, SearchFilter
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated, AllowAny
from django.contrib.auth import get_user_model
from django.db.models import Q
# local imports
from account.utils import custom_response, custom_error_response
from base.constants import USER_TYPE
from base.messages import SUCCESS_CODE, ERROR_CODE
from web_admin.permission import AdminPermission
from web_admin.serializers.user_management_serializer import (UserManagementListSerializer,
UserManagementDetailSerializer, GuardianSerializer,
JuniorSerializer)
USER = get_user_model()
class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin,
mixins.RetrieveModelMixin, mixins.UpdateModelMixin):
"""
api to manage (list, view, edit) user
"""
serializer_class = UserManagementListSerializer
permission_classes = [IsAuthenticated, AdminPermission]
queryset = USER.objects.filter(is_superuser=False
).prefetch_related('guardian_profile',
'junior_profile'
).exclude(junior_profile__isnull=True,
guardian_profile__isnull=True).order_by('date_joined')
filter_backends = (SearchFilter,)
search_fields = ['first_name', 'last_name']
def get_queryset(self):
if self.request.query_params.get('user_type') == dict(USER_TYPE).get('2'):
queryset = self.queryset.filter(junior_profile__isnull=True)
elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'):
queryset = self.queryset.filter(guardian_profile__isnull=True)
else:
queryset = self.queryset
queryset = self.filter_queryset(queryset)
return queryset
def list(self, request, *args, **kwargs):
"""
api method to list all the user
:param request: user_type {'guardian' for Guardian list, 'junior' for Junior list}
:return:
"""
queryset = self.get_queryset()
count = queryset.count()
paginator = self.pagination_class()
paginated_queryset = paginator.paginate_queryset(queryset, request)
serializer = self.serializer_class(paginated_queryset, many=True)
return custom_response(None, data=serializer.data, count=count)
def retrieve(self, request, *args, **kwargs):
"""
to get details of single user
:param request: user_id along with
user_type {'guardian' for Guardian, 'junior' for Junior} mandatory
:return: user details
"""
if self.request.query_params.get('user_type') not in [dict(USER_TYPE).get('1'), dict(USER_TYPE).get('2')]:
return custom_error_response('Action not allowed', status.HTTP_400_BAD_REQUEST)
queryset = self.queryset
if self.request.query_params.get('user_type') == dict(USER_TYPE).get('2'):
queryset = queryset.filter(guardian_profile__user__id=kwargs['pk'])
elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'):
queryset = queryset.filter(junior_profile__auth__id=kwargs['pk'])
serializer = UserManagementDetailSerializer(queryset, many=True)
return custom_response(None, data=serializer.data)
def partial_update(self, request, *args, **kwargs):
if self.request.query_params.get('user_type') not in [dict(USER_TYPE).get('1'), dict(USER_TYPE).get('2')]:
return custom_error_response('Action not allowed', status.HTTP_400_BAD_REQUEST)
queryset = self.queryset
if self.request.query_params.get('user_type') == dict(USER_TYPE).get('2'):
queryset = queryset.filter(guardian_profile__user__id=kwargs['pk']).first()
serializer = GuardianSerializer(queryset.guardian_profile.all().first(),
request.data, context={'email': request.data.get('email', queryset.email)})
elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'):
queryset = queryset.filter(junior_profile__auth__id=kwargs['pk']).first()
serializer = JuniorSerializer(queryset.junior_profile.all().first(),
request.data, context={'email': request.data.get('email', queryset.email)})
serializer.is_valid(raise_exception=True)
serializer.save()
return custom_response('Profile updated successfully.')