Deliver parsers, events, analytics, and PI management in Vue; fix Telegram session mount and map navigation to events by eventId. Co-authored-by: Cursor <cursoragent@cursor.com>
43 lines
1.2 KiB
Python
43 lines
1.2 KiB
Python
from datetime import datetime
|
|
|
|
from sqlalchemy.orm import Query, Session
|
|
|
|
from ..models import Event
|
|
|
|
|
|
def build_events_query(
|
|
db: Session,
|
|
*,
|
|
source_type: str | None = None,
|
|
region: str | None = None,
|
|
topic: str | None = None,
|
|
locality: str | None = None,
|
|
date_from: datetime | None = None,
|
|
date_to: datetime | None = None,
|
|
search: str | None = None,
|
|
) -> Query:
|
|
query = db.query(Event)
|
|
|
|
if source_type:
|
|
query = query.filter(Event.source_type == source_type)
|
|
if region:
|
|
query = query.filter(Event.region == region)
|
|
if topic:
|
|
query = query.filter(Event.topic == topic)
|
|
if locality:
|
|
query = query.filter(Event.locality.ilike(f"%{locality}%"))
|
|
if date_from:
|
|
query = query.filter(Event.event_date >= date_from)
|
|
if date_to:
|
|
query = query.filter(Event.event_date <= date_to)
|
|
if search:
|
|
pattern = f"%{search}%"
|
|
query = query.filter(
|
|
Event.title.ilike(pattern)
|
|
| Event.description.ilike(pattern)
|
|
| Event.raw_text.ilike(pattern)
|
|
| Event.locality.ilike(pattern)
|
|
)
|
|
|
|
return query.order_by(Event.ingested_at.desc())
|