diff --git a/web_admin/serializers/user_management_serializer.py b/web_admin/serializers/user_management_serializer.py index 5293cc4..5221e12 100644 --- a/web_admin/serializers/user_management_serializer.py +++ b/web_admin/serializers/user_management_serializer.py @@ -23,7 +23,8 @@ class UserManagementListSerializer(serializers.ModelSerializer): user management serializer """ name = serializers.SerializerMethodField() - phone_number = serializers.SerializerMethodField() + country_code = serializers.SerializerMethodField() + phone = serializers.SerializerMethodField() user_type = serializers.SerializerMethodField() is_active = serializers.SerializerMethodField() @@ -32,7 +33,7 @@ class UserManagementListSerializer(serializers.ModelSerializer): meta class """ model = USER - fields = ('id', 'name', 'email', 'phone_number', 'user_type', 'is_active') + fields = ('id', 'name', 'email', 'country_code', 'phone', 'user_type', 'is_active') @staticmethod def get_name(obj): @@ -43,15 +44,28 @@ class UserManagementListSerializer(serializers.ModelSerializer): return f"{obj.first_name} {obj.last_name}" if obj.last_name else obj.first_name @staticmethod - def get_phone_number(obj): + def get_country_code(obj): """ :param obj: user object :return: user phone number """ if profile := obj.guardian_profile.all().first(): - return f"+{profile.country_code}{profile.phone}" if profile.country_code and profile.phone else profile.phone + return profile.country_code if profile.country_code else None elif profile := obj.junior_profile.all().first(): - return f"+{profile.country_code}{profile.phone}" if profile.country_code and profile.phone else profile.phone + return profile.country_code if profile.country_code else None + else: + return None + + @staticmethod + def get_phone(obj): + """ + :param obj: user object + :return: user phone number + """ + if profile := obj.guardian_profile.all().first(): + return profile.phone if profile.phone else None + elif profile := obj.junior_profile.all().first(): + return profile.phone if profile.phone else None else: return None @@ -84,11 +98,18 @@ class UserManagementListSerializer(serializers.ModelSerializer): class GuardianSerializer(serializers.ModelSerializer): name = serializers.SerializerMethodField() - phone_number = serializers.SerializerMethodField() class Meta: model = Guardian - fields = ('id', 'name', 'dob', 'gender', 'phone_number', 'is_active', 'country_name', 'image') + fields = ('id', 'name', 'dob', 'gender', 'country_code', 'phone', 'is_active', 'country_name', 'image') + + def update(self, instance, validated_data): + instance.user.email = self.context.get('email', instance.user.email) + instance.user.save() + instance.country_code = validated_data.get('country_code', instance.country_code) + instance.phone = validated_data.get('phone', instance.phone) + instance.save() + return instance @staticmethod def get_name(obj): @@ -98,22 +119,21 @@ 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 = ('id', 'name', 'dob', 'gender', 'phone_number', 'is_active', 'country_name', 'image') + fields = ('id', 'name', 'dob', 'gender', 'country_code', 'phone', 'is_active', 'country_name', 'image') + + def update(self, instance, validated_data): + instance.auth.email = self.context.get('email', instance.auth.email) + instance.auth.save() + instance.country_code = validated_data.get('country_code', instance.country_code) + instance.phone = validated_data.get('phone', instance.phone) + instance.save() + return instance @staticmethod def get_name(obj): @@ -123,14 +143,6 @@ 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() diff --git a/web_admin/views/article.py b/web_admin/views/article.py index 314f36e..be93b4c 100644 --- a/web_admin/views/article.py +++ b/web_admin/views/article.py @@ -29,7 +29,7 @@ class ArticleViewSet(GenericViewSet, mixins.CreateModelMixin, mixins.UpdateModel serializer_class = ArticleSerializer permission_classes = [IsAuthenticated, AdminPermission] queryset = Article - filter_backends = (OrderingFilter, SearchFilter,) + filter_backends = (SearchFilter,) search_fields = ['title'] http_method_names = ['get', 'post', 'put', 'delete'] diff --git a/web_admin/views/user_management.py b/web_admin/views/user_management.py index 54dc874..e4018ac 100644 --- a/web_admin/views/user_management.py +++ b/web_admin/views/user_management.py @@ -14,20 +14,21 @@ from django.db.models import Q 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.models import Article, ArticleCard, ArticleSurvey, DefaultArticleCardImage from web_admin.permission import AdminPermission from web_admin.serializers.user_management_serializer import (UserManagementListSerializer, - UserManagementDetailSerializer) + UserManagementDetailSerializer, GuardianSerializer, + JuniorSerializer) USER = get_user_model() -class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin, mixins.RetrieveModelMixin): +class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin, + mixins.RetrieveModelMixin, mixins.UpdateModelMixin): """ api to manage (list, view, edit) user """ serializer_class = UserManagementListSerializer - permission_classes = [] + permission_classes = [IsAuthenticated, AdminPermission] queryset = USER.objects.filter(is_superuser=False ).prefetch_related('guardian_profile', 'junior_profile' @@ -49,7 +50,7 @@ class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin, mixins.Retrie def list(self, request, *args, **kwargs): """ api method to list all the user - :param request: + :param request: user_type {'guardian' for Guardian list, 'junior' for Junior list} :return: """ queryset = self.get_queryset() @@ -60,6 +61,14 @@ class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin, mixins.Retrie 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']) @@ -67,3 +76,21 @@ class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin, mixins.Retrie 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.')