diff --git a/account/utils.py b/account/utils.py index d1e6e54..4dc6acc 100644 --- a/account/utils.py +++ b/account/utils.py @@ -138,12 +138,14 @@ def send_support_email(name, sender, subject, message): } ) 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""" if not data: """when data is 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): diff --git a/web_admin/serializers/user_management_serializer.py b/web_admin/serializers/user_management_serializer.py index 9e1920b..5293cc4 100644 --- a/web_admin/serializers/user_management_serializer.py +++ b/web_admin/serializers/user_management_serializer.py @@ -25,6 +25,7 @@ class UserManagementListSerializer(serializers.ModelSerializer): name = serializers.SerializerMethodField() phone_number = serializers.SerializerMethodField() user_type = serializers.SerializerMethodField() + is_active = serializers.SerializerMethodField() class Meta: """ @@ -67,13 +68,27 @@ class UserManagementListSerializer(serializers.ModelSerializer): else: 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): name = serializers.SerializerMethodField() + phone_number = serializers.SerializerMethodField() class Meta: 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 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 + @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): name = serializers.SerializerMethodField() + phone_number = serializers.SerializerMethodField() class Meta: 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 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 + @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): user_type = serializers.SerializerMethodField() @@ -111,7 +143,7 @@ class UserManagementDetailSerializer(serializers.ModelSerializer): meta class """ model = USER - fields = ('user_type', 'email', 'guardian_profile', 'junior_profile', 'associated_users') + fields = ('id', 'user_type', 'email', 'guardian_profile', 'junior_profile', 'associated_users') @staticmethod 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) serializer = JuniorSerializer(junior, many=True) 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 diff --git a/web_admin/views/article.py b/web_admin/views/article.py index b8f8a1f..314f36e 100644 --- a/web_admin/views/article.py +++ b/web_admin/views/article.py @@ -76,10 +76,11 @@ class ArticleViewSet(GenericViewSet, mixins.CreateModelMixin, mixins.UpdateModel :return: list of article """ 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) + return custom_response(None, data=serializer.data, count=count) def retrieve(self, request, *args, **kwargs): """ diff --git a/web_admin/views/user_management.py b/web_admin/views/user_management.py index ffca49d..54dc874 100644 --- a/web_admin/views/user_management.py +++ b/web_admin/views/user_management.py @@ -8,6 +8,7 @@ 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 @@ -27,16 +28,23 @@ class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin, mixins.Retrie """ serializer_class = UserManagementListSerializer permission_classes = [] - queryset = USER.objects.filter(is_superuser=False).prefetch_related( - 'guardian_profile', 'junior_profile') + 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'): - 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'): - return self.queryset.filter(guardian_profile__isnull=True) + queryset = self.queryset.filter(guardian_profile__isnull=True) else: - return self.queryset + queryset = self.queryset + queryset = self.filter_queryset(queryset) + return queryset def list(self, request, *args, **kwargs): """ @@ -45,8 +53,11 @@ class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin, mixins.Retrie :return: """ queryset = self.get_queryset() - serializer = self.serializer_class(queryset, many=True) - return custom_response(None, data=serializer.data) + 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): queryset = self.queryset