adjust citysite table name to activesites

This commit is contained in:
Alberto-Audrix committed 2026-09-11 15:51:29 +07:00
1 parent fb0f996776
commit 64b37b6b6d
27 files changed
+382 -221

No files matched your search

+28 -20
View File
@@ -23,8 +23,8 @@ from apps.operations.services.karung_web import (
initial_balance_accuracy,
pull_initial_balance_iot,
)
from apps.farms.services.city_registry import ensure_hq_site_for_city
from apps.sync.models import CitySite
from apps.farms.services.active_site_registry import ensure_hq_site_for_active_site
from apps.sync.models import ActiveSite
def _validation_detail(exc: ValidationError):
@@ -35,7 +35,7 @@ def _validation_detail(exc: ValidationError):
return str(getattr(exc, "message", exc))
def _upsert_mirror_cycle_from_ingest(city: CitySite, payload: dict) -> Cycle:
def _upsert_mirror_cycle_from_ingest(active_site: ActiveSite, payload: dict) -> Cycle:
source_cycle_id = payload.get("source_cycle_id")
if not source_cycle_id:
raise ValidationError("source_cycle_id is required.")
@@ -46,15 +46,15 @@ def _upsert_mirror_cycle_from_ingest(city: CitySite, payload: dict) -> Cycle:
if start is None:
raise ValidationError("start_date is required.")
site_name = str(payload.get("site_name") or city.name)[:30]
site_name = str(payload.get("site_name") or active_site.name)[:30]
kandang_name = str(payload.get("kandang_name") or "Kandang")[:30]
owner = city.registered_by
owner = active_site.registered_by
if owner is None:
owner = User.objects.filter(status=User.STATUS_GM).first()
if owner is None:
raise ValidationError("No GM available to own mirrored site.")
site = ensure_hq_site_for_city(city)
site = ensure_hq_site_for_active_site(active_site)
if site.site_name != site_name and not Site.objects.filter(
user=owner, site_name=site_name
).exclude(pk=site.pk).exists():
@@ -67,11 +67,13 @@ def _upsert_mirror_cycle_from_ingest(city: CitySite, payload: dict) -> Cycle:
defaults={},
)
cycle = Cycle.objects.filter(city_site=city, source_cycle_id=source_cycle_id).first()
cycle = Cycle.objects.filter(
active_site=active_site, source_cycle_id=source_cycle_id
).first()
if cycle is None:
cycle = Cycle(
kandang=kandang,
city_site=city,
active_site=active_site,
source_cycle_id=source_cycle_id,
start_date=start,
end_date=None,
@@ -97,13 +99,15 @@ def _upsert_mirror_cycle_from_ingest(city: CitySite, payload: dict) -> Cycle:
@permission_classes([permissions.IsAuthenticated])
def cycle_close_ingest(request):
"""Site → pusat: register/update a pending close request."""
city_site_id = request.data.get("city_site_id")
active_site_id = request.data.get("active_site_id")
try:
city = CitySite.objects.get(pk=city_site_id, is_active=True)
except (CitySite.DoesNotExist, TypeError, ValueError):
return Response({"detail": "Invalid city_site_id."}, status=status.HTTP_400_BAD_REQUEST)
active_site = ActiveSite.objects.get(pk=active_site_id, is_active=True)
except (ActiveSite.DoesNotExist, TypeError, ValueError):
return Response(
{"detail": "Invalid active_site_id."}, status=status.HTTP_400_BAD_REQUEST
)
try:
cycle = _upsert_mirror_cycle_from_ingest(city, request.data)
cycle = _upsert_mirror_cycle_from_ingest(active_site, request.data)
except ValidationError as exc:
return Response({"detail": _validation_detail(exc)}, status=status.HTTP_400_BAD_REQUEST)
return Response(CycleSerializer(cycle).data)
@@ -113,13 +117,17 @@ def cycle_close_ingest(request):
@permission_classes([permissions.IsAuthenticated])
def cycle_close_cancel(request):
"""Site → pusat: cancel a pending close request."""
city_site_id = request.data.get("city_site_id")
active_site_id = request.data.get("active_site_id")
source_cycle_id = request.data.get("source_cycle_id")
try:
city = CitySite.objects.get(pk=city_site_id, is_active=True)
except (CitySite.DoesNotExist, TypeError, ValueError):
return Response({"detail": "Invalid city_site_id."}, status=status.HTTP_400_BAD_REQUEST)
cycle = Cycle.objects.filter(city_site=city, source_cycle_id=source_cycle_id).first()
active_site = ActiveSite.objects.get(pk=active_site_id, is_active=True)
except (ActiveSite.DoesNotExist, TypeError, ValueError):
return Response(
{"detail": "Invalid active_site_id."}, status=status.HTTP_400_BAD_REQUEST
)
cycle = Cycle.objects.filter(
active_site=active_site, source_cycle_id=source_cycle_id
).first()
if cycle is None:
return Response({"detail": "Mirror cycle not found."}, status=status.HTTP_404_NOT_FOUND)
try:
@@ -132,7 +140,7 @@ def cycle_close_cancel(request):
class IsDirectorAdminForWrite(permissions.BasePermission):
"""Reads for any authenticated executive; structure writes for director_admin.
Mirrored farm structures should normally arrive via city sync. Manual
Mirrored farm structures should normally arrive via active-site sync. Manual
create/edit/delete is reserved for director_admin (bootstrap / repair).
"""
@@ -192,7 +200,7 @@ class FlockViewSet(viewsets.ModelViewSet):
class CycleViewSet(viewsets.ModelViewSet):
queryset = Cycle.objects.select_related(
"kandang", "close_approved_by", "city_site", "kandang__site"
"kandang", "close_approved_by", "active_site", "kandang__site"
).all()
serializer_class = CycleSerializer