fix
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
from datetime import date, datetime
|
||||
|
||||
from sqlalchemy import func
|
||||
|
||||
from .extensions import db
|
||||
from .models import OrlenPrice
|
||||
from .services import fetch_orlen_range
|
||||
|
||||
|
||||
def _year_bounds(year, today=None):
|
||||
today = today or date.today()
|
||||
start = date(year, 1, 1)
|
||||
end = min(date(year, 12, 31), today)
|
||||
if end < start:
|
||||
raise ValueError("Nie można synchronizować danych dla przyszłego roku")
|
||||
return start, end
|
||||
|
||||
|
||||
def _latest_date(fuel, start, end, region=""):
|
||||
query = db.session.query(func.max(OrlenPrice.effective_date)).filter(
|
||||
OrlenPrice.fuel_type == fuel,
|
||||
OrlenPrice.effective_date.between(start, end),
|
||||
)
|
||||
if fuel == "LPG":
|
||||
query = query.filter(OrlenPrice.region == region)
|
||||
else:
|
||||
query = query.filter(OrlenPrice.region == "")
|
||||
return query.scalar()
|
||||
|
||||
|
||||
def _sync_start(fuel, start, end, regions, full_refresh):
|
||||
if full_refresh:
|
||||
return start
|
||||
|
||||
if fuel != "LPG":
|
||||
return _latest_date(fuel, start, end) or start
|
||||
|
||||
latest_dates = [_latest_date("LPG", start, end, region) for region in regions]
|
||||
return min((value or start) for value in latest_dates)
|
||||
|
||||
|
||||
def sync_orlen_prices(fuels, year, regions, default_region, full_refresh=False, today=None):
|
||||
start, end = _year_bounds(year, today=today)
|
||||
target_regions = [str(region).strip().lower() for region in regions if str(region).strip()]
|
||||
if not target_regions:
|
||||
target_regions = [str(default_region).strip().lower()]
|
||||
|
||||
result = {}
|
||||
total = 0
|
||||
|
||||
for fuel in fuels:
|
||||
fuel_regions = target_regions if fuel == "LPG" else []
|
||||
date_from = _sync_start(fuel, start, end, fuel_regions, full_refresh)
|
||||
added = 0
|
||||
updated = 0
|
||||
|
||||
rows = fetch_orlen_range(
|
||||
fuel,
|
||||
date_from,
|
||||
end,
|
||||
"all" if fuel == "LPG" else default_region,
|
||||
)
|
||||
for row in rows:
|
||||
if fuel == "LPG" and row.get("region") not in fuel_regions:
|
||||
continue
|
||||
|
||||
existing = OrlenPrice.query.filter_by(
|
||||
fuel_type=row["fuel_type"],
|
||||
effective_date=row["effective_date"],
|
||||
region=row["region"],
|
||||
).first()
|
||||
if existing:
|
||||
for key, value in row.items():
|
||||
setattr(existing, key, value)
|
||||
existing.fetched_at = datetime.utcnow()
|
||||
updated += 1
|
||||
else:
|
||||
db.session.add(OrlenPrice(**row))
|
||||
added += 1
|
||||
|
||||
processed = added + updated
|
||||
result[fuel] = {
|
||||
"added": added,
|
||||
"updated": updated,
|
||||
"from": date_from.isoformat(),
|
||||
"to": end.isoformat(),
|
||||
"full_refresh": bool(full_refresh),
|
||||
}
|
||||
total += processed
|
||||
|
||||
return result, total
|
||||
Reference in New Issue
Block a user