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)
 |