from rest_framework import serializers from apps.accounts.serializers import PkAsIdMixin from apps.farms.models import Cycle, Flock, Kandang, Site class SiteSerializer(PkAsIdMixin, serializers.ModelSerializer): class Meta: model = Site fields = ["id", "site_name", "user", "created_at", "updated_at"] read_only_fields = ["id", "created_at", "updated_at"] class KandangSerializer(PkAsIdMixin, serializers.ModelSerializer): class Meta: model = Kandang fields = ["id", "kandang_name", "site", "created_at", "updated_at"] read_only_fields = ["id", "created_at", "updated_at"] class FlockSerializer(PkAsIdMixin, serializers.ModelSerializer): class Meta: model = Flock fields = ["id", "flock_name", "kandang", "created_at", "updated_at"] read_only_fields = ["id", "created_at", "updated_at"] class CycleSerializer(PkAsIdMixin, serializers.ModelSerializer): kandang = serializers.PrimaryKeyRelatedField(queryset=Kandang.objects.all()) kandang_name = serializers.CharField(source="kandang.kandang_name", read_only=True) chick_in_weight = serializers.IntegerField(source="doc_in_weight") current_day = serializers.IntegerField(read_only=True) visible_through_date = serializers.DateField(read_only=True) class Meta: model = Cycle fields = [ "id", "kandang", "kandang_name", "total_days", "current_day", "visible_through_date", "start_date", "end_date", "chick_in_weight", "doc_in_count", "feed_initial_balance", "feed_initial_balance_date", "status", "created_at", "updated_at", ] read_only_fields = [ "id", "kandang_name", "feed_initial_balance", "feed_initial_balance_date", "status", "created_at", "updated_at", ] def validate(self, attrs): attrs.pop("status", None) start = attrs.get("start_date", getattr(self.instance, "start_date", None)) end = attrs.get("end_date", getattr(self.instance, "end_date", None)) if start and end and end < start: raise serializers.ValidationError({"end_date": "Must be on or after start_date."}) return attrs def to_representation(self, instance): if instance.sync_status(): instance.save(update_fields=["status", "updated_at"]) return super().to_representation(instance)