import asyncio import asyncpg import requests import json import os import re from datetime import datetime from dotenv import load_dotenv from env_config import get_database_url # Laster miljøvariabler load_dotenv() DB_URL = get_database_url() # Grunn-URL uten page-parameter WP_API_BASE_URL = "https://teeoff.no/wp-json/wp/v2/golfbaner?per_page=100" def extract_price(text): """Finner første hele tall i en tekst og returnerer det som integer.""" if not text: return None clean_text = str(text).replace(" ", "").replace(".", "") match = re.search(r'\d+', clean_text) if match: return int(match.group()) return None def parse_date(date_string): """Forsøker å konvertere ulike tekstformater for dato til et ekte Date-objekt.""" if not date_string: return None ds = str(date_string).strip().lower() if ds in ["ukjent", "ikke oppgitt", "har ikke", ""]: return None formats = ['%Y-%m-%d', '%d.%m.%Y', '%d/%m/%Y', '%Y%m%d', '%d.%m.%y'] for fmt in formats: try: return datetime.strptime(ds, fmt).date() except ValueError: continue return None def clean_jsonb(value): """Sørger for at vi ikke fyller databasen med 'Ikke oppgitt', men bruker tomme lister.""" if not value or str(value).lower() in ["ikke oppgitt", "har ikke / ikke oppgitt"]: return [] if isinstance(value, str): return [{"beskrivelse": value}] if isinstance(value, list): cleaned = [v for v in value if v and "ikke oppgitt" not in str(v).lower()] return cleaned return value async def run_import(): print("📡 Henter anleggsdata fra WordPress (inkluderer paginering)...") all_data = [] page = 1 # --- LØKKE SOM HENTER ALLE SIDER FRA WORDPRESS --- while True: url = f"{WP_API_BASE_URL}&page={page}" print(f" -> Henter side {page}...") response = requests.get(url) # Hvis vi får 400 Bad Request, betyr det at vi har nådd forbi siste side if response.status_code != 200: break data = response.json() if not data: break all_data.extend(data) page += 1 print(f"✅ Fant totalt {len(all_data)} anlegg. Starter oppdatering av database...") conn = await asyncpg.connect(DB_URL) success_count = 0 for item in all_data: slug = item.get('slug') acf = item.get('acf', {}) # Ekstraher og vask verdiene golfpakker = clean_jsonb(acf.get('golfpakke')) rabattert_greenfee = clean_jsonb(acf.get('rabattert_greenfee')) vtg_presentasjon = acf.get('vtg_presentasjon') or None vtg_lenke = acf.get('lenke_til_kurssider') or None vtg_pris = extract_price(acf.get('vtg_pris')) vtg_kursdatoer = clean_jsonb(acf.get('kursdatoer')) slope_hovedbane = parse_date(acf.get('gyldig_til_og_med')) slope_bane_to = parse_date(acf.get('gyldig_til_og_med_bane_to')) try: # 1. Oppdater fasilitets-tabellen await conn.execute(""" UPDATE facilities SET golfpakker = $1::jsonb, rabattert_greenfee = $2::jsonb, vtg_presentasjon = $3, vtg_lenke = $4, vtg_pris = $5, vtg_kursdatoer = $6::jsonb WHERE slug = $7 """, json.dumps(golfpakker), json.dumps(rabattert_greenfee), vtg_presentasjon, vtg_lenke, vtg_pris, json.dumps(vtg_kursdatoer), slug) # 2. Oppdater utløpsdato på hovedbanen if slope_hovedbane: await conn.execute(""" UPDATE courses SET slope_valid_until = $1 WHERE facility_id = (SELECT id FROM facilities WHERE slug = $2) AND is_main_course = true """, slope_hovedbane, slug) # 3. Oppdater utløpsdato på bane 2 if slope_bane_to: await conn.execute(""" UPDATE courses SET slope_valid_until = $1 WHERE facility_id = (SELECT id FROM facilities WHERE slug = $2) AND is_main_course = false """, slope_bane_to, slug) success_count += 1 except Exception as e: print(f" ❌ Feil ved oppdatering av {slug}: {e}") await conn.close() print(f"\n🎉 Kjøring fullført! Målrettet import for {success_count} anlegg er lagret.") if __name__ == "__main__": asyncio.run(run_import())