from rest_framework import serializers from rest_framework import exceptions from apps.inm.models import IProduct from apps.inm.serializers import IProductListSerializer from apps.mtm.serializers import MaterialSimpleSerializer from apps.sam.models import Sale, SaleProduct from apps.sam.serializers import CustomerSimpleSerializer, OrderSimpleSerializer from django.db import transaction from rest_framework.exceptions import ValidationError class SaleCreateSerializer(serializers.ModelSerializer): iproducts = serializers.PrimaryKeyRelatedField(queryset= IProduct.objects.all(), many=True) class Meta: model = Sale fields = ['customer', 'order', 'product', 'iproducts', 'edelivery_date', 'trans_mode', 'receiver', 'receiver_phone' , 'receiver_address', 'remark'] def validate(self, attrs): order = attrs.get('order', None) if order: if order.customer: attrs['customer'] = order.customer attrs['product'] = order.product ips = IProduct.objects.filter(id__in=[i.id for i in attrs['iproducts']]) if ips.exclude(state=IProduct.SALE_OK).exists(): raise exceptions.APIException('选取了非可用的产品') if ips.count() != ips.filter(material=attrs['product']).count(): raise exceptions.APIException('产品选取错误') return super().validate(attrs) class SaleListSerializer(serializers.ModelSerializer): customer_ = CustomerSimpleSerializer(source='customer', read_only=True) order_ = OrderSimpleSerializer(source='order', read_only=True) product_ = MaterialSimpleSerializer(source='product', read_only=True) class Meta: model = Sale fields = '__all__' class SaleProductListSerializer(serializers.ModelSerializer): iproduct_ = IProductListSerializer(source='iproduct', read_only=True) class Meta: model = SaleProduct fields = '__all__' class SaleProductCreateSerializer(serializers.ModelSerializer): class Meta: model = SaleProduct fields = ['sale', 'iproduct'] def create(self, validated_data): with transaction.atomic(): validated_data['number'] = validated_data['iproduct'].number instance = SaleProduct.objects.create(**validated_data) sale = instance.sale sale.count = SaleProduct.objects.filter(sale=instance.sale).count() sale.save() order = sale.order if order: if sale.count+order.delivered_count>order.count: raise exceptions.APIException('超过订单所需数量') return instance