class ShopLogisticUnitSerializer(serializers.ModelSerializer): shop = serializers.SlugRelatedField(slug_field='Slug', queryset=Shop.objects.all()) constraint_id = serializers.SerializerMethodField() metric_id = serializers.SerializerMethodField() cities_count = serializers.SerializerMethodField() products_count = serializers.SerializerMethodField() logo = Base64ImageField(max_length=None, use_url=True, allow_empty_file=False, required=False) class Meta: model = ShopLogisticUnit fields = ('id', 'shop', 'name', 'description', 'logo', 'is_active', 'is_publish', 'constraint_id', 'metric_id', 'cities_count', 'products_count', ) read_only_fields = ('id', 'is_publish', ) def get_constraint_id(self, obj): return obj.constraint.id if hasattr(obj, 'constraint') else None def get_metric_id(self, obj): return obj.calculation_metric.id if hasattr(obj, 'calculation_metric') else None def get_cities_count(self, obj): if not obj.constraint or not obj.constraint.cities: return 0 return obj.constraint.cities.count() def get_products_count(self, obj): if not obj.constraint or not obj.constraint.products: return 0 return obj.constraint.products.count()
class ProductBannerWithProductSerializer(serializers.ModelSerializer): FK_Product = serializers.SlugRelatedField( queryset=Product.objects.all(), slug_field='Slug') Image = Base64ImageField(max_length=None, use_url=True) class Meta: model = ProductBanner fields = [ 'id', 'Image', 'FK_Product' ]
class ShopLogisticUnitFullSerializer(serializers.ModelSerializer): shop = serializers.SlugRelatedField(slug_field='Slug', queryset=Shop.objects.all()) constraint = ShopLogisticUnitConstraintWithoutM2MSerializer(read_only=False, required=False) calculation_metric = ShopLogisticUnitCalculationMetricSerializer(read_only=False, required=False) cities_count = serializers.SerializerMethodField() products_count = serializers.SerializerMethodField() logo = Base64ImageField(max_length=None, use_url=True, allow_empty_file=False, required=False) class Meta: model = ShopLogisticUnit fields = ('id', 'shop', 'name', 'description', 'logo', 'logo_type', 'is_active', 'is_publish', 'constraint', 'calculation_metric', 'cities_count', 'products_count', ) read_only_fields = ('id', 'is_publish', ) def get_constraint_id(self, obj): return obj.constraint.id if hasattr(obj, 'constraint') else None def get_metric_id(self, obj): return obj.calculation_metric.id if hasattr(obj, 'calculation_metric') else None def get_cities_count(self, obj): if not obj.constraint or not obj.constraint.cities: return 0 return obj.constraint.cities.count() def get_products_count(self, obj): if not obj.constraint or not obj.constraint.products: return 0 return obj.constraint.products.count() def update(self, instance, validated_data): constraint_dict = validated_data.pop('constraint', {}) metric_dict = validated_data.pop('calculation_metric', {}) instance = super().update(instance, validated_data) constraint = instance.constraint for key, value in constraint_dict.items(): setattr(constraint, key, value) constraint.save() metric = instance.calculation_metric for key, value in metric_dict.items(): setattr(metric, key, value) metric.save() return instance
class NewProfileSerializer(serializers.ModelSerializer): FK_User = UserSerializer(many=False, read_only=False) Image = Base64ImageField( max_length=None, use_url=True, allow_empty_file=False, required=False) class Meta: model = Profile fields = [ 'id', 'NationalCode', 'MobileNumber', 'FK_User', 'BrithDay', 'Image', 'State', 'BigCity', 'City', 'Sex', 'Bio', 'image'] read_only_fields = ['MobileNumber'] extra_kwargs = { 'NationalCode': {'validators': []}, } def update(self, instance, validated_data): if 'Image' in validated_data: instance.Image = validated_data.pop('Image') user = validated_data.pop('FK_User') instance.user.first_name = user.get('first_name') instance.user.last_name = user.get('last_name') for prop in validated_data: setattr(instance, prop, validated_data[prop]) instance.user.save() instance.save() return instance
class UserImageSerializer(serializers.ModelSerializer): image = Base64ImageField() class Meta: model = UserImage fields = ('id', 'image', 'title', 'description')
class ShopAllSettingsSerializer(serializers.ModelSerializer): FK_ShopManager = UserProfileSerializer( many=False, read_only=False, required=False) bank_account = ShopBankAccountSerializer( many=False, read_only=False, required=False) social_media = ShopSocialMediaSerializer( many=False, read_only=False, required=False) Image = Base64ImageField( max_length=None, use_url=True, allow_empty_file=False, required=False) class Meta: model = Shop fields = [ 'Title', 'Slug', 'Image', 'image_thumbnail_url', 'bank_account', 'social_media', 'Description', 'FK_ShopManager', ] read_only_fields = ['Title', 'Slug', 'image_thumbnail_url'] def validate(self, data): if 'FK_ShopManager' in data: national_code = data['FK_ShopManager']['User_Profile'][ 'NationalCode'] duplicated = Profile.objects.filter(NationalCode=national_code) if self.context.get('user'): duplicated = duplicated.exclude( FK_User=self.context.get('user')) if duplicated.exists(): raise serializers.ValidationError( {'errors': 'کد ملی وارد شده از قبل در سایت وجود دارد.'}) return data def update(self, instance, validated_data): profile = instance.FK_ShopManager.User_Profile user_data = validated_data.pop( 'FK_ShopManager') if 'FK_ShopManager' in validated_data else {} profile_data = user_data.pop( 'User_Profile') if 'User_Profile' in user_data else {} bank_account = instance.bank_account if hasattr( instance, 'bank_account') else ShopBankAccount.objects.create( shop=instance) bank_account_data = validated_data.pop( 'bank_account') if 'bank_account' in validated_data else {} social_media = instance.social_media if hasattr( instance, 'social_media') else ShopSocialMedia.objects.create( shop=instance) social_media_data = validated_data.pop( 'social_media') if 'social_media' in validated_data else {} image = validated_data.pop( 'Image') if 'Image' in validated_data else None for prop in validated_data: setattr(instance, prop, validated_data[prop]) if image: instance.Image = image instance.save() for prop in profile_data: setattr(profile, prop, profile_data[prop]) profile.save() for prop in bank_account_data: setattr(bank_account, prop, bank_account_data[prop]) bank_account.save() for prop in social_media_data: setattr(social_media, prop, social_media_data[prop]) social_media.save() return instance
class ProductOwnerWriteSerializer(serializers.ModelSerializer): category = serializers.PrimaryKeyRelatedField( read_only=False, many=False, queryset=Category.objects.all()) Image = Base64ImageField(max_length=None, use_url=True) Product_Banner = ProductBannerWriteSerializer(many=True, read_only=False) post_range = serializers.PrimaryKeyRelatedField( source='post_range_cities', read_only=False, many=True, queryset=City.objects.all()) class Meta: model = Product fields = [ 'ID', 'Title', 'Inventory', 'Price', 'OldPrice', 'Net_Weight', 'Weight_With_Packing', 'Description', 'Status', 'Image', 'Product_Banner', 'PostRangeType', 'PreparationDays', 'category', 'post_range' ] def create(self, validated_data): banners = validated_data.pop('Product_Banner') post_range_cities = validated_data.pop('post_range_cities') instance = Product.objects.create(**validated_data) instance.post_range_cities.add(*post_range_cities) banners = [ProductBanner.objects.create( FK_Product=instance, Image=banner['Image']) for banner in banners] instance.Product_Banner.add(*banners) return instance def update(self, instance, validated_data): self.__update_banners(instance, validated_data) self.__update_post_range(instance, validated_data) for prop, value in validated_data.items(): setattr(instance, prop, value) instance.save() return instance def __update_banners(self, instance, validated_data): if 'Product_Banner' not in validated_data: return instance.Product_Banner.clear() product_banners = [ ProductBanner.objects.create( FK_Product=instance, Image=banner['Image']) for banner in validated_data.pop('Product_Banner')] instance.Product_Banner.add(*product_banners) def __update_post_range(self, instance, validated_data): if 'post_range_cities' not in validated_data: return instance.post_range_cities.clear() product_post_ranges = validated_data.pop('post_range_cities') instance.post_range_cities.add(*product_post_ranges)
class Base64ImageSerializer(serializers.Serializer): image = Base64ImageField(max_length=None, use_url=True)
class ProductBannerWriteSerializer(serializers.ModelSerializer): Image = Base64ImageField(max_length=None, use_url=True) class Meta: model = ProductBanner fields = ['id', 'Image']
class ProductImagesSerializer(serializers.Serializer): product = serializers.UUIDField() images = serializers.ListField( child=Base64ImageField(max_length=None, use_url=True) )