Webseitensuche verbessert UI aufgeräumt
This commit is contained in:
+38
-4
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user