Webseitensuche verbessert UI aufgeräumt

This commit is contained in:
ecki
2026-04-21 13:22:20 +02:00
parent 6cfbdba0a4
commit 1014f822a1
10 changed files with 579 additions and 136 deletions
+38 -4
View File
@@ -42,7 +42,7 @@ def list_watch_items(db: Session) -> list[WatchItem]:
def list_events(db: Session) -> list[TrackedEvent]:
events = list(db.scalars(select(TrackedEvent).order_by(desc(TrackedEvent.event_date))))
events = list(db.scalars(select(TrackedEvent)))
deduped: list[TrackedEvent] = []
for event in events:
@@ -61,7 +61,16 @@ def list_events(db: Session) -> list[TrackedEvent]:
if is_preferred_event(event, deduped[duplicate_index]):
deduped[duplicate_index] = event
return deduped
return sorted(deduped, key=event_sort_key)
def event_sort_key(event: TrackedEvent):
today = datetime.utcnow().date()
if event.event_date is None:
return (1, datetime.max)
if event.event_date.date() >= today:
return (0, event.event_date)
return (2, datetime.max - (event.event_date - datetime.min))
def list_notifications(db: Session):
@@ -269,6 +278,27 @@ def upsert_event(
return tracked_event, is_new
def prune_stale_source_events(
db: Session,
watch_item: WatchItem,
source_name: str,
seen_external_ids: set[str],
) -> int:
stmt = select(TrackedEvent).where(
TrackedEvent.watch_item_id == watch_item.id,
TrackedEvent.source == source_name,
TrackedEvent.is_ticket_purchased.is_(False),
)
stale_events = [
event
for event in db.scalars(stmt)
if event.external_id not in seen_external_ids
]
for event in stale_events:
db.delete(event)
return len(stale_events)
def run_sync(db: Session) -> SyncResult:
providers = get_providers()
source_scanner = SourceScanner()
@@ -288,12 +318,14 @@ def run_sync(db: Session) -> SyncResult:
for watch_item in active_items:
active_sources = [source for source in watch_item.sources if source.is_active]
for source in active_sources:
source_name = f"source:{source.id}"
seen_source_event_ids: set[str] = set()
try:
events = source_scanner.scan(watch_item, source)
source.last_status = (
SourceStatusType.ok if events else SourceStatusType.no_match
)
source.last_message = (
source.last_message = source_scanner.last_message or (
f"{len(events)} passende Events gefunden."
if events
else "Keine passenden Events auf dieser Quelle gefunden."
@@ -317,9 +349,10 @@ def run_sync(db: Session) -> SyncResult:
tracked_event, is_new = upsert_event(
db=db,
watch_item=watch_item,
provider_name=f"source:{source.id}",
provider_name=source_name,
event_data=event_data,
)
seen_source_event_ids.add(tracked_event.external_id)
if is_new:
new_events += 1
else:
@@ -353,6 +386,7 @@ def run_sync(db: Session) -> SyncResult:
notifications_skipped += 1
db.add(source)
prune_stale_source_events(db, watch_item, source_name, seen_source_event_ids)
db.commit()
for provider in providers: