Coverage for src/couchers/helpers/badges.py: 100%
22 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-12-06 23:17 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-12-06 23:17 +0000
1from sqlalchemy.orm import Session
2from sqlalchemy.sql import delete
4from couchers.context import make_background_user_context
5from couchers.models import UserBadge
6from couchers.notifications.notify import notify
7from couchers.proto import notification_data_pb2
8from couchers.resources import get_badge_dict
11def user_add_badge(session: Session, user_id: int, badge_id: str, do_notify: bool = True) -> None:
12 badge = get_badge_dict()[badge_id]
13 session.add(UserBadge(user_id=user_id, badge_id=badge_id))
14 session.flush()
15 if do_notify:
16 context = make_background_user_context(user_id=user_id)
17 notify(
18 session,
19 user_id=user_id,
20 topic_action="badge:add",
21 data=notification_data_pb2.BadgeAdd(
22 badge_id=badge["id"],
23 badge_name=context.get_localized_string("badges", f"{badge_id}_name"),
24 badge_description=context.get_localized_string("badges", f"{badge_id}_description"),
25 ),
26 )
27 session.commit()
30def user_remove_badge(session: Session, user_id: int, badge_id: str) -> None:
31 badge = get_badge_dict()[badge_id]
32 session.execute(delete(UserBadge).where(UserBadge.user_id == user_id, UserBadge.badge_id == badge_id))
33 session.flush()
34 context = make_background_user_context(user_id=user_id)
35 notify(
36 session,
37 user_id=user_id,
38 topic_action="badge:remove",
39 data=notification_data_pb2.BadgeRemove(
40 badge_id=badge["id"],
41 badge_name=context.get_localized_string("badges", f"{badge_id}_name"),
42 badge_description=context.get_localized_string("badges", f"{badge_id}_description"),
43 ),
44 )
45 session.commit()