user detail view api, searching user list, count

This commit is contained in:
abutalib-kiwi
2023-08-04 13:15:32 +05:30
parent b9e2d9bc8a
commit 756bea0471
4 changed files with 63 additions and 13 deletions

View File

@ -138,12 +138,14 @@ def send_support_email(name, sender, subject, message):
} }
) )
return name return name
def custom_response(detail, data=None, response_status=status.HTTP_200_OK):
def custom_response(detail, data=None, response_status=status.HTTP_200_OK, count=None):
"""Custom response code""" """Custom response code"""
if not data: if not data:
"""when data is none""" """when data is none"""
data = None data = None
return Response({"data": data, "message": detail, "status": "success", "code": response_status}) return Response({"data": data, "message": detail, "status": "success", "code": response_status, "count": count})
def custom_error_response(detail, response_status): def custom_error_response(detail, response_status):

View File

@ -25,6 +25,7 @@ class UserManagementListSerializer(serializers.ModelSerializer):
name = serializers.SerializerMethodField() name = serializers.SerializerMethodField()
phone_number = serializers.SerializerMethodField() phone_number = serializers.SerializerMethodField()
user_type = serializers.SerializerMethodField() user_type = serializers.SerializerMethodField()
is_active = serializers.SerializerMethodField()
class Meta: class Meta:
""" """
@ -67,13 +68,27 @@ class UserManagementListSerializer(serializers.ModelSerializer):
else: else:
return None return None
@staticmethod
def get_is_active(obj):
"""
:param obj: user object
:return: user type
"""
if profile := obj.guardian_profile.all().first():
return profile.is_active
elif profile := obj.junior_profile.all().first():
return profile.is_active
else:
return obj.is_active
class GuardianSerializer(serializers.ModelSerializer): class GuardianSerializer(serializers.ModelSerializer):
name = serializers.SerializerMethodField() name = serializers.SerializerMethodField()
phone_number = serializers.SerializerMethodField()
class Meta: class Meta:
model = Guardian model = Guardian
fields = ('name', 'dob', 'gender', 'phone', 'is_active', 'country_name', 'image') fields = ('id', 'name', 'dob', 'gender', 'phone_number', 'is_active', 'country_name', 'image')
@staticmethod @staticmethod
def get_name(obj): def get_name(obj):
@ -83,13 +98,22 @@ class GuardianSerializer(serializers.ModelSerializer):
""" """
return f"{obj.user.first_name} {obj.user.last_name}" if obj.user.last_name else obj.user.first_name return f"{obj.user.first_name} {obj.user.last_name}" if obj.user.last_name else obj.user.first_name
@staticmethod
def get_phone_number(obj):
"""
:param obj: user object
:return: user phone number
"""
return f"+{obj.country_code}{obj.phone}" if obj.country_code and obj.phone else obj.phone
class JuniorSerializer(serializers.ModelSerializer): class JuniorSerializer(serializers.ModelSerializer):
name = serializers.SerializerMethodField() name = serializers.SerializerMethodField()
phone_number = serializers.SerializerMethodField()
class Meta: class Meta:
model = Junior model = Junior
fields = ('name', 'dob', 'gender', 'phone', 'is_active', 'country_name', 'image') fields = ('id', 'name', 'dob', 'gender', 'phone_number', 'is_active', 'country_name', 'image')
@staticmethod @staticmethod
def get_name(obj): def get_name(obj):
@ -99,6 +123,14 @@ class JuniorSerializer(serializers.ModelSerializer):
""" """
return f"{obj.auth.first_name} {obj.auth.last_name}" if obj.auth.last_name else obj.auth.first_name return f"{obj.auth.first_name} {obj.auth.last_name}" if obj.auth.last_name else obj.auth.first_name
@staticmethod
def get_phone_number(obj):
"""
:param obj: user object
:return: user phone number
"""
return f"+{obj.country_code}{obj.phone}" if obj.country_code and obj.phone else obj.phone
class UserManagementDetailSerializer(serializers.ModelSerializer): class UserManagementDetailSerializer(serializers.ModelSerializer):
user_type = serializers.SerializerMethodField() user_type = serializers.SerializerMethodField()
@ -111,7 +143,7 @@ class UserManagementDetailSerializer(serializers.ModelSerializer):
meta class meta class
""" """
model = USER model = USER
fields = ('user_type', 'email', 'guardian_profile', 'junior_profile', 'associated_users') fields = ('id', 'user_type', 'email', 'guardian_profile', 'junior_profile', 'associated_users')
@staticmethod @staticmethod
def get_user_type(obj): def get_user_type(obj):
@ -133,3 +165,7 @@ class UserManagementDetailSerializer(serializers.ModelSerializer):
junior = Junior.objects.filter(guardian_code__contains=[profile.guardian_code], is_verified=True) junior = Junior.objects.filter(guardian_code__contains=[profile.guardian_code], is_verified=True)
serializer = JuniorSerializer(junior, many=True) serializer = JuniorSerializer(junior, many=True)
return serializer.data return serializer.data
elif profile := obj.junior_profile.all().first():
guardian = Guardian.objects.filter(guardian_code__in=profile.guardian_code, is_verified=True)
serializer = GuardianSerializer(guardian, many=True)
return serializer.data

View File

@ -76,10 +76,11 @@ class ArticleViewSet(GenericViewSet, mixins.CreateModelMixin, mixins.UpdateModel
:return: list of article :return: list of article
""" """
queryset = self.get_queryset() queryset = self.get_queryset()
count = queryset.count()
paginator = self.pagination_class() paginator = self.pagination_class()
paginated_queryset = paginator.paginate_queryset(queryset, request) paginated_queryset = paginator.paginate_queryset(queryset, request)
serializer = self.serializer_class(paginated_queryset, many=True) serializer = self.serializer_class(paginated_queryset, many=True)
return custom_response(None, data=serializer.data) return custom_response(None, data=serializer.data, count=count)
def retrieve(self, request, *args, **kwargs): def retrieve(self, request, *args, **kwargs):
""" """

View File

@ -8,6 +8,7 @@ from rest_framework import status
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated, AllowAny from rest_framework.permissions import IsAuthenticated, AllowAny
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.db.models import Q
# local imports # local imports
from account.utils import custom_response, custom_error_response from account.utils import custom_response, custom_error_response
@ -27,16 +28,23 @@ class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin, mixins.Retrie
""" """
serializer_class = UserManagementListSerializer serializer_class = UserManagementListSerializer
permission_classes = [] permission_classes = []
queryset = USER.objects.filter(is_superuser=False).prefetch_related( queryset = USER.objects.filter(is_superuser=False
'guardian_profile', 'junior_profile') ).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): def get_queryset(self):
if self.request.query_params.get('user_type') == dict(USER_TYPE).get('2'): if self.request.query_params.get('user_type') == dict(USER_TYPE).get('2'):
return self.queryset.filter(junior_profile__isnull=True) queryset = self.queryset.filter(junior_profile__isnull=True)
elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'): elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'):
return self.queryset.filter(guardian_profile__isnull=True) queryset = self.queryset.filter(guardian_profile__isnull=True)
else: else:
return self.queryset queryset = self.queryset
queryset = self.filter_queryset(queryset)
return queryset
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
""" """
@ -45,8 +53,11 @@ class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin, mixins.Retrie
:return: :return:
""" """
queryset = self.get_queryset() queryset = self.get_queryset()
serializer = self.serializer_class(queryset, many=True) count = queryset.count()
return custom_response(None, data=serializer.data) 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): def retrieve(self, request, *args, **kwargs):
queryset = self.queryset queryset = self.queryset