50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
"""Link HQ Site rows to ActiveSite registry entries (Pengaturan view list)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from apps.farms.models import Site
|
|
from apps.sync.models import ActiveSite
|
|
|
|
|
|
def ensure_hq_site_for_active_site(active_site: ActiveSite) -> Site:
|
|
"""
|
|
Ensure the active-site registry entry has an HQ Site for farm visibility.
|
|
|
|
Prefers an existing linked site, then an unlinked site owned by the
|
|
registrar with a matching name (so seeded Sukawarna attaches when
|
|
registered), otherwise creates a new Site.
|
|
"""
|
|
existing = Site.objects.filter(active_site=active_site).first()
|
|
if existing:
|
|
return existing
|
|
|
|
owner = active_site.registered_by
|
|
if owner is None:
|
|
raise ValueError("ActiveSite.registered_by is required to create an HQ site.")
|
|
|
|
site_name = (active_site.name or active_site.code or "Site")[:30]
|
|
orphan = (
|
|
Site.objects.filter(
|
|
user=owner, active_site__isnull=True, site_name__iexact=site_name
|
|
)
|
|
.order_by("pk")
|
|
.first()
|
|
)
|
|
if orphan is None and active_site.code:
|
|
# e.g. code "sukawarna" ↔ site_name "Sukawarna"
|
|
orphan = (
|
|
Site.objects.filter(
|
|
user=owner, active_site__isnull=True, site_name__iexact=active_site.code
|
|
)
|
|
.order_by("pk")
|
|
.first()
|
|
)
|
|
if orphan is not None:
|
|
orphan.active_site = active_site
|
|
orphan.save(update_fields=["active_site", "updated_at"])
|
|
return orphan
|
|
|
|
return Site.objects.create(
|
|
site_name=site_name, user=owner, active_site=active_site
|
|
)
|