130 lines
4.4 KiB
Python
130 lines
4.4 KiB
Python
from django.db import transaction
|
|
|
|
from rest_framework import serializers
|
|
|
|
from core.apps.orders.models import Offer, Order
|
|
from core.apps.counterparty.models import Counterparty
|
|
from core.apps.orders.serializers.order import OrderListSerializer
|
|
|
|
|
|
class OfferCreateSerializer(serializers.Serializer):
|
|
counterparty_id = serializers.UUIDField()
|
|
price = serializers.IntegerField()
|
|
phone = serializers.CharField(required=False)
|
|
comment = serializers.CharField(required=False)
|
|
qqs = serializers.BooleanField(required=False)
|
|
price_type = serializers.ChoiceField(Offer.PRICE_TYPE)
|
|
|
|
def validate(self, data):
|
|
counterparty = Counterparty.objects.filter(id=data['counterparty_id']).first()
|
|
if not counterparty:
|
|
raise serializers.ValidationError("Counterparty not found")
|
|
data['counterparty'] = counterparty
|
|
return data
|
|
|
|
|
|
class MultipleOfferCreateSerializer(serializers.Serializer):
|
|
order_id = serializers.UUIDField()
|
|
offers = OfferCreateSerializer(many=True)
|
|
|
|
def validate(self, data):
|
|
order = Order.objects.filter(id=data['order_id']).first()
|
|
if not order:
|
|
raise serializers.ValidationError("Order not found")
|
|
data['order'] = order
|
|
return data
|
|
|
|
def create(self, validated_data):
|
|
with transaction.atomic():
|
|
offers = []
|
|
for offer in validated_data.pop('offers'):
|
|
offers.append(
|
|
Offer(
|
|
order=validated_data.get('order'),
|
|
counterparty=offer['counterparty'],
|
|
price=offer['price'],
|
|
phone=offer.get('phone'),
|
|
comment=offer.get('comment'),
|
|
qqs=offer.get('qqs'),
|
|
price_type=offer.get('price_type')
|
|
)
|
|
)
|
|
|
|
created_offers = Offer.objects.bulk_create(offers)
|
|
return created_offers
|
|
|
|
class OfferListSerializer(serializers.ModelSerializer):
|
|
counterparty = serializers.SerializerMethodField(method_name='get_counterparty')
|
|
order = OrderListSerializer()
|
|
|
|
class Meta:
|
|
model = Offer
|
|
fields = [
|
|
'id', 'counterparty', 'price', 'number', 'phone', 'comment', 'qqs', 'price_type', 'order'
|
|
]
|
|
|
|
def get_counterparty(self, obj):
|
|
return {
|
|
'id': obj.counterparty.id,
|
|
'name': obj.counterparty.name
|
|
}
|
|
|
|
|
|
class OfferUpdateSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Offer
|
|
fields = [
|
|
'counterparty', 'price', 'number', 'phone', 'comment', 'qqs', 'price_type'
|
|
]
|
|
|
|
def update(self, instance, validated_data):
|
|
instance.counterparty = validated_data.get('counterparty', instance.counterparty)
|
|
instance.price = validated_data.get('price', instance.price)
|
|
instance.number = validated_data.get('number', instance.number)
|
|
instance.phone = validated_data.get('phone', instance.phone)
|
|
instance.comment = validated_data.get('comment', instance.comment)
|
|
instance.qqs = validated_data.get('qqs', instance.qqs)
|
|
instance.price_type = validated_data.get('price_type', instance.price_type)
|
|
instance.save()
|
|
return instance
|
|
|
|
|
|
class OffersSerializer(serializers.ModelSerializer):
|
|
counterparty = serializers.SerializerMethodField(method_name='get_counterparty')
|
|
|
|
class Meta:
|
|
model = Offer
|
|
fields = [
|
|
'id', 'number', 'price', 'price_type', 'phone', 'comment', 'qqs', 'counterparty', 'created_at'
|
|
]
|
|
|
|
def get_counterparty(self, obj):
|
|
return {
|
|
'id': obj.counterparty.id,
|
|
'name': obj.counterparty.name
|
|
}
|
|
|
|
|
|
class OrderListForOfferSerializer(serializers.ModelSerializer):
|
|
offers = OffersSerializer(many=True)
|
|
product = serializers.SerializerMethodField(method_name='get_product')
|
|
unity = serializers.SerializerMethodField(method_name='get_unity')
|
|
|
|
class Meta:
|
|
model = Order
|
|
fields = [
|
|
'id', 'product', 'unity', 'quantity', 'date', 'offers'
|
|
]
|
|
|
|
def get_product(self, obj):
|
|
return {
|
|
'id': obj.product.id,
|
|
'name': obj.product.name,
|
|
'type': obj.product.type,
|
|
}
|
|
|
|
def get_unity(self, obj):
|
|
return {
|
|
'id': obj.unity.id,
|
|
'value': obj.unity.value
|
|
} |