mirror of
https://github.com/HamzaSha1/zod-backend.git
synced 2025-07-15 18:07:02 +00:00
user detail api, changed image upload method
This commit is contained in:
Binary file not shown.
@ -41,7 +41,10 @@ def upload_image_to_alibaba(image, filename):
|
|||||||
# Save the image object to a temporary file
|
# Save the image object to a temporary file
|
||||||
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
|
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
|
||||||
"""write image in temporary file"""
|
"""write image in temporary file"""
|
||||||
temp_file.write(image.read())
|
if type(image) == bytes:
|
||||||
|
temp_file.write(image)
|
||||||
|
else:
|
||||||
|
temp_file.write(image.read())
|
||||||
"""auth of bucket"""
|
"""auth of bucket"""
|
||||||
auth = oss2.Auth(settings.ALIYUN_OSS_ACCESS_KEY_ID, settings.ALIYUN_OSS_ACCESS_KEY_SECRET)
|
auth = oss2.Auth(settings.ALIYUN_OSS_ACCESS_KEY_ID, settings.ALIYUN_OSS_ACCESS_KEY_SECRET)
|
||||||
"""fetch bucket details"""
|
"""fetch bucket details"""
|
||||||
|
@ -21,8 +21,8 @@ class ArticleCardSerializer(serializers.ModelSerializer):
|
|||||||
Article Card serializer
|
Article Card serializer
|
||||||
"""
|
"""
|
||||||
id = serializers.IntegerField(required=False)
|
id = serializers.IntegerField(required=False)
|
||||||
image = serializers.FileField(required=False)
|
image_name = serializers.CharField(required=False)
|
||||||
image_url = serializers.URLField(required=False)
|
image_url = serializers.CharField(required=False)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
"""
|
"""
|
||||||
@ -214,53 +214,3 @@ class DefaultArticleCardImageSerializer(serializers.ModelSerializer):
|
|||||||
|
|
||||||
card_image = DefaultArticleCardImage.objects.create(**validated_data)
|
card_image = DefaultArticleCardImage.objects.create(**validated_data)
|
||||||
return card_image
|
return card_image
|
||||||
|
|
||||||
|
|
||||||
class UserManagementListSerializer(serializers.ModelSerializer):
|
|
||||||
"""
|
|
||||||
user management serializer
|
|
||||||
"""
|
|
||||||
name = serializers.SerializerMethodField()
|
|
||||||
phone_number = serializers.SerializerMethodField()
|
|
||||||
user_type = serializers.SerializerMethodField()
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
"""
|
|
||||||
meta class
|
|
||||||
"""
|
|
||||||
model = USER
|
|
||||||
fields = ('name', 'email', 'phone_number', 'user_type', 'is_active')
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_name(obj):
|
|
||||||
"""
|
|
||||||
:param obj: user object
|
|
||||||
:return: full name
|
|
||||||
"""
|
|
||||||
return (obj.first_name + obj.last_name) if obj.last_name else obj.first_name
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_phone_number(obj):
|
|
||||||
"""
|
|
||||||
:param obj: user object
|
|
||||||
:return: user phone number
|
|
||||||
"""
|
|
||||||
if profile := obj.guardian_profile.all().first():
|
|
||||||
return profile.phone
|
|
||||||
elif profile := obj.junior_profile.all().first():
|
|
||||||
return profile.phone
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_user_type(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
|
|
||||||
|
135
web_admin/serializers/user_management_serializer.py
Normal file
135
web_admin/serializers/user_management_serializer.py
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
"""
|
||||||
|
web_admin user_management serializers file
|
||||||
|
"""
|
||||||
|
# django imports
|
||||||
|
from rest_framework import serializers
|
||||||
|
from django.contrib.auth import get_user_model
|
||||||
|
|
||||||
|
from base.constants import (ARTICLE_SURVEY_POINTS, MAX_ARTICLE_CARD, MIN_ARTICLE_SURVEY, MAX_ARTICLE_SURVEY, NUMBER,
|
||||||
|
USER_TYPE, ARTICLE_CARD_IMAGE_FOLDER)
|
||||||
|
# local imports
|
||||||
|
from base.messages import ERROR_CODE
|
||||||
|
from guardian.models import Guardian
|
||||||
|
from guardian.utils import upload_image_to_alibaba
|
||||||
|
from junior.models import Junior
|
||||||
|
from web_admin.models import Article, ArticleCard, SurveyOption, ArticleSurvey, DefaultArticleCardImage
|
||||||
|
from web_admin.utils import pop_id, get_image_url
|
||||||
|
|
||||||
|
USER = get_user_model()
|
||||||
|
|
||||||
|
|
||||||
|
class UserManagementListSerializer(serializers.ModelSerializer):
|
||||||
|
"""
|
||||||
|
user management serializer
|
||||||
|
"""
|
||||||
|
name = serializers.SerializerMethodField()
|
||||||
|
phone_number = serializers.SerializerMethodField()
|
||||||
|
user_type = serializers.SerializerMethodField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
"""
|
||||||
|
meta class
|
||||||
|
"""
|
||||||
|
model = USER
|
||||||
|
fields = ('id', 'name', 'email', 'phone_number', 'user_type', 'is_active')
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_name(obj):
|
||||||
|
"""
|
||||||
|
:param obj: user object
|
||||||
|
:return: full name
|
||||||
|
"""
|
||||||
|
return f"{obj.first_name} {obj.last_name}" if obj.last_name else obj.first_name
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_phone_number(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
|
||||||
|
elif profile := obj.junior_profile.all().first():
|
||||||
|
return f"+{profile.country_code}{profile.phone}" if profile.country_code and profile.phone else profile.phone
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_user_type(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
|
||||||
|
|
||||||
|
|
||||||
|
class GuardianSerializer(serializers.ModelSerializer):
|
||||||
|
name = serializers.SerializerMethodField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Guardian
|
||||||
|
fields = ('name', 'dob', 'gender', 'phone', 'is_active', 'country_name', 'image')
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_name(obj):
|
||||||
|
"""
|
||||||
|
:param obj: user object
|
||||||
|
:return: full name
|
||||||
|
"""
|
||||||
|
return f"{obj.user.first_name} {obj.user.last_name}" if obj.user.last_name else obj.user.first_name
|
||||||
|
|
||||||
|
|
||||||
|
class JuniorSerializer(serializers.ModelSerializer):
|
||||||
|
name = serializers.SerializerMethodField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Junior
|
||||||
|
fields = ('name', 'dob', 'gender', 'phone', 'is_active', 'country_name', 'image')
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_name(obj):
|
||||||
|
"""
|
||||||
|
:param obj: user object
|
||||||
|
:return: full name
|
||||||
|
"""
|
||||||
|
return f"{obj.auth.first_name} {obj.auth.last_name}" if obj.auth.last_name else obj.auth.first_name
|
||||||
|
|
||||||
|
|
||||||
|
class UserManagementDetailSerializer(serializers.ModelSerializer):
|
||||||
|
user_type = serializers.SerializerMethodField()
|
||||||
|
guardian_profile = GuardianSerializer(many=True)
|
||||||
|
junior_profile = JuniorSerializer(many=True)
|
||||||
|
associated_users = serializers.SerializerMethodField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
"""
|
||||||
|
meta class
|
||||||
|
"""
|
||||||
|
model = USER
|
||||||
|
fields = ('user_type', 'email', 'guardian_profile', 'junior_profile', 'associated_users')
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_user_type(obj):
|
||||||
|
"""
|
||||||
|
:param obj: user object
|
||||||
|
:return: user type
|
||||||
|
"""
|
||||||
|
profile = obj.guardian_profile.all().first()
|
||||||
|
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
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_associated_users(obj):
|
||||||
|
if profile := obj.guardian_profile.all().first():
|
||||||
|
junior = Junior.objects.filter(guardian_code__contains=[profile.guardian_code], is_verified=True)
|
||||||
|
serializer = JuniorSerializer(junior, many=True)
|
||||||
|
return serializer.data
|
@ -6,15 +6,16 @@ from django.urls import path, include
|
|||||||
from rest_framework import routers
|
from rest_framework import routers
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from web_admin.views.article import ArticleViewSet, DefaultArticleCardImagesViewSet, UserManagementViewSet
|
from web_admin.views.article import ArticleViewSet, DefaultArticleCardImagesViewSet
|
||||||
from web_admin.views.auth import ForgotAndResetPasswordViewSet
|
from web_admin.views.auth import ForgotAndResetPasswordViewSet
|
||||||
|
from web_admin.views.user_management import UserManagementViewSet
|
||||||
|
|
||||||
# initiate router
|
# initiate router
|
||||||
router = routers.SimpleRouter()
|
router = routers.SimpleRouter()
|
||||||
|
|
||||||
router.register('article', ArticleViewSet, basename='article')
|
router.register('article', ArticleViewSet, basename='article')
|
||||||
router.register('default-card-images', DefaultArticleCardImagesViewSet, basename='default-card-images')
|
router.register('default-card-images', DefaultArticleCardImagesViewSet, basename='default-card-images')
|
||||||
router.register('user', UserManagementViewSet, basename='user')
|
router.register('user-management', UserManagementViewSet, basename='user')
|
||||||
|
|
||||||
# forgot and reset password api for admin
|
# forgot and reset password api for admin
|
||||||
router.register('admin', ForgotAndResetPasswordViewSet, basename='admin')
|
router.register('admin', ForgotAndResetPasswordViewSet, basename='admin')
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
"""
|
"""
|
||||||
web_utils file
|
web_utils file
|
||||||
"""
|
"""
|
||||||
|
import base64
|
||||||
|
|
||||||
from base.constants import ARTICLE_CARD_IMAGE_FOLDER
|
from base.constants import ARTICLE_CARD_IMAGE_FOLDER
|
||||||
from guardian.utils import upload_image_to_alibaba
|
from guardian.utils import upload_image_to_alibaba
|
||||||
|
|
||||||
@ -16,8 +18,22 @@ def pop_id(data):
|
|||||||
|
|
||||||
|
|
||||||
def get_image_url(data):
|
def get_image_url(data):
|
||||||
if 'image_url' in data:
|
"""
|
||||||
|
to get image url
|
||||||
|
:param data:
|
||||||
|
:return: image url
|
||||||
|
"""
|
||||||
|
if 'image_url' in data and 'http' in data['image_url']:
|
||||||
|
if 'image_name' in data:
|
||||||
|
data.pop('image_name')
|
||||||
return data['image_url']
|
return data['image_url']
|
||||||
|
elif 'image_url' in data and type(data['image_url']) == str and data['image_url'].startswith('data:image'):
|
||||||
|
base64_image = base64.b64decode(data.get('image_url').split(',')[1])
|
||||||
|
image_name = f"{data['title']} | {data.pop('image_name')}" if 'image_name' in data else data['title']
|
||||||
|
filename = f"{ARTICLE_CARD_IMAGE_FOLDER}/{image_name}"
|
||||||
|
# upload image on ali baba
|
||||||
|
image_url = upload_image_to_alibaba(base64_image, filename)
|
||||||
|
return image_url
|
||||||
elif 'image' in data and data['image'] is not None:
|
elif 'image' in data and data['image'] is not None:
|
||||||
image = data.pop('image')
|
image = data.pop('image')
|
||||||
filename = f"{ARTICLE_CARD_IMAGE_FOLDER}/{image.name}"
|
filename = f"{ARTICLE_CARD_IMAGE_FOLDER}/{image.name}"
|
||||||
|
@ -16,8 +16,7 @@ from base.messages import SUCCESS_CODE, ERROR_CODE
|
|||||||
from web_admin.models import Article, ArticleCard, ArticleSurvey, DefaultArticleCardImage
|
from web_admin.models import Article, ArticleCard, ArticleSurvey, DefaultArticleCardImage
|
||||||
from web_admin.permission import AdminPermission
|
from web_admin.permission import AdminPermission
|
||||||
from web_admin.serializers.article_serializer import (ArticleSerializer, ArticleCardSerializer,
|
from web_admin.serializers.article_serializer import (ArticleSerializer, ArticleCardSerializer,
|
||||||
DefaultArticleCardImageSerializer,
|
DefaultArticleCardImageSerializer)
|
||||||
UserManagementListSerializer)
|
|
||||||
|
|
||||||
USER = get_user_model()
|
USER = get_user_model()
|
||||||
|
|
||||||
@ -195,30 +194,3 @@ class DefaultArticleCardImagesViewSet(GenericViewSet, mixins.CreateModelMixin, m
|
|||||||
return custom_response(None, data=serializer.data)
|
return custom_response(None, data=serializer.data)
|
||||||
|
|
||||||
|
|
||||||
class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin):
|
|
||||||
"""
|
|
||||||
api to manage (list, view, edit) user
|
|
||||||
"""
|
|
||||||
serializer_class = UserManagementListSerializer
|
|
||||||
permission_classes = []
|
|
||||||
queryset = USER.objects.prefetch_related(
|
|
||||||
'guardian_profile', 'junior_profile')
|
|
||||||
|
|
||||||
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)
|
|
||||||
elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'):
|
|
||||||
return self.queryset.filter(guardian_profile__isnull=True)
|
|
||||||
else:
|
|
||||||
return self.queryset
|
|
||||||
|
|
||||||
def list(self, request, *args, **kwargs):
|
|
||||||
"""
|
|
||||||
api method to list all the user
|
|
||||||
:param request:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
queryset = self.get_queryset()
|
|
||||||
serializer = self.serializer_class(queryset, many=True)
|
|
||||||
return custom_response(None, data=serializer.data)
|
|
||||||
|
|
||||||
|
58
web_admin/views/user_management.py
Normal file
58
web_admin/views/user_management.py
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
"""
|
||||||
|
web_admin user_management views file
|
||||||
|
"""
|
||||||
|
# django imports
|
||||||
|
from rest_framework.viewsets import GenericViewSet, mixins
|
||||||
|
from rest_framework.filters import OrderingFilter, SearchFilter
|
||||||
|
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
|
||||||
|
|
||||||
|
# local imports
|
||||||
|
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)
|
||||||
|
|
||||||
|
USER = get_user_model()
|
||||||
|
|
||||||
|
|
||||||
|
class UserManagementViewSet(GenericViewSet, mixins.ListModelMixin, mixins.RetrieveModelMixin):
|
||||||
|
"""
|
||||||
|
api to manage (list, view, edit) user
|
||||||
|
"""
|
||||||
|
serializer_class = UserManagementListSerializer
|
||||||
|
permission_classes = []
|
||||||
|
queryset = USER.objects.filter(is_superuser=False).prefetch_related(
|
||||||
|
'guardian_profile', 'junior_profile')
|
||||||
|
|
||||||
|
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)
|
||||||
|
elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'):
|
||||||
|
return self.queryset.filter(guardian_profile__isnull=True)
|
||||||
|
else:
|
||||||
|
return self.queryset
|
||||||
|
|
||||||
|
def list(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
api method to list all the user
|
||||||
|
:param request:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
queryset = self.get_queryset()
|
||||||
|
serializer = self.serializer_class(queryset, many=True)
|
||||||
|
return custom_response(None, data=serializer.data)
|
||||||
|
|
||||||
|
def retrieve(self, request, *args, **kwargs):
|
||||||
|
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'])
|
||||||
|
elif self.request.query_params.get('user_type') == dict(USER_TYPE).get('1'):
|
||||||
|
queryset = queryset.filter(junior_profile__auth__id=kwargs['pk'])
|
||||||
|
serializer = UserManagementDetailSerializer(queryset, many=True)
|
||||||
|
return custom_response(None, data=serializer.data)
|
Reference in New Issue
Block a user