diff --git a/poizonstore/utils.py b/poizonstore/utils.py new file mode 100644 index 0000000..e411fb0 --- /dev/null +++ b/poizonstore/utils.py @@ -0,0 +1,6 @@ +from rest_framework.fields import DecimalField + + +class PriceField(DecimalField): + def __init__(self, *args, max_digits=10, decimal_places=2, min_value=0, **kwargs): + super().__init__(*args, max_digits=max_digits, decimal_places=decimal_places, min_value=min_value, **kwargs) diff --git a/store/serializers.py b/store/serializers.py index 94b4557..52700b9 100644 --- a/store/serializers.py +++ b/store/serializers.py @@ -6,6 +6,7 @@ from account.serializers import UserSerializer from utils.exceptions import CRMException from store.models import Checklist, GlobalSettings, Category, PaymentMethod, Promocode, Image, Gift from store.utils import get_primary_key_related_model +from poizonstore.utils import PriceField class ImageSerializer(serializers.ModelSerializer): @@ -36,7 +37,7 @@ class CategoryChecklistSerializer(serializers.ModelSerializer): class CategorySerializer(serializers.ModelSerializer): - chinarush = serializers.DecimalField(source='delivery_price_CN_RU', max_digits=10, decimal_places=2) + chinarush = PriceField(source='delivery_price_CN_RU') class Meta: model = Category @@ -56,6 +57,7 @@ class CategoryFullSerializer(CategorySerializer): class GiftSerializer(serializers.ModelSerializer): image = Base64ImageField(required=False, allow_null=True) + min_price = PriceField() class Meta: model = Gift @@ -79,17 +81,17 @@ class ChecklistSerializer(serializers.ModelSerializer): use_bonuses = serializers.BooleanField(write_only=True, default=False) gift = get_primary_key_related_model(GiftSerializer, required=False, allow_null=True) - yuan_rate = serializers.DecimalField(read_only=True, max_digits=10, decimal_places=2) - price_yuan = serializers.DecimalField(required=False, max_digits=10, decimal_places=2) + yuan_rate = PriceField(read_only=True) + price_yuan = PriceField(required=False) price_rub = serializers.IntegerField(read_only=True) - delivery_price_CN = serializers.DecimalField(read_only=True, max_digits=10, decimal_places=2) - delivery_price_CN_RU = serializers.DecimalField(read_only=True, max_digits=10, decimal_places=2) + delivery_price_CN = PriceField(read_only=True) + delivery_price_CN_RU = PriceField(read_only=True) - full_price = serializers.IntegerField(read_only=True) - real_price = serializers.DecimalField(required=False, allow_null=True, max_digits=10, decimal_places=2) + full_price = PriceField(read_only=True) + real_price = PriceField(required=False, allow_null=True) - commission_rub = serializers.DecimalField(read_only=True, max_digits=10, decimal_places=2) + commission_rub = PriceField(read_only=True) customer = get_primary_key_related_model(UserSerializer, required=False, allow_null=True) @@ -237,15 +239,16 @@ class ClientUpdateChecklistSerializer(ClientChecklistSerializerMixin, ChecklistS class GlobalSettingsSerializer(serializers.ModelSerializer): - currency = serializers.DecimalField(source='full_yuan_rate', read_only=True, max_digits=10, decimal_places=2) - yuan_rate_last_updated = serializers.DateTimeField(read_only=True) - chinadelivery = serializers.DecimalField(source='delivery_price_CN', max_digits=10, decimal_places=2) - commission = serializers.DecimalField(source='commission_rub', max_digits=10, decimal_places=2) + yuan_rate = PriceField(source='full_yuan_rate', read_only=True) + yuan_rate_commission = PriceField() + chinadelivery = PriceField(source='delivery_price_CN') + commission = PriceField(source='commission_rub') pickup = serializers.CharField(source='pickup_address') class Meta: model = GlobalSettings - fields = ('currency', 'yuan_rate_last_updated', 'yuan_rate_commission', 'commission', 'chinadelivery', 'pickup', 'time_to_buy') + fields = ('yuan_rate', 'yuan_rate_last_updated', 'yuan_rate_commission', 'commission', 'chinadelivery', 'pickup', 'time_to_buy') + read_only_fields = ('yuan_rate_last_updated',) class AnonymousGlobalSettingsSerializer(GlobalSettingsSerializer):