Coverage for app / backend / src / couchers / event_log.py: 100%
7 statements
« prev ^ index » next coverage.py v7.13.3, created at 2026-02-08 19:22 +0000
« prev ^ index » next coverage.py v7.13.3, created at 2026-02-08 19:22 +0000
1from typing import Any
3from sqlalchemy.orm import Session
5from couchers.context import CouchersContext
6from couchers.models.logging import EventLog
9def log_event(
10 context: CouchersContext,
11 session: Session,
12 event_type: str,
13 /,
14 properties: dict[str, Any],
15 *,
16 _override_user_id: int | None = None,
17) -> None:
18 """
19 Record an analytics event.
21 Usage:
22 log_event(context, session, "host_request.sent", {"host_id": host.id, "nights": 3})
24 Use _override_user_id for actions where the user is known but may not be in context
25 (e.g. signup, token-based actions):
26 log_event(context, session, "account.signup_completed", {...}, _override_user_id=user.id)
28 If context has no user_id and no _override_user_id is given, user_id will be None (anonymous event).
30 Event type naming convention: "noun.verbed" with dot-separated hierarchy, e.g.
31 account.login
32 host_request.sent
33 host_request.accepted
34 message.sent
35 reference.written
36 """
37 user_id = _override_user_id if _override_user_id is not None else context._user_id
39 session.add(
40 EventLog(
41 event_type=event_type,
42 user_id=user_id,
43 sofa=context._sofa,
44 properties=properties,
45 )
46 )