diff --git a/web_admin/serializers/analytics_serializer.py b/web_admin/serializers/analytics_serializer.py index e87c25d..ce6c72e 100644 --- a/web_admin/serializers/analytics_serializer.py +++ b/web_admin/serializers/analytics_serializer.py @@ -92,10 +92,7 @@ class UserCSVReportSerializer(serializers.ModelSerializer): :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 - elif profile := obj.junior_profile.all().first(): + if profile := (obj.guardian_profile.all().first() or obj.junior_profile.all().first()): return f"+{profile.country_code}{profile.phone}" \ if profile.country_code and profile.phone else profile.phone else: @@ -120,9 +117,7 @@ class UserCSVReportSerializer(serializers.ModelSerializer): :param obj: user object :return: user type """ - if profile := obj.guardian_profile.all().first(): - return "Active" if profile.is_active else "Inactive" - elif profile := obj.junior_profile.all().first(): + if profile := (obj.guardian_profile.all().first() or obj.junior_profile.all().first()): return "Active" if profile.is_active else "Inactive" @staticmethod diff --git a/web_admin/serializers/user_management_serializer.py b/web_admin/serializers/user_management_serializer.py index 4bb0709..3544c66 100644 --- a/web_admin/serializers/user_management_serializer.py +++ b/web_admin/serializers/user_management_serializer.py @@ -5,7 +5,7 @@ web_admin user_management serializers file from rest_framework import serializers from django.contrib.auth import get_user_model -from base.constants import USER_TYPE +from base.constants import USER_TYPE, GUARDIAN, JUNIOR # local imports from base.messages import ERROR_CODE, SUCCESS_CODE from guardian.models import Guardian @@ -210,10 +210,10 @@ class JuniorSerializer(serializers.ModelSerializer): """ instance.auth.email = self.validated_data.get('email', instance.auth.email) instance.auth.username = self.validated_data.get('email', instance.auth.username) - instance.auth.save() + instance.auth.save(update_fields=['email', 'username']) instance.country_code = validated_data.get('country_code', instance.country_code) instance.phone = validated_data.get('phone', instance.phone) - instance.save() + instance.save(update_fields=['country_code', 'phone']) return instance @staticmethod @@ -265,33 +265,30 @@ class UserManagementDetailSerializer(serializers.ModelSerializer): model = USER fields = ('id', 'user_type', 'email', 'guardian_profile', 'junior_profile', 'associated_users') - @staticmethod - def get_user_type(obj): + def get_user_type(self, obj): """ :param obj: user object :return: user type """ - if obj.guardian_profile.all().first(): - return dict(USER_TYPE).get('2') - elif obj.junior_profile.all().first(): - return dict(USER_TYPE).get('1') - else: - return None + return GUARDIAN if self.context['user_type'] == GUARDIAN else JUNIOR - @staticmethod - def get_associated_users(obj): + def get_associated_users(self, obj): """ :param obj: user object :return: associated user """ - if profile := obj.guardian_profile.all().first(): + if self.context['user_type'] == GUARDIAN: + profile = obj.guardian_profile.all().only('user_id', 'guardian_code').first() if profile.guardian_code: - 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).select_related('auth') serializer = JuniorSerializer(junior, many=True) return serializer.data - elif profile := obj.junior_profile.all().first(): + elif self.context['user_type'] == JUNIOR: + profile = obj.junior_profile.all().only('auth_id', 'guardian_code').first() if profile.guardian_code: - guardian = Guardian.objects.filter(guardian_code__in=profile.guardian_code, is_verified=True) + guardian = Guardian.objects.filter(guardian_code__in=profile.guardian_code, + is_verified=True).select_related('user') serializer = GuardianSerializer(guardian, many=True) return serializer.data else: diff --git a/web_admin/views/analytics.py b/web_admin/views/analytics.py index b904af6..a503356 100644 --- a/web_admin/views/analytics.py +++ b/web_admin/views/analytics.py @@ -6,6 +6,9 @@ import datetime import io import pandas as pd import xlsxwriter +import tempfile +import oss2 +from django.conf import settings # third party imports from rest_framework.viewsets import GenericViewSet @@ -166,7 +169,8 @@ class AnalyticsViewSet(GenericViewSet): start_date = datetime.datetime.strptime(request.query_params.get('start_date'), DATE_FORMAT) end_date = datetime.datetime.strptime(request.query_params.get('end_date'), DATE_FORMAT) - buffer = io.BytesIO() # Use BytesIO for binary data + # Use BytesIO for binary data + buffer = io.BytesIO() # Create an XlsxWriter Workbook object workbook = xlsxwriter.Workbook(buffer) @@ -191,7 +195,8 @@ class AnalyticsViewSet(GenericViewSet): for user in serializer.data ]) for idx, col in enumerate(df_users.columns): - worksheet.write(0, idx, col) # Write header + # Write header + worksheet.write(0, idx, col) for row_num, row in enumerate(df_users.values, start=1): for col_num, value in enumerate(row): worksheet.write(row_num, col_num, value) @@ -208,7 +213,8 @@ class AnalyticsViewSet(GenericViewSet): ]) for idx, col in enumerate(df_tasks.columns): - worksheet.write(0, idx, col) # Write header + # Write header + worksheet.write(0, idx, col) for row_num, row in enumerate(df_tasks.values, start=1): for col_num, value in enumerate(row): worksheet.write(row_num, col_num, value) @@ -231,7 +237,8 @@ class AnalyticsViewSet(GenericViewSet): ]) for idx, col in enumerate(df_leaderboard.columns): - worksheet.write(0, idx, col) # Write header + # Write header + worksheet.write(0, idx, col) for row_num, row in enumerate(df_leaderboard.values, start=1): for col_num, value in enumerate(row): worksheet.write(row_num, col_num, value) @@ -244,5 +251,19 @@ class AnalyticsViewSet(GenericViewSet): response.write(buffer.getvalue()) buffer.close() - return response + filename = f"{'analytics'}/{'ZOD_Bank_Analytics.xlsx'}" + with tempfile.NamedTemporaryFile(delete=False) as temp_file: + """write image in temporary file""" + temp_file.write(response.content) + """auth of bucket""" + auth = oss2.Auth(settings.ALIYUN_OSS_ACCESS_KEY_ID, settings.ALIYUN_OSS_ACCESS_KEY_SECRET) + """fetch bucket details""" + bucket = oss2.Bucket(auth, settings.ALIYUN_OSS_ENDPOINT, settings.ALIYUN_OSS_BUCKET_NAME) + # Upload the temporary file to Alibaba OSS + bucket.put_object_from_file(filename, temp_file.name) + """create perfect url for image""" + new_filename = filename.replace(' ', '%20') + link = f"https://{settings.ALIYUN_OSS_BUCKET_NAME}.{settings.ALIYUN_OSS_ENDPOINT}/{new_filename}" + print(link) + return custom_response(None, link) diff --git a/web_admin/views/user_management.py b/web_admin/views/user_management.py index d1754aa..ecc9771 100644 --- a/web_admin/views/user_management.py +++ b/web_admin/views/user_management.py @@ -14,6 +14,8 @@ 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 guardian.models import Guardian +from junior.models import Junior from web_admin.permission import AdminPermission from web_admin.serializers.user_management_serializer import (UserManagementListSerializer, UserManagementDetailSerializer, GuardianSerializer, @@ -70,12 +72,14 @@ class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin, """ if self.request.query_params.get('user_type') not in [dict(USER_TYPE).get('1'), dict(USER_TYPE).get('2')]: return custom_error_response(ERROR_CODE['2067'], status.HTTP_400_BAD_REQUEST) + queryset = self.queryset - if self.request.query_params.get('user_type') == dict(USER_TYPE).get('2'): - queryset = queryset.filter(id=kwargs['pk']) - elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'): - queryset = queryset.filter(id=kwargs['pk']) - serializer = UserManagementDetailSerializer(queryset, many=True) + queryset = queryset.filter(id=kwargs['pk']) + + serializer = UserManagementDetailSerializer( + queryset, many=True, + context={'user_type': self.request.query_params.get('user_type')} + ) return custom_response(None, data=serializer.data) def partial_update(self, request, *args, **kwargs): @@ -87,15 +91,14 @@ class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin, """ if self.request.query_params.get('user_type') not in [dict(USER_TYPE).get('1'), dict(USER_TYPE).get('2')]: return custom_error_response(ERROR_CODE['2067'], status.HTTP_400_BAD_REQUEST) - queryset = self.queryset if self.request.query_params.get('user_type') == dict(USER_TYPE).get('2'): - user_obj = queryset.filter(id=kwargs['pk']).first() - serializer = GuardianSerializer(user_obj.guardian_profile.all().first(), + guardian = Guardian.objects.filter(user_id=kwargs['pk'], is_verified=True).first() + serializer = GuardianSerializer(guardian, request.data, context={'user_id': kwargs['pk']}) elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'): - user_obj = queryset.filter(id=kwargs['pk']).first() - serializer = JuniorSerializer(user_obj.junior_profile.all().first(), + junior = Junior.objects.filter(auth_id=kwargs['pk'], is_verified=True).select_related('auth').first() + serializer = JuniorSerializer(junior, request.data, context={'user_id': kwargs['pk']}) serializer.is_valid(raise_exception=True) diff --git a/zod_bank/settings.py b/zod_bank/settings.py index 3e0713c..781df80 100644 --- a/zod_bank/settings.py +++ b/zod_bank/settings.py @@ -125,6 +125,7 @@ SIMPLE_JWT = { # Database # https://docs.djangoproject.com/en/3.0/ref/settings/#databases DATABASES = { + # default db setting 'default': { 'ENGINE': 'django.contrib.gis.db.backends.postgis', 'NAME':os.getenv('DB_NAME'),