V8 MEGA: meta endpoints + manifestacije + HNS V8 harvester batch

Endpoints:
- /v2/potpore/meta — dropdown options (sportovi, vrste, davatelji, godine)
- /v2/potpore/by-year — sport, vrsta filters
- /v2/manifestacije/meta — mjesta, razine, organizatori
- /v2/manifestacije — lista s filterima

HNS:
- 20 PGŽ priority klubova batch harvester pokrenut (HNK Goranin, HNK Orijent 1919, HNK Rijeka, NK Crikvenica, ...)
- ETA 30 min
This commit is contained in:
2026-05-05 18:10:02 +02:00
parent f07fdad919
commit a428363d42
6 changed files with 360 additions and 6 deletions
+66 -1
View File
@@ -4959,8 +4959,24 @@ def proracun_sport(godina: int = None):
# ═══════════════════════════════════════════════════════
# POTPORE — by year filter
# ═══════════════════════════════════════════════════════
@router.get("/potpore/meta")
def potpore_meta():
"""Dropdown options za Financije sekciju."""
sportovi = db_query("SELECT DISTINCT sport FROM pgz_sport.sufinanciranje_sport WHERE sport IS NOT NULL ORDER BY sport")
vrste = db_query("SELECT DISTINCT vrsta FROM pgz_sport.sufinanciranje_sport WHERE vrsta IS NOT NULL ORDER BY vrsta")
davatelji = db_query("SELECT DISTINCT izvor, count(*) AS broj FROM pgz_sport.sufinanciranje_sport WHERE izvor IS NOT NULL GROUP BY izvor ORDER BY broj DESC")
godine = db_query("SELECT DISTINCT godina, count(*) AS broj, sum(iznos_eur)::numeric(12,2) AS suma FROM pgz_sport.sufinanciranje_sport GROUP BY godina ORDER BY godina DESC")
return {
"sportovi": [r["sport"] for r in sportovi],
"vrste": [r["vrsta"] for r in vrste],
"davatelji": [r["izvor"] for r in davatelji],
"godine": godine,
}
@router.get("/potpore/by-year")
def potpore_by_year(godina: int = None, q: str = "", samo_klubovi: bool = True, davatelj: str = None):
def potpore_by_year(godina: int = None, q: str = "", samo_klubovi: bool = True, davatelj: str = None, sport: str = None, vrsta: str = None):
"""Sufinanciranje za specifičnu godinu — samo_klubovi=True izbacuje programe/totals/services."""
import datetime
yr = godina or datetime.date.today().year
@@ -4972,6 +4988,12 @@ def potpore_by_year(godina: int = None, q: str = "", samo_klubovi: bool = True,
if samo_klubovi:
where.append("(je_klub IS NULL OR je_klub = true)")
if sport:
where.append("LOWER(sport) = LOWER(%s)")
params.append(sport)
if vrsta:
where.append("LOWER(vrsta) = LOWER(%s)")
params.append(vrsta)
if davatelj == 'rijeka':
where.append("izvor ILIKE '%%rijeka.hr%%'")
elif davatelj == 'pgz':
@@ -5952,3 +5974,46 @@ def v2_clan_hns_profile(clan_id: int):
"hns_url": hns_url,
}
@router.get("/manifestacije/meta")
def manifestacije_meta():
"""Dropdown options za manifestacije."""
mjesta = db_query("SELECT DISTINCT mjesto, count(*) AS broj FROM pgz_sport.manifestacije WHERE mjesto IS NOT NULL GROUP BY mjesto ORDER BY broj DESC LIMIT 100")
razine = db_query("SELECT DISTINCT razina FROM pgz_sport.manifestacije WHERE razina IS NOT NULL ORDER BY razina")
organizatori = db_query("SELECT DISTINCT organizator, count(*) AS broj FROM pgz_sport.manifestacije WHERE organizator IS NOT NULL GROUP BY organizator ORDER BY broj DESC LIMIT 50")
return {
"mjesta": [r["mjesto"] for r in mjesta],
"razine": [r["razina"] for r in razine],
"organizatori": [r["organizator"] for r in organizatori],
}
@router.get("/manifestacije")
def manifestacije_list(mjesto: str = None, razina: str = None, organizator: str = None, q: str = None, limit: int = 200):
"""Lista manifestacija s filterima."""
where = ["aktivna = true"]
params = []
if mjesto:
where.append("mjesto = %s")
params.append(mjesto)
if razina:
where.append("razina = %s")
params.append(razina)
if organizator:
where.append("organizator ILIKE %s")
params.append(f"%{organizator}%")
if q:
where.append("(naziv ILIKE %s OR napomena ILIKE %s)")
params.extend([f"%{q}%", f"%{q}%"])
rows = db_query(f"""
SELECT m.id, m.naziv, m.mjesto, m.organizator, m.razina, m.broj_ucesnika,
m.godina_od, m.spol_kategorija, m.napomena, m.source_url,
s.naziv AS savez_naziv, s.id AS savez_id
FROM pgz_sport.manifestacije m
LEFT JOIN pgz_sport.savezi s ON s.id = m.savez_id
WHERE {' AND '.join(where)}
ORDER BY m.naziv
LIMIT %s
""", params + [limit])
return {"count": len(rows), "rows": rows}