from apps.authentication.api.v1.serializers.serializer import ( UserSerializer, OrganizationSerializer, ProvinceSerializer, CitySerializer ) from apps.herd.exception import HerdCapacityException from apps.herd.models import Herd, Rancher from rest_framework import serializers class HerdSerializer(serializers.ModelSerializer): """ Herd Serializer """ class Meta: model = Herd fields = '__all__' def validate(self, attrs): """ some validations for herd """ if attrs['heavy_livestock_number'] + attrs['light_livestock_number'] > attrs['capacity']: raise HerdCapacityException() return attrs 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 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