ixg_platform/apps/compliance/serializers.py
ixgadmin 6a3a902045 Enforce the intake allocation limit in the lineage API
The ops lineage screen refuses to allocate more of an intake than was
received, counting every batch, but POST /api/intake-batch-lineage/ accepted
9999 kg against a 100 kg intake. Move the rule into a shared helper so the
screen and the serializer refuse the same allocations.
2026-09-17 14:48:04 +00:00

138 lines
5 KiB
Python

from rest_framework import serializers
from . import services
from .models import (
ProductSpecification, SpecParameter,
Facility, OriginZone, CollectorGroup, HarvestIntake, IntakeBatchLineage,
DueDiligenceCase, EUDREvidence, RiskAssessment, MitigationAction,
DueDiligenceStatementReference,
)
class SpecParameterSerializer(serializers.ModelSerializer):
class Meta:
model = SpecParameter
fields = "__all__"
read_only_fields = ["id"]
class ProductSpecificationSerializer(serializers.ModelSerializer):
parameters = SpecParameterSerializer(many=True, required=False)
approved_by_name = serializers.CharField(source="approved_by.full_name", read_only=True)
class Meta:
model = ProductSpecification
fields = "__all__"
read_only_fields = ["id", "approved_by", "approved_at", "created_at", "updated_at"]
class FacilitySerializer(serializers.ModelSerializer):
class Meta:
model = Facility
fields = "__all__"
read_only_fields = ["id", "created_at"]
class OriginZoneSerializer(serializers.ModelSerializer):
facility_name = serializers.CharField(source="facility.name", read_only=True)
verified_by_name = serializers.CharField(source="verified_by.full_name", read_only=True)
class Meta:
model = OriginZone
fields = "__all__"
read_only_fields = ["id", "verified_by", "verified_at", "created_at"]
class CollectorGroupSerializer(serializers.ModelSerializer):
class Meta:
model = CollectorGroup
fields = "__all__"
read_only_fields = ["id", "created_at"]
class HarvestIntakeSerializer(serializers.ModelSerializer):
origin_zone_code = serializers.CharField(source="origin_zone.zone_code", read_only=True)
collector_group_name = serializers.CharField(source="collector_group.name", read_only=True)
class Meta:
model = HarvestIntake
fields = "__all__"
read_only_fields = ["id", "created_at"]
class IntakeBatchLineageSerializer(serializers.ModelSerializer):
batch_reference = serializers.CharField(source="batch.batch_reference", read_only=True)
intake_reference = serializers.CharField(source="harvest_intake.intake_reference", read_only=True)
class Meta:
model = IntakeBatchLineage
fields = "__all__"
read_only_fields = ["id", "created_at"]
def validate(self, attrs):
intake = attrs.get("harvest_intake") or getattr(
self.instance, "harvest_intake", None
)
weight = attrs.get("weight_allocated_kg")
if weight is None and self.instance is not None:
weight = self.instance.weight_allocated_kg
if intake is not None and weight is not None:
message = services.intake_allocation_error(
intake, weight, exclude_lineage=self.instance
)
if message:
raise serializers.ValidationError({"weight_allocated_kg": message})
return attrs
class EUDREvidenceSerializer(serializers.ModelSerializer):
verified_by_name = serializers.CharField(source="verified_by.full_name", read_only=True)
class Meta:
model = EUDREvidence
fields = "__all__"
read_only_fields = ["id", "verified_by", "verified_at", "created_at"]
class RiskAssessmentSerializer(serializers.ModelSerializer):
assessed_by_name = serializers.CharField(source="assessed_by.full_name", read_only=True)
class Meta:
model = RiskAssessment
fields = "__all__"
read_only_fields = ["id", "assessed_at", "assessed_by"]
class MitigationActionSerializer(serializers.ModelSerializer):
class Meta:
model = MitigationAction
fields = "__all__"
read_only_fields = ["id", "created_at"]
class DueDiligenceStatementReferenceSerializer(serializers.ModelSerializer):
submitted_by_name = serializers.CharField(source="submitted_by.full_name", read_only=True)
class Meta:
model = DueDiligenceStatementReference
fields = "__all__"
read_only_fields = ["id", "submitted_by", "created_at"]
class DueDiligenceCaseSerializer(serializers.ModelSerializer):
batch_reference = serializers.CharField(source="batch.batch_reference", read_only=True)
approved_by_name = serializers.CharField(source="approved_by.full_name", read_only=True)
assessed_by_name = serializers.CharField(source="assessed_by.full_name", read_only=True)
evidence = EUDREvidenceSerializer(many=True, read_only=True)
risk_assessments = RiskAssessmentSerializer(many=True, read_only=True)
mitigation_actions = MitigationActionSerializer(many=True, read_only=True)
statement_references = DueDiligenceStatementReferenceSerializer(many=True, read_only=True)
class Meta:
model = DueDiligenceCase
fields = "__all__"
read_only_fields = [
"id", "status", "risk_level", "completeness_results", "assessed_by",
"assessed_at", "approved_by", "approved_at", "rejected_reason",
"created_at", "updated_at",
]