2026-02-27 11:12:53 +01:00
|
|
|
import asyncio, asyncpg, urllib.request, json
|
2026-04-16 09:58:08 +02:00
|
|
|
from env_config import get_database_url
|
2026-02-27 11:12:53 +01:00
|
|
|
|
2026-04-16 09:58:08 +02:00
|
|
|
DB_URL = get_database_url()
|
2026-02-27 11:12:53 +01:00
|
|
|
# Vi fjerner acf_format=standard da rå-feltnavnene er tryggere her
|
|
|
|
|
WP_API_URL = "https://teeoff.no/wp-json/wp/v2/golfbaner?per_page=100"
|
|
|
|
|
|
|
|
|
|
def decode_html(text):
|
|
|
|
|
if not text: return ""
|
|
|
|
|
return str(text).replace('&', '&').replace('&', '&').replace(' ', ' ').strip()
|
|
|
|
|
|
|
|
|
|
async def run_greenfee_sync():
|
|
|
|
|
print("🎯 Starter GREENFEE-SYNC v1.2 (Basert på rå-API mapping)...")
|
|
|
|
|
conn = await asyncpg.connect(DB_URL)
|
|
|
|
|
page = 1
|
|
|
|
|
total_updated = 0
|
|
|
|
|
|
|
|
|
|
while True:
|
|
|
|
|
try:
|
|
|
|
|
req = urllib.request.Request(f"{WP_API_URL}&page={page}", headers={'User-Agent': 'TeeOff-Sync'})
|
|
|
|
|
with urllib.request.urlopen(req) as response:
|
|
|
|
|
data = json.loads(response.read().decode())
|
|
|
|
|
except: break
|
|
|
|
|
if not data: break
|
|
|
|
|
|
|
|
|
|
for post in data:
|
|
|
|
|
slug = post['slug']
|
|
|
|
|
acf = post.get('acf', {})
|
|
|
|
|
|
|
|
|
|
# Henter banenavn for å gruppere riktig
|
|
|
|
|
bane_1_navn = acf.get('navn_pa_hovedbane') or "Hovedbanen"
|
|
|
|
|
bane_2_navn = acf.get('navn_pa_sekundar_bane') or "Bane 2"
|
|
|
|
|
|
|
|
|
|
final_greenfee = []
|
|
|
|
|
|
|
|
|
|
# --- MAPPER BANE 1 (Voksne + Junior) ---
|
|
|
|
|
voksne_1 = acf.get('greenfee_-_voksne') or []
|
|
|
|
|
junior_1 = acf.get('greenfee_-_junior') or []
|
|
|
|
|
|
|
|
|
|
for i, item in enumerate(voksne_1):
|
|
|
|
|
row = {
|
|
|
|
|
"banenavn": bane_1_navn,
|
|
|
|
|
"priskategori": item.get('priskategori'),
|
|
|
|
|
"pris_voksne": item.get('pris_voksne')
|
|
|
|
|
}
|
|
|
|
|
# Legger til juniorpris hvis den finnes på samme index
|
|
|
|
|
if i < len(junior_1):
|
|
|
|
|
row["pris_junior"] = junior_1[i].get('pris_junior')
|
|
|
|
|
final_greenfee.append(row)
|
|
|
|
|
|
|
|
|
|
# --- MAPPER BANE 2 (Voksne + Junior) ---
|
|
|
|
|
voksne_2 = acf.get('greenfee_-_voksne_bane_to') or []
|
|
|
|
|
junior_2 = acf.get('greenfee_-_junior_bane_to') or []
|
|
|
|
|
|
|
|
|
|
for i, item in enumerate(voksne_2):
|
|
|
|
|
row = {
|
|
|
|
|
"banenavn": bane_2_navn,
|
|
|
|
|
"priskategori": item.get('priskategori_bane_to'),
|
|
|
|
|
"pris_voksne": item.get('pris_voksne_bane_to')
|
|
|
|
|
}
|
|
|
|
|
if i < len(junior_2):
|
|
|
|
|
row["pris_junior"] = junior_2[i].get('pris_junior_bane_to')
|
|
|
|
|
final_greenfee.append(row)
|
|
|
|
|
|
|
|
|
|
# Henter krav (Gjeste_krav)
|
|
|
|
|
reqs = decode_html(acf.get('krav_til_gjestespillere'))
|
|
|
|
|
|
|
|
|
|
if final_greenfee:
|
|
|
|
|
await conn.execute('''
|
|
|
|
|
UPDATE facilities SET greenfee = $1::jsonb, guest_requirements = $2 WHERE slug = $3
|
|
|
|
|
''', json.dumps(final_greenfee), reqs, slug)
|
|
|
|
|
print(f"✅ {slug}: Importerte {len(final_greenfee)} prisrader for {bane_1_navn}/{bane_2_navn}")
|
|
|
|
|
total_updated += 1
|
|
|
|
|
|
|
|
|
|
page += 1
|
|
|
|
|
await conn.close()
|
|
|
|
|
print(f"\n✨ Ferdig! Oppdaterte priser for {total_updated} anlegg.")
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2026-04-16 09:58:08 +02:00
|
|
|
asyncio.run(run_greenfee_sync())
|