adjust citysite table name to activesites
This commit is contained in:
1 parent
fb0f996776
commit
64b37b6b6d
27 files changed
+382
-221
No files matched your search
+28
-20
@@ -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
|
||||
|
||||
|
||||
Reference in new issue
Block a user