Skip to content

Commit 22a865f

Browse files
committed
api_types/model/test_model: Add handling for realm_user events.
This commit contains new function called Model._handle_realm_user_events() which makes changes to the model.initial_data every time user metadata is changed. Partly fixes #988.
1 parent aaf4810 commit 22a865f

File tree

3 files changed

+58
-0
lines changed

3 files changed

+58
-0
lines changed

tests/model/test_model.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ def test_register_initial_desired_events(self, mocker, initial_data):
237237
"update_display_settings",
238238
"user_settings",
239239
"realm_emoji",
240+
"realm_user",
240241
]
241242
fetch_event_types = [
242243
"realm",

zulipterminal/api_types.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,24 @@ class ReactionEvent(TypedDict):
167167
message_id: int
168168

169169

170+
class Person(TypedDict):
171+
user_id: int
172+
full_name: str
173+
timezone: str
174+
display_email: str
175+
email: str
176+
role: int
177+
avatar_url: str
178+
avatar_version: int
179+
profile_data: Dict[str, str]
180+
181+
182+
class RealmUserEvent(TypedDict):
183+
type: Literal["realm_user"]
184+
op: str
185+
person: Person
186+
187+
170188
class SubscriptionEvent(TypedDict):
171189
type: Literal["subscription"]
172190
op: str
@@ -249,4 +267,5 @@ class UpdateGlobalNotificationsEvent(TypedDict):
249267
UpdateRealmEmojiEvent,
250268
UpdateUserSettingsEvent,
251269
UpdateGlobalNotificationsEvent,
270+
RealmUserEvent,
252271
]

zulipterminal/model.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from concurrent.futures import Future, ThreadPoolExecutor, wait
99
from copy import deepcopy
1010
from datetime import datetime
11+
from pprint import pprint
1112
from typing import (
1213
Any,
1314
Callable,
@@ -33,6 +34,7 @@
3334
Composition,
3435
EditPropagateMode,
3536
Event,
37+
Person,
3638
PrivateComposition,
3739
RealmEmojiData,
3840
RealmUser,
@@ -150,6 +152,7 @@ def __init__(self, controller: Any) -> None:
150152
("update_display_settings", self._handle_update_display_settings_event),
151153
("user_settings", self._handle_user_settings_event),
152154
("realm_emoji", self._handle_update_emoji_event),
155+
("realm_user", self._handle_realm_user_event),
153156
]
154157
)
155158

@@ -1747,6 +1750,41 @@ def _handle_update_display_settings_event(self, event: Event) -> None:
17471750
view.message_view.log[msg_pos] = msg_w_list[0]
17481751
self.controller.update_screen()
17491752

1753+
def update_realm_user(self, updated_details: Person) -> None:
1754+
"""
1755+
This function is to update details of other realm_users
1756+
when a realm_user event takes place
1757+
"""
1758+
for realm_user in self.initial_data["realm_users"]:
1759+
if realm_user["user_id"] == updated_details["user_id"]:
1760+
index_of_realm_user = self.initial_data["realm_users"].index(realm_user)
1761+
temp_realm_index = index_of_realm_user
1762+
self.initial_data["realm_users"][index_of_realm_user].update(
1763+
updated_details
1764+
)
1765+
break
1766+
1767+
def _handle_realm_user_event(self, event: Event) -> None:
1768+
"""
1769+
Handle change to user(s) metadata (Eg: full_name, timezone, etc.)
1770+
"""
1771+
assert event["type"] == "realm_user"
1772+
if event["op"] == "update":
1773+
pprint(event)
1774+
if "person" in event:
1775+
updated_details = event["person"]
1776+
# Role is not present under self.initial_data,
1777+
# but exists only under self.initial_data["realm_users"]
1778+
if event["person"].get("role"):
1779+
self.update_realm_user(updated_details)
1780+
else:
1781+
# check if the event contains details of current user or some other user in the org
1782+
if updated_details["user_id"] == self.user_id:
1783+
self.initial_data.update(updated_details)
1784+
self.update_realm_user(updated_details)
1785+
else:
1786+
self.update_realm_user(updated_details)
1787+
17501788
def _register_desired_events(self, *, fetch_data: bool = False) -> str:
17511789
fetch_types = None if not fetch_data else self.initial_data_to_fetch
17521790
event_types = list(self.event_actions)

0 commit comments

Comments
 (0)