modified yml file, default article card image upload api,

This commit is contained in:
abutalib-kiwi
2023-07-25 14:09:51 +05:30
parent 0a5eaa233f
commit 6e84814117
7 changed files with 255 additions and 22 deletions

View File

@ -3,14 +3,18 @@ web_admin 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
from base.constants import ARTICLE_SURVEY_POINTS, MAX_ARTICLE_CARD, MIN_ARTICLE_SURVEY, MAX_ARTICLE_SURVEY, NUMBER, \
USER_TYPE
# local imports
from base.messages import ERROR_CODE
from guardian.utils import upload_image_to_alibaba
from web_admin.models import Article, ArticleCard, SurveyOption, ArticleSurvey
from web_admin.models import Article, ArticleCard, SurveyOption, ArticleSurvey, DefaultArticleCardImage
from web_admin.utils import pop_id
USER = get_user_model()
class ArticleCardSerializer(serializers.ModelSerializer):
"""
@ -18,23 +22,25 @@ class ArticleCardSerializer(serializers.ModelSerializer):
"""
id = serializers.IntegerField(required=False)
image = serializers.FileField(required=False)
image_url = serializers.URLField(required=False)
class Meta:
"""
meta class
"""
model = ArticleCard
fields = ('id', 'title', 'description', 'image')
fields = ('id', 'title', 'description', 'image', 'image_url')
def create(self, validated_data):
image = validated_data.get('image', '')
filename = f"article/{image.name}"
# upload image on ali baba
validated_data['image'] = upload_image_to_alibaba(image, filename)
if 'image' in validated_data and validated_data['image'] is not None:
image = validated_data.pop('image')
filename = f"article/{image.name}"
# upload image on ali baba
validated_data['image_url'] = upload_image_to_alibaba(image, filename)
article_card = ArticleCard.objects.create(article_id='1', **validated_data)
return article_card
class SurveyOptionSerializer(serializers.ModelSerializer):
"""
survey option serializer
@ -81,7 +87,6 @@ class ArticleSerializer(serializers.ModelSerializer):
def validate(self, attrs):
"""
to validate request data
:param attrs:
:return: validated attrs
"""
article_cards = attrs.get('article_cards', None)
@ -97,7 +102,6 @@ class ArticleSerializer(serializers.ModelSerializer):
"""
to create article.
ID in post data dict is for update api.
:param validated_data:
:return: article object
"""
article_cards = validated_data.pop('article_cards')
@ -107,6 +111,11 @@ class ArticleSerializer(serializers.ModelSerializer):
for card in article_cards:
card = pop_id(card)
if 'image' in card and card['image'] is not None:
image = card.pop('image')
filename = f"article/{image.name}"
# upload image on ali baba
card['image_url'] = upload_image_to_alibaba(image, filename)
ArticleCard.objects.create(article=article, **card)
for survey in article_survey:
@ -122,8 +131,7 @@ class ArticleSerializer(serializers.ModelSerializer):
def update(self, instance, validated_data):
"""
to update article and related table
:param instance:
:param validated_data:
:param instance: article object,
:return: article object
"""
article_cards = validated_data.pop('article_cards')
@ -139,10 +147,19 @@ class ArticleSerializer(serializers.ModelSerializer):
card = ArticleCard.objects.get(id=card_id, article=instance)
card.title = card_data.get('title', card.title)
card.description = card_data.get('description', card.description)
card.image = card_data.get('image', card.image)
if 'image' in card_data and card_data['image'] is not None:
image = card_data.pop('image')
filename = f"article/{image.name}"
# upload image on ali baba
card.image_url = upload_image_to_alibaba(image, filename)
card.save()
else:
card_data = pop_id(card_data)
if 'image' in card_data and card_data['image'] is not None:
image = card_data.pop('image')
filename = f"article/{image.name}"
# upload image on ali baba
card_data['image_url'] = upload_image_to_alibaba(image, filename)
ArticleCard.objects.create(article=instance, **card_data)
# Update or create survey sections
@ -170,3 +187,93 @@ class ArticleSerializer(serializers.ModelSerializer):
SurveyOption.objects.create(survey=survey, **option_data)
return instance
class DefaultArticleCardImageSerializer(serializers.ModelSerializer):
"""
Article Card serializer
"""
image = serializers.FileField(required=False)
image_url = serializers.URLField(required=False)
class Meta:
"""
meta class
"""
model = DefaultArticleCardImage
fields = ('image_name', 'image', 'image_url')
def validate(self, attrs):
"""
to validate data
:return: validated data
"""
if 'image' not in attrs and attrs.get('image') is None:
raise serializers.ValidationError({'details': 'insert image'})
return attrs
def create(self, validated_data):
"""
to create and upload image
:return: card_image object
"""
image = validated_data.pop('image')
filename = f"article/{image.name}"
if image and image.size == NUMBER['zero']:
raise serializers.ValidationError(ERROR_CODE['2035'])
# upload image on ali baba
validated_data['image_url'] = upload_image_to_alibaba(image, filename)
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