mirror of
https://github.com/HamzaSha1/zod-backend.git
synced 2025-07-15 18:07:02 +00:00
csv/excel method changed, uploading to alibaba cloud and providing link to frontend
This commit is contained in:
@ -92,10 +92,7 @@ class UserCSVReportSerializer(serializers.ModelSerializer):
|
|||||||
:param obj: user object
|
:param obj: user object
|
||||||
:return: user phone number
|
:return: user phone number
|
||||||
"""
|
"""
|
||||||
if profile := obj.guardian_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
|
|
||||||
elif profile := obj.junior_profile.all().first():
|
|
||||||
return f"+{profile.country_code}{profile.phone}" \
|
return f"+{profile.country_code}{profile.phone}" \
|
||||||
if profile.country_code and profile.phone else profile.phone
|
if profile.country_code and profile.phone else profile.phone
|
||||||
else:
|
else:
|
||||||
@ -120,9 +117,7 @@ class UserCSVReportSerializer(serializers.ModelSerializer):
|
|||||||
:param obj: user object
|
:param obj: user object
|
||||||
:return: user type
|
:return: user type
|
||||||
"""
|
"""
|
||||||
if profile := obj.guardian_profile.all().first():
|
if profile := (obj.guardian_profile.all().first() or obj.junior_profile.all().first()):
|
||||||
return "Active" if profile.is_active else "Inactive"
|
|
||||||
elif profile := obj.junior_profile.all().first():
|
|
||||||
return "Active" if profile.is_active else "Inactive"
|
return "Active" if profile.is_active else "Inactive"
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -5,7 +5,7 @@ web_admin user_management serializers file
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
|
|
||||||
from base.constants import USER_TYPE
|
from base.constants import USER_TYPE, GUARDIAN, JUNIOR
|
||||||
# local imports
|
# local imports
|
||||||
from base.messages import ERROR_CODE, SUCCESS_CODE
|
from base.messages import ERROR_CODE, SUCCESS_CODE
|
||||||
from guardian.models import Guardian
|
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.email = self.validated_data.get('email', instance.auth.email)
|
||||||
instance.auth.username = self.validated_data.get('email', instance.auth.username)
|
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.country_code = validated_data.get('country_code', instance.country_code)
|
||||||
instance.phone = validated_data.get('phone', instance.phone)
|
instance.phone = validated_data.get('phone', instance.phone)
|
||||||
instance.save()
|
instance.save(update_fields=['country_code', 'phone'])
|
||||||
return instance
|
return instance
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -265,33 +265,30 @@ class UserManagementDetailSerializer(serializers.ModelSerializer):
|
|||||||
model = USER
|
model = USER
|
||||||
fields = ('id', '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(self, obj):
|
||||||
def get_user_type(obj):
|
|
||||||
"""
|
"""
|
||||||
:param obj: user object
|
:param obj: user object
|
||||||
:return: user type
|
:return: user type
|
||||||
"""
|
"""
|
||||||
if obj.guardian_profile.all().first():
|
return GUARDIAN if self.context['user_type'] == GUARDIAN else JUNIOR
|
||||||
return dict(USER_TYPE).get('2')
|
|
||||||
elif obj.junior_profile.all().first():
|
|
||||||
return dict(USER_TYPE).get('1')
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
@staticmethod
|
def get_associated_users(self, obj):
|
||||||
def get_associated_users(obj):
|
|
||||||
"""
|
"""
|
||||||
:param obj: user object
|
:param obj: user object
|
||||||
:return: associated user
|
: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:
|
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)
|
serializer = JuniorSerializer(junior, many=True)
|
||||||
return serializer.data
|
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:
|
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)
|
serializer = GuardianSerializer(guardian, many=True)
|
||||||
return serializer.data
|
return serializer.data
|
||||||
else:
|
else:
|
||||||
|
@ -6,6 +6,9 @@ import datetime
|
|||||||
import io
|
import io
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
import xlsxwriter
|
import xlsxwriter
|
||||||
|
import tempfile
|
||||||
|
import oss2
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
# third party imports
|
# third party imports
|
||||||
from rest_framework.viewsets import GenericViewSet
|
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)
|
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)
|
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
|
# Create an XlsxWriter Workbook object
|
||||||
workbook = xlsxwriter.Workbook(buffer)
|
workbook = xlsxwriter.Workbook(buffer)
|
||||||
@ -191,7 +195,8 @@ class AnalyticsViewSet(GenericViewSet):
|
|||||||
for user in serializer.data
|
for user in serializer.data
|
||||||
])
|
])
|
||||||
for idx, col in enumerate(df_users.columns):
|
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 row_num, row in enumerate(df_users.values, start=1):
|
||||||
for col_num, value in enumerate(row):
|
for col_num, value in enumerate(row):
|
||||||
worksheet.write(row_num, col_num, value)
|
worksheet.write(row_num, col_num, value)
|
||||||
@ -208,7 +213,8 @@ class AnalyticsViewSet(GenericViewSet):
|
|||||||
])
|
])
|
||||||
|
|
||||||
for idx, col in enumerate(df_tasks.columns):
|
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 row_num, row in enumerate(df_tasks.values, start=1):
|
||||||
for col_num, value in enumerate(row):
|
for col_num, value in enumerate(row):
|
||||||
worksheet.write(row_num, col_num, value)
|
worksheet.write(row_num, col_num, value)
|
||||||
@ -231,7 +237,8 @@ class AnalyticsViewSet(GenericViewSet):
|
|||||||
])
|
])
|
||||||
|
|
||||||
for idx, col in enumerate(df_leaderboard.columns):
|
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 row_num, row in enumerate(df_leaderboard.values, start=1):
|
||||||
for col_num, value in enumerate(row):
|
for col_num, value in enumerate(row):
|
||||||
worksheet.write(row_num, col_num, value)
|
worksheet.write(row_num, col_num, value)
|
||||||
@ -244,5 +251,19 @@ class AnalyticsViewSet(GenericViewSet):
|
|||||||
response.write(buffer.getvalue())
|
response.write(buffer.getvalue())
|
||||||
buffer.close()
|
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)
|
||||||
|
|
||||||
|
@ -14,6 +14,8 @@ from django.db.models import Q
|
|||||||
from account.utils import custom_response, custom_error_response
|
from account.utils import custom_response, custom_error_response
|
||||||
from base.constants import USER_TYPE
|
from base.constants import USER_TYPE
|
||||||
from base.messages import SUCCESS_CODE, ERROR_CODE
|
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.permission import AdminPermission
|
||||||
from web_admin.serializers.user_management_serializer import (UserManagementListSerializer,
|
from web_admin.serializers.user_management_serializer import (UserManagementListSerializer,
|
||||||
UserManagementDetailSerializer, GuardianSerializer,
|
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')]:
|
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)
|
return custom_error_response(ERROR_CODE['2067'], status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
queryset = self.queryset
|
queryset = self.queryset
|
||||||
if self.request.query_params.get('user_type') == dict(USER_TYPE).get('2'):
|
queryset = queryset.filter(id=kwargs['pk'])
|
||||||
queryset = queryset.filter(id=kwargs['pk'])
|
|
||||||
elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'):
|
serializer = UserManagementDetailSerializer(
|
||||||
queryset = queryset.filter(id=kwargs['pk'])
|
queryset, many=True,
|
||||||
serializer = UserManagementDetailSerializer(queryset, many=True)
|
context={'user_type': self.request.query_params.get('user_type')}
|
||||||
|
)
|
||||||
return custom_response(None, data=serializer.data)
|
return custom_response(None, data=serializer.data)
|
||||||
|
|
||||||
def partial_update(self, request, *args, **kwargs):
|
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')]:
|
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)
|
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'):
|
if self.request.query_params.get('user_type') == dict(USER_TYPE).get('2'):
|
||||||
user_obj = queryset.filter(id=kwargs['pk']).first()
|
guardian = Guardian.objects.filter(user_id=kwargs['pk'], is_verified=True).first()
|
||||||
serializer = GuardianSerializer(user_obj.guardian_profile.all().first(),
|
serializer = GuardianSerializer(guardian,
|
||||||
request.data, context={'user_id': kwargs['pk']})
|
request.data, context={'user_id': kwargs['pk']})
|
||||||
|
|
||||||
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'):
|
||||||
user_obj = queryset.filter(id=kwargs['pk']).first()
|
junior = Junior.objects.filter(auth_id=kwargs['pk'], is_verified=True).select_related('auth').first()
|
||||||
serializer = JuniorSerializer(user_obj.junior_profile.all().first(),
|
serializer = JuniorSerializer(junior,
|
||||||
request.data, context={'user_id': kwargs['pk']})
|
request.data, context={'user_id': kwargs['pk']})
|
||||||
|
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
|
@ -125,6 +125,7 @@ SIMPLE_JWT = {
|
|||||||
# Database
|
# Database
|
||||||
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
|
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
|
# default db setting
|
||||||
'default': {
|
'default': {
|
||||||
'ENGINE': 'django.contrib.gis.db.backends.postgis',
|
'ENGINE': 'django.contrib.gis.db.backends.postgis',
|
||||||
'NAME':os.getenv('DB_NAME'),
|
'NAME':os.getenv('DB_NAME'),
|
||||||
|
Reference in New Issue
Block a user