Nye-TeeOff/backend/import_urls.py

105 lines
3.8 KiB
Python

"""
TEE OFF - AUTOMATISK URL-IMPORTØR
---------------------------------------------------------------------------
Leser tekstfiler med lenker og forsøker å matche dem mot eksisterende
golfanlegg i databasen basert på domenenavn.
docker compose exec api python import_urls.py
---------------------------------------------------------------------------
"""
import asyncio
import asyncpg
import os
from urllib.parse import urlparse
from env_config import get_database_url
DB_URL = get_database_url()
# Hvilke filer vi skal lese, og hvilke databasefelt de tilhører
FILES_TO_IMPORT = {
"Medlemsskap.txt": "medlemskap_url",
"GreenFee.txt": "greenfee_url",
"VtG.txt": "vtg_lenke"
}
def extract_domain(url: str) -> str:
"""Henter ut hoveddomenet (f.eks. 'tyrifjord-golfklubb.no') fra en URL."""
try:
domain = urlparse(url.strip()).netloc.lower()
if domain.startswith("www."):
domain = domain[4:]
return domain
except:
return ""
async def run_import():
print("🚀 Starter URL-importør...")
conn = await asyncpg.connect(DB_URL)
try:
# Hent alle eksisterende anlegg og deres domener
facilities = await conn.fetch("SELECT id, name, website_url, scrape_status_url FROM facilities")
# Bygg en ordbok: { 'domenenavn.no': facility_id } for superraskt oppslag
domain_map = {}
for f in facilities:
# Prøv å hente domene fra website_url
if f['website_url']:
domain = extract_domain(f['website_url'])
if domain: domain_map[domain] = f['id']
# Prøv også scrape_status_url for sikkerhets skyld
if f['scrape_status_url']:
domain = extract_domain(f['scrape_status_url'])
if domain: domain_map[domain] = f['id']
print(f"📋 Fant {len(domain_map)} unike domener i databasen.")
# Gå gjennom fil for fil
for filename, db_field in FILES_TO_IMPORT.items():
print(f"\n▶️ BEHANDLER: {filename} -> Setter felt: {db_field}")
if not os.path.exists(filename):
print(f" ⚠️ Filen '{filename}' ble ikke funnet. Hopper over.")
continue
with open(filename, 'r', encoding='utf-8') as file:
lines = [line.strip() for line in file.readlines() if line.strip()]
matched_count = 0
unmatched = []
for line in lines:
# Hvis det er flere URL-er på samme linje separert med komma,
# matcher vi basert på den FØRSTE URL-en.
first_url = line.split(',')[0].strip()
domain = extract_domain(first_url)
# Hvis vi fant en match i databasen!
if domain in domain_map:
fac_id = domain_map[domain]
# Oppdater databasen med HELE linjen (for å bevare ev. komma-lenker)
await conn.execute(f"""
UPDATE facilities
SET {db_field} = $1
WHERE id = $2
""", line, fac_id)
matched_count += 1
else:
unmatched.append(line)
print(f" ✅ Matchet og oppdatert {matched_count} anlegg.")
if unmatched:
print(f" ❌ Følgende {len(unmatched)} URL-er fant ingen match i databasen og må legges inn manuelt:")
for url in unmatched:
print(f" - {url}")
finally:
await conn.close()
print("\n🏁 Import fullført!")
if __name__ == "__main__":
asyncio.run(run_import())