Coverage for app/backend/src/couchers/helpers/messages.py: 100%
9 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-08 23:56 +0000
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-08 23:56 +0000
1"""
2Message serialization shared by the conversations and requests APIs: both surface messages from the
3same table, so they must render every message type identically.
4"""
6from couchers.models import HostRequestStatus, Message, MessageType
7from couchers.proto import messages_pb2
8from couchers.utils import Timestamp_from_datetime
10hostrequeststatus2api = {
11 HostRequestStatus.pending: messages_pb2.HOST_REQUEST_STATUS_PENDING,
12 HostRequestStatus.accepted: messages_pb2.HOST_REQUEST_STATUS_ACCEPTED,
13 HostRequestStatus.rejected: messages_pb2.HOST_REQUEST_STATUS_REJECTED,
14 HostRequestStatus.confirmed: messages_pb2.HOST_REQUEST_STATUS_CONFIRMED,
15 HostRequestStatus.cancelled: messages_pb2.HOST_REQUEST_STATUS_CANCELLED,
16}
18api2hostrequeststatus = {
19 messages_pb2.HOST_REQUEST_STATUS_PENDING: HostRequestStatus.pending,
20 messages_pb2.HOST_REQUEST_STATUS_ACCEPTED: HostRequestStatus.accepted,
21 messages_pb2.HOST_REQUEST_STATUS_REJECTED: HostRequestStatus.rejected,
22 messages_pb2.HOST_REQUEST_STATUS_CONFIRMED: HostRequestStatus.confirmed,
23 messages_pb2.HOST_REQUEST_STATUS_CANCELLED: HostRequestStatus.cancelled,
24}
27def message_to_pb(message: Message) -> messages_pb2.Message:
28 """
29 Turns the given message to a protocol buffer
30 """
31 if message.is_normal_message:
32 return messages_pb2.Message(
33 message_id=message.id,
34 author_user_id=message.author_id,
35 time=Timestamp_from_datetime(message.time),
36 text=messages_pb2.MessageContentText(text=message.text),
37 )
38 else:
39 return messages_pb2.Message(
40 message_id=message.id,
41 author_user_id=message.author_id,
42 time=Timestamp_from_datetime(message.time),
43 chat_created=(
44 messages_pb2.MessageContentChatCreated() if message.message_type == MessageType.chat_created else None
45 ),
46 chat_edited=(
47 messages_pb2.MessageContentChatEdited() if message.message_type == MessageType.chat_edited else None
48 ),
49 user_invited=(
50 messages_pb2.MessageContentUserInvited(target_user_id=message.target_id)
51 if message.message_type == MessageType.user_invited
52 else None
53 ),
54 user_left=(
55 messages_pb2.MessageContentUserLeft() if message.message_type == MessageType.user_left else None
56 ),
57 user_made_admin=(
58 messages_pb2.MessageContentUserMadeAdmin(target_user_id=message.target_id)
59 if message.message_type == MessageType.user_made_admin
60 else None
61 ),
62 user_removed_admin=(
63 messages_pb2.MessageContentUserRemovedAdmin(target_user_id=message.target_id)
64 if message.message_type == MessageType.user_removed_admin
65 else None
66 ),
67 group_chat_user_removed=(
68 messages_pb2.MessageContentUserRemoved(target_user_id=message.target_id)
69 if message.message_type == MessageType.user_removed
70 else None
71 ),
72 host_request_status_changed=(
73 messages_pb2.MessageContentHostRequestStatusChanged(
74 status=hostrequeststatus2api[message.host_request_status_target] # type: ignore[index]
75 )
76 if message.message_type == MessageType.host_request_status_changed
77 else None
78 ),
79 )