Files
RasadDam_Backend/apps/herd/pos/api/v1/serializers.py

85 lines
2.8 KiB
Python

from apps.authentication.api.v1.serializers.serializer import (
UserSerializer,
OrganizationSerializer,
ProvinceSerializer,
CitySerializer
)
from apps.herd.exception import UniqueRancherApiException
from apps.livestock import models as livestock_models
from rest_framework import serializers
from apps.herd.models import Herd, Rancher
from django.db.transaction import atomic
class HerdSerializer(serializers.ModelSerializer):
""" Herd Serializer """
class Meta:
model = Herd
fields = '__all__'
def to_representation(self, instance):
""" Customize serializer output """
representation = super().to_representation(instance)
if isinstance(instance, Herd):
if instance.owner:
representation['owner'] = instance.owner.id
representation['cooperative'] = OrganizationSerializer(instance.cooperative).data
representation['province'] = ProvinceSerializer(instance.province).data
representation['city'] = CitySerializer(instance.city).data
if instance.contractor:
representation['contractor'] = OrganizationSerializer(instance.contractor).data
representation['rancher'] = RancherSerializer(instance.rancher).data
return representation
class RancherSerializer(serializers.ModelSerializer):
class Meta:
model = Rancher
fields = '__all__'
def create(self, validated_data):
""" create rancher in pos device (without herd) """
data = self.context['request'].data.copy()
with atomic():
rancher = Rancher.objects.create(**validated_data) # create rancher
if 'livestock' in data.keys():
live_stocks = data['livestock']
livestock_types = {stock.id: stock for stock in livestock_models.LiveStockType.objects.all()}
for stock in live_stocks:
livestock_models.TemporaryLiveStock.objects.create(
livestock_type=livestock_types.get(stock.pop('livestock_type')),
rancher=rancher,
**stock
)
return rancher
def validate(self, attrs):
""" some validations for operations relate to rancher """
if self.Meta.model.objects.filter(national_code=attrs['national_code']).exists():
raise UniqueRancherApiException()
return attrs
def to_representation(self, instance):
""" customize output of serializer """
representation = super().to_representation(instance)
representation['province'] = {
'id': instance.province.id,
'name': instance.province.name
}
representation['city'] = {
'id': instance.city.id,
'name': instance.city.name
}
return representation