Nye-TeeOff/backend/import_nye_felter.py

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