diff --git a/celerybeat-schedule b/celerybeat-schedule index 71062ba..4a51b89 100644 Binary files a/celerybeat-schedule and b/celerybeat-schedule differ diff --git a/guardian/utils.py b/guardian/utils.py index 920a119..9a6ae05 100644 --- a/guardian/utils.py +++ b/guardian/utils.py @@ -41,7 +41,10 @@ def upload_image_to_alibaba(image, filename): # Save the image object to a temporary file with tempfile.NamedTemporaryFile(delete=False) as temp_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 = oss2.Auth(settings.ALIYUN_OSS_ACCESS_KEY_ID, settings.ALIYUN_OSS_ACCESS_KEY_SECRET) """fetch bucket details""" diff --git a/web_admin/serializers/article_serializer.py b/web_admin/serializers/article_serializer.py index f3b5d06..b7dbf69 100644 --- a/web_admin/serializers/article_serializer.py +++ b/web_admin/serializers/article_serializer.py @@ -21,8 +21,8 @@ class ArticleCardSerializer(serializers.ModelSerializer): Article Card serializer """ id = serializers.IntegerField(required=False) - image = serializers.FileField(required=False) - image_url = serializers.URLField(required=False) + image_name = serializers.CharField(required=False) + image_url = serializers.CharField(required=False) class Meta: """ @@ -214,53 +214,3 @@ class DefaultArticleCardImageSerializer(serializers.ModelSerializer): card_image = DefaultArticleCardImage.objects.create(**validated_data) 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 diff --git a/web_admin/serializers/user_management_serializer.py b/web_admin/serializers/user_management_serializer.py new file mode 100644 index 0000000..9e1920b --- /dev/null +++ b/web_admin/serializers/user_management_serializer.py @@ -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 diff --git a/web_admin/urls.py b/web_admin/urls.py index 5fbe21e..30645a2 100644 --- a/web_admin/urls.py +++ b/web_admin/urls.py @@ -6,15 +6,16 @@ from django.urls import path, include from rest_framework import routers # 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.user_management import UserManagementViewSet # initiate router router = routers.SimpleRouter() router.register('article', ArticleViewSet, basename='article') 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 router.register('admin', ForgotAndResetPasswordViewSet, basename='admin') diff --git a/web_admin/utils.py b/web_admin/utils.py index 6ecd5e3..6cdc240 100644 --- a/web_admin/utils.py +++ b/web_admin/utils.py @@ -1,6 +1,8 @@ """ web_utils file """ +import base64 + from base.constants import ARTICLE_CARD_IMAGE_FOLDER from guardian.utils import upload_image_to_alibaba @@ -16,8 +18,22 @@ def pop_id(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'] + 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: image = data.pop('image') filename = f"{ARTICLE_CARD_IMAGE_FOLDER}/{image.name}" diff --git a/web_admin/views/article.py b/web_admin/views/article.py index 5b0ca92..b8f8a1f 100644 --- a/web_admin/views/article.py +++ b/web_admin/views/article.py @@ -16,8 +16,7 @@ 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.article_serializer import (ArticleSerializer, ArticleCardSerializer, - DefaultArticleCardImageSerializer, - UserManagementListSerializer) + DefaultArticleCardImageSerializer) USER = get_user_model() @@ -195,30 +194,3 @@ class DefaultArticleCardImagesViewSet(GenericViewSet, mixins.CreateModelMixin, m 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) - diff --git a/web_admin/views/user_management.py b/web_admin/views/user_management.py new file mode 100644 index 0000000..ffca49d --- /dev/null +++ b/web_admin/views/user_management.py @@ -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)