update link registration site to executive dashboard

This commit is contained in:
Alberto-Audrix committed 2026-09-15 09:44:45 +07:00
1 parent 1e6f6b3b57
commit d0d1ae7d24
26 files changed
+1044 -55

No files matched your search

+14 -10
View File
@@ -10,6 +10,7 @@ from django.conf import settings
from apps.farms.models import Cycle
logger = logging.getLogger(__name__)
@@ -19,35 +20,38 @@ class PusatCloseError(Exception):
super().__init__(message)
def _configured() -> bool:
return bool(
settings.PUSAT_BASE_URL
and settings.PUSAT_API_KEY
and settings.PUSAT_CITY_SITE_ID
)
def _active_site_id_for_cycle(cycle: Cycle) -> int | None:
site = cycle.kandang.site
if site.pusat_active_site_id is not None:
return int(site.pusat_active_site_id)
return None
def _configured(active_site_id: int | None) -> bool:
return bool(settings.PUSAT_BASE_URL and settings.PUSAT_API_KEY and active_site_id)
def notify_pusat_close_request(cycle: Cycle, *, cancelled: bool = False) -> None:
"""POST ingest/cancel to pusat. Raises PusatCloseError on failure when configured."""
if not _configured():
active_site_id = _active_site_id_for_cycle(cycle)
if not _configured(active_site_id):
logger.info("Pusat close channel not configured; skipping notify for cycle %s", cycle.pk)
return
base = settings.PUSAT_BASE_URL.rstrip("/")
headers = {"X-API-Key": settings.PUSAT_API_KEY, "Content-Type": "application/json"}
city_site_id = int(settings.PUSAT_CITY_SITE_ID)
try:
if cancelled:
url = f"{base}/cycle-close/cancel/"
payload: dict[str, Any] = {
"city_site_id": city_site_id,
"active_site_id": active_site_id,
"source_cycle_id": cycle.pk,
}
else:
url = f"{base}/cycle-close/ingest/"
payload = {
"city_site_id": city_site_id,
"active_site_id": active_site_id,
"source_cycle_id": cycle.pk,
"kandang_name": cycle.kandang.kandang_name,
"site_name": cycle.kandang.site.site_name,
@@ -0,0 +1,111 @@
"""Register this site deployment with executive ActiveSite registry."""
from __future__ import annotations
import logging
from typing import Any
import httpx
from django.conf import settings
from django.utils import timezone
from django.utils.text import slugify
from apps.farms.models import Site
logger = logging.getLogger(__name__)
class PusatRegisterError(Exception):
def __init__(self, message: str):
self.message = message
super().__init__(message)
def _normalize_code(value: str) -> str:
code = slugify(str(value or "").strip())[:64]
if not code:
raise PusatRegisterError("Kode tidak valid.")
return code
def _site_already_registered(site: Site) -> bool:
return bool(site.pusat_active_site_id and site.pusat_code)
def register_site_to_pusat(
*,
site: Site,
code: str,
allow_code_change: bool = False,
) -> Site:
"""
POST to executive register-from-site and persist fields on Site.
First-time register: allow_code_change=False.
Change code after register: allow_code_change=True (requires existing registration).
"""
base = (settings.PUSAT_BASE_URL or "").rstrip("/")
api_key = (settings.PUSAT_API_KEY or "").strip()
site_api = (settings.SITE_API_BASE_URL or "").rstrip("/")
if not base:
raise PusatRegisterError("PUSAT_BASE_URL belum dikonfigurasi.")
if not api_key:
raise PusatRegisterError("PUSAT_API_KEY belum dikonfigurasi.")
if not site_api:
raise PusatRegisterError("SITE_API_BASE_URL belum dikonfigurasi.")
normalized = _normalize_code(code)
already = _site_already_registered(site)
if allow_code_change:
if not already:
raise PusatRegisterError("Site belum terdaftar ke pusat — daftar dulu.")
if site.pusat_code == normalized:
raise PusatRegisterError("Kode baru sama dengan kode saat ini.")
elif already:
raise PusatRegisterError(
f"Site sudah terdaftar ke pusat dengan kode '{site.pusat_code}'. "
"Gunakan Ubah kode untuk mengganti."
)
url = f"{base}/active-sites/register-from-site/"
payload = {
"code": normalized,
"site_id": site.pk,
"name": site.site_name,
"api_base_url": site_api,
"api_key": api_key,
}
headers = {"X-API-Key": api_key, "Content-Type": "application/json"}
try:
with httpx.Client(timeout=30) as client:
response = client.post(url, json=payload, headers=headers)
except httpx.HTTPError as exc:
logger.exception("Pusat register failed for site %s", site.pk)
raise PusatRegisterError("gagal daftar ke pusat — coba lagi") from exc
if response.status_code >= 400:
detail = response.text[:300]
action = "ubah kode" if allow_code_change else "daftar"
raise PusatRegisterError(
f"gagal {action} ke pusat — coba lagi ({response.status_code}: {detail})"
)
try:
data: dict[str, Any] = response.json()
except ValueError as exc:
raise PusatRegisterError("respons pusat tidak valid") from exc
active_site_id = data.get("id")
if active_site_id is None:
raise PusatRegisterError("pusat tidak mengembalikan id active site")
site.pusat_code = data.get("code") or normalized
site.pusat_active_site_id = int(active_site_id)
site.pusat_registered_at = timezone.now()
site.save(
update_fields=["pusat_code", "pusat_active_site_id", "pusat_registered_at", "updated_at"]
)
return site