Files
dashboard-cpsp/backend/apps/operations/serializers.py
T
2026-08-26 13:46:05 +07:00

136 lines
4.6 KiB
Python

from django.db import transaction
from rest_framework import serializers
from apps.operations.models import (
AIInsight,
ChickenCounting,
ChickenWeight,
FeedSacks,
IotPanel,
KPI,
ManualInput,
)
from apps.accounts.serializers import PkAsIdMixin
from apps.operations.services.manual_input import recompute_manual_totals
class CycleContextMixin(serializers.Serializer):
kandang = serializers.IntegerField(source="cycle.kandang_id", read_only=True)
flock_id = serializers.SerializerMethodField()
def get_flock_id(self, obj):
flock = obj.cycle.flocks.order_by("flock_id").first()
return flock.pk if flock is not None else None
class KPISerializer(PkAsIdMixin, CycleContextMixin, serializers.ModelSerializer):
class Meta:
model = KPI
fields = "__all__"
read_only_fields = ["id", "created_at", "updated_at"]
class ManualInputSerializer(PkAsIdMixin, CycleContextMixin, serializers.ModelSerializer):
class Meta:
model = ManualInput
fields = "__all__"
read_only_fields = [
"id",
"created_at",
"updated_at",
"mortality_manual_total",
"feed_in_manual_total",
"feed_use_manual_total",
"harvest_manual_total",
"harvest_weight_manual_total",
"average_harvest_day_manual",
"average_harvest_weight_manual",
"fcr_manual",
"eef_manual",
]
validators = []
def create(self, validated_data):
return self._upsert(validated_data)
def update(self, instance, validated_data):
validated_data.setdefault("cycle", instance.cycle)
validated_data.setdefault("date", instance.date)
return self._upsert(validated_data, instance=instance)
def _upsert(self, validated_data, instance=None):
cycle = validated_data.get("cycle") or (instance.cycle if instance else None)
row_date = validated_data.get("date") or (instance.date if instance else None)
defaults = {
"age_manual": validated_data.get("age_manual", instance.age_manual if instance else 0),
"mortality_manual": validated_data.get(
"mortality_manual", instance.mortality_manual if instance else 0
),
"feed_in_manual": validated_data.get(
"feed_in_manual", instance.feed_in_manual if instance else 0
),
"feed_use_manual": validated_data.get(
"feed_use_manual", instance.feed_use_manual if instance else 0
),
"harvest_manual": validated_data.get(
"harvest_manual", instance.harvest_manual if instance else 0
),
"harvest_weight_manual": validated_data.get(
"harvest_weight_manual", instance.harvest_weight_manual if instance else 0
),
"manual_weight": validated_data.get(
"manual_weight", instance.manual_weight if instance else 0.0
),
}
with transaction.atomic():
row, _created = ManualInput.objects.update_or_create(
cycle=cycle,
date=row_date,
defaults=defaults,
)
recompute_manual_totals(cycle)
row.refresh_from_db()
return row
class ChickenCountingSerializer(PkAsIdMixin, CycleContextMixin, serializers.ModelSerializer):
class Meta:
model = ChickenCounting
fields = "__all__"
read_only_fields = ["id", "created_at", "updated_at"]
class ChickenWeightSerializer(PkAsIdMixin, CycleContextMixin, serializers.ModelSerializer):
class Meta:
model = ChickenWeight
fields = "__all__"
read_only_fields = ["id", "created_at", "updated_at"]
class FeedSacksSerializer(PkAsIdMixin, CycleContextMixin, serializers.ModelSerializer):
class Meta:
model = FeedSacks
fields = "__all__"
read_only_fields = ["id", "created_at", "updated_at"]
class IotPanelSerializer(PkAsIdMixin, serializers.ModelSerializer):
kandang = serializers.SerializerMethodField()
flock_id = serializers.IntegerField(read_only=True)
class Meta:
model = IotPanel
fields = "__all__"
read_only_fields = ["id", "created_at", "updated_at"]
def get_kandang(self, obj):
cycle = getattr(obj.flock, "cycle", None)
return cycle.kandang_id if cycle is not None else None
class AIInsightSerializer(PkAsIdMixin, CycleContextMixin, serializers.ModelSerializer):
class Meta:
model = AIInsight
fields = "__all__"
read_only_fields = ["id", "created_at", "updated_at"]