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