Nye-TeeOff/kode_eksport_3/backend_import_urls_py.txt
2026-04-10 09:52:34 +02:00

103 lines
No EOL
3.8 KiB
Text
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
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
DB_URL = os.getenv("DATABASE_URL", "postgresql://teeoff_admin:teeoff_secret_password@db:5432/teeoff")
# 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())