"""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 )