diff --git a/apps/herd/exception.py b/apps/herd/exception.py index b9ce206..681b755 100644 --- a/apps/herd/exception.py +++ b/apps/herd/exception.py @@ -5,3 +5,8 @@ from rest_framework import status class UniqueRancherApiException(APIException): status_code = status.HTTP_403_FORBIDDEN default_detail = "دامدار با این کد ملی از قبل در سیستم وجود دارد" # noqa + + +class HerdCapacityException(APIException): + status_code = status.HTTP_403_FORBIDDEN + default_detail = "مقدار حجم سبک و سنگین وارد شده از ظرفیت گله بیشتر میباشد" # noqa diff --git a/apps/herd/web/api/v1/serializers.py b/apps/herd/web/api/v1/serializers.py index 88e0563..81f9f6d 100644 --- a/apps/herd/web/api/v1/serializers.py +++ b/apps/herd/web/api/v1/serializers.py @@ -4,8 +4,9 @@ from apps.authentication.api.v1.serializers.serializer import ( ProvinceSerializer, CitySerializer ) -from rest_framework import serializers +from apps.herd.exception import HerdCapacityException from apps.herd.models import Herd, Rancher +from rest_framework import serializers class HerdSerializer(serializers.ModelSerializer): @@ -14,6 +15,14 @@ class HerdSerializer(serializers.ModelSerializer): 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) diff --git a/apps/livestock/apps.py b/apps/livestock/apps.py index e7e5889..92dcc8c 100644 --- a/apps/livestock/apps.py +++ b/apps/livestock/apps.py @@ -4,3 +4,6 @@ from django.apps import AppConfig class LivestockConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'apps.livestock' + + def ready(self): + import apps.livestock.signals diff --git a/apps/livestock/signals.py b/apps/livestock/signals.py new file mode 100644 index 0000000..ff22074 --- /dev/null +++ b/apps/livestock/signals.py @@ -0,0 +1,31 @@ +from django.db.models.signals import post_save, post_delete +from django.dispatch import receiver +from django.db.models import Sum, Count, Q +from .models import LiveStock + + +def update_herd_statistics(instance: LiveStock): + """ + update light & heavy livestock number in rancher herd + """ + counts = LiveStock.objects.filter( + herd__rancher=instance.herd.rancher, + herd=instance.herd + ).aggregate( + light_livestock_number=Count('id', filter=Q(weight_type='L')), + heavy_livestock_number=Count('id', filter=Q(weight_type='H')) + ) + + instance.herd.light_livestock_number = counts['light_livestock_number'] + instance.herd.heavy_livestock_number = counts['heavy_livestock_number'] + instance.herd.save(update_fields=['light_livestock_number', 'heavy_livestock_number']) + + +@receiver(post_save, sender=LiveStock) +def update_herd_on_livestock_save(sender, instance, **kwargs): + update_herd_statistics(instance) + + +@receiver(post_delete, sender=LiveStock) +def update_herd_on_livestock_delete(sender, instance, **kwargs): + update_herd_statistics(instance)