ixg_platform/apps/compliance/serializers.py
ixgadmin d74f0814da Finish the wiki root move, zone map view and spec approval
- Follow home/user-guides/ through one GUIDE_PATH_PREFIX constant.
- Add a read-only Origin Zone detail view with the map as the main panel.
- Name due diligence explicitly and add its section headings.
- Add admin-only, four-eyes specification approval (portal and API).
- Empty the New-zone geometry placeholder instead of showing null.
2026-10-27 17:41:08 +00:00

141 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", "created_by", "status", "is_current", "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",
]