44 lines
1.4 KiB
Python
44 lines
1.4 KiB
Python
"""Link HQ Site rows to CitySite registry entries (Pengaturan view list)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from apps.farms.models import Site
|
|
from apps.sync.models import CitySite
|
|
|
|
|
|
def ensure_hq_site_for_city(city: CitySite) -> Site:
|
|
"""
|
|
Ensure the city 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(city_site=city).first()
|
|
if existing:
|
|
return existing
|
|
|
|
owner = city.registered_by
|
|
if owner is None:
|
|
raise ValueError("CitySite.registered_by is required to create an HQ site.")
|
|
|
|
site_name = (city.name or city.code or "Site")[:30]
|
|
orphan = (
|
|
Site.objects.filter(user=owner, city_site__isnull=True, site_name__iexact=site_name)
|
|
.order_by("pk")
|
|
.first()
|
|
)
|
|
if orphan is None and city.code:
|
|
# e.g. code "sukawarna" ↔ site_name "Sukawarna"
|
|
orphan = (
|
|
Site.objects.filter(user=owner, city_site__isnull=True, site_name__iexact=city.code)
|
|
.order_by("pk")
|
|
.first()
|
|
)
|
|
if orphan is not None:
|
|
orphan.city_site = city
|
|
orphan.save(update_fields=["city_site", "updated_at"])
|
|
return orphan
|
|
|
|
return Site.objects.create(site_name=site_name, user=owner, city_site=city)
|