84 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
from rest_framework import serializers
 | 
						|
from apps.utils.serializers import CustomModelSerializer
 | 
						|
from apps.sam.models import Customer, Contract, Order, OrderItem
 | 
						|
from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE
 | 
						|
from rest_framework.exceptions import ValidationError
 | 
						|
from apps.mtm.serializers import MaterialSerializer
 | 
						|
 | 
						|
 | 
						|
class CustomerSerializer(CustomModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = Customer
 | 
						|
        fields = '__all__'
 | 
						|
        read_only_fields = EXCLUDE_FIELDS + ['belong_dept']
 | 
						|
 | 
						|
 | 
						|
class ContractSerializer(CustomModelSerializer):
 | 
						|
    customer_name = serializers.CharField(
 | 
						|
        source='customer.name', read_only=True)
 | 
						|
    create_by_name = serializers.CharField(
 | 
						|
        source='create_by.name', read_only=True)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = Contract
 | 
						|
        fields = '__all__'
 | 
						|
        read_only_fields = EXCLUDE_FIELDS + ['belong_dept', 'invoice']
 | 
						|
 | 
						|
 | 
						|
class OrderSerializer(CustomModelSerializer):
 | 
						|
    customer_name = serializers.CharField(
 | 
						|
        source='customer.name', read_only=True)
 | 
						|
    contract_number = serializers.CharField(
 | 
						|
        source='contract.number', read_only=True)
 | 
						|
    create_by_name = serializers.CharField(
 | 
						|
        source='create_by.name', read_only=True)
 | 
						|
    update_by_name = serializers.CharField(
 | 
						|
        source='update_by.name', read_only=True)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = Order
 | 
						|
        fields = '__all__'
 | 
						|
        read_only_fields = EXCLUDE_FIELDS + \
 | 
						|
            ['belong_dept', 'state', 'submit_time']
 | 
						|
 | 
						|
    def validate(self, attrs):
 | 
						|
        contract = attrs.get('contract', None)
 | 
						|
        if contract:
 | 
						|
            attrs['customer'] = contract.customer
 | 
						|
        if attrs.get('customer', None) is None:
 | 
						|
            raise ValidationError('未选择客户')
 | 
						|
        return attrs
 | 
						|
 | 
						|
    def update(self, instance, validated_data):
 | 
						|
        if instance.state != Order.ORDER_CREATE:
 | 
						|
            raise ValidationError('订单信息不可编辑')
 | 
						|
        return super().update(instance, validated_data)
 | 
						|
 | 
						|
 | 
						|
class OrderItemSerializer(CustomModelSerializer):
 | 
						|
    material_ = MaterialSerializer(source='material', read_only=True)
 | 
						|
    order_ = OrderSerializer(source='order', read_only=True)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = OrderItem
 | 
						|
        fields = '__all__'
 | 
						|
        read_only_fields = EXCLUDE_FIELDS_BASE + ['delivered_count']
 | 
						|
 | 
						|
    def validate(self, attrs):
 | 
						|
        order = attrs['order']
 | 
						|
        if order.state != Order.ORDER_CREATE:
 | 
						|
            raise ValidationError('该订单状态下不可创建')
 | 
						|
        return attrs
 | 
						|
 | 
						|
    def create(self, validated_data):
 | 
						|
        order = validated_data['order']
 | 
						|
        material = validated_data['material']
 | 
						|
        if OrderItem.objects.filter(order=order, material=material).exists():
 | 
						|
            raise ValidationError('该产品已选择!')
 | 
						|
        return super().create(validated_data)
 | 
						|
 | 
						|
    def update(self, instance, validated_data):
 | 
						|
        validated_data.pop('product', None)
 | 
						|
        validated_data.pop('order', None)
 | 
						|
        return super().update(instance, validated_data)
 |