151 lines
4.8 KiB
Python
151 lines
4.8 KiB
Python
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())
|