update link registration site to executive dashboard
This commit is contained in:
1 parent
1e6f6b3b57
commit
d0d1ae7d24
26 files changed
+1044
-55
No files matched your search
@@ -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
|
||||
Reference in new issue
Block a user