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()
Beispiel #2
0
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
Beispiel #4
0
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
Beispiel #5
0
class UserImageSerializer(serializers.ModelSerializer):
    image = Base64ImageField()

    class Meta:
        model = UserImage
        fields = ('id', 'image', 'title', 'description')
Beispiel #6
0
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
Beispiel #7
0
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)
Beispiel #8
0
class Base64ImageSerializer(serializers.Serializer):
    image = Base64ImageField(max_length=None, use_url=True)
Beispiel #9
0
class ProductBannerWriteSerializer(serializers.ModelSerializer):
    Image = Base64ImageField(max_length=None, use_url=True)

    class Meta:
        model = ProductBanner
        fields = ['id', 'Image']
Beispiel #10
0
class ProductImagesSerializer(serializers.Serializer):
    product = serializers.UUIDField()
    images = serializers.ListField(
        child=Base64ImageField(max_length=None, use_url=True)
    )