124 lines
4.5 KiB
Python
124 lines
4.5 KiB
Python
from rest_framework import serializers
|
|
|
|
from apps.authentication.api.v1.serializers.serializer import (
|
|
OrganizationSerializer,
|
|
ProvinceSerializer,
|
|
CitySerializer
|
|
)
|
|
from apps.herd.exception import HerdCapacityException, HerdException
|
|
from apps.herd.models import Herd, Rancher, RancherOrganizationLink
|
|
|
|
|
|
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['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)
|
|
|
|
if instance.province:
|
|
representation['province'] = {
|
|
'id': instance.province.id,
|
|
'name': instance.province.name
|
|
}
|
|
|
|
if instance.city:
|
|
representation['city'] = {
|
|
'id': instance.city.id,
|
|
'name': instance.city.name
|
|
}
|
|
|
|
representation['organizations'] = [
|
|
{'id': item.organization.id, 'name': item.organization.name}
|
|
for item in instance.organization_links.all()
|
|
]
|
|
|
|
return representation
|
|
|
|
|
|
class RancherOrganizationLinkSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = RancherOrganizationLink
|
|
fields = '__all__'
|
|
|
|
def validate(self, attrs):
|
|
rancher = attrs['rancher']
|
|
organization = attrs['organization']
|
|
|
|
if not self.instance:
|
|
if self.Meta.model.objects.filter(rancher=rancher, organization=organization).exists():
|
|
raise HerdException(message="دامدار برای تعاونی مد نظر از قبل وجود دارد", status_code=403) # noqa
|
|
|
|
elif self.Meta.model.objects.filter(
|
|
rancher=rancher,
|
|
organization__parent_organization=organization.parent_organization
|
|
).exists():
|
|
raise HerdException(
|
|
message="دامدار نمیتواند زیر مجموعه دو تعاونی با اتحادیه یکسان باشند", # noqa
|
|
status_code=403
|
|
)
|
|
|
|
if self.instance:
|
|
if rancher.city not in organization.service_area.all():
|
|
raise HerdException(message="دامدار در محدوده فعالیت تعاونی قرار ندارد", status_code=403) # noqa
|
|
|
|
elif self.instance.organization == organization:
|
|
raise HerdException(message="دامدار برای تعاونی مد نظر از قبل وجود دارد", status_code=403) # noqa
|
|
|
|
elif self.instance.organization.parent_organization == organization.parent_organization:
|
|
raise HerdException(
|
|
message="دامدار نمیتواند زیر مجموعه دو تعاونی با اتحادیه یکسان باشند", # noqa
|
|
status_code=403
|
|
)
|
|
|
|
return attrs
|
|
|
|
def to_representation(self, instance):
|
|
representation = super().to_representation(instance)
|
|
|
|
if instance.rancher:
|
|
representation['rancher'] = RancherSerializer(instance.rancher).data
|
|
|
|
if instance.organization:
|
|
representation['organization'] = {
|
|
"id": instance.organization.id,
|
|
"name": instance.organization.name,
|
|
"province": instance.organization.province.name,
|
|
"city": instance.organization.city.name
|
|
}
|
|
|
|
return representation
|