101 lines
No EOL
3.8 KiB
Text
101 lines
No EOL
3.8 KiB
Text
"""
|
||
TEE OFF - AUTOMATISK URL-IMPORTØR
|
||
---------------------------------------------------------------------------
|
||
Leser tekstfiler med lenker og forsøker å matche dem mot eksisterende
|
||
golfanlegg i databasen basert på domenenavn.
|
||
---------------------------------------------------------------------------
|
||
"""
|
||
|
||
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()) |