Skip to content

Commit c94e8b4

Browse files
committed
enhancement: Introduces application-wide time format setting.
Initial time format settings are fetched during initial register call. Event handler enables update of this setting as events are recieved from the server. Tests added. Fixes #770
1 parent 78c5fec commit c94e8b4

File tree

4 files changed

+68
-3
lines changed

4 files changed

+68
-3
lines changed

tests/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,7 @@ def initial_data(logged_on_user, users_fixture, streams_fixture):
539539
}
540540
}
541541
},
542+
'twenty_four_hour_time': True,
542543
'last_event_id': -1,
543544
'muted_topics': [],
544545
'realm_user_groups': [],

tests/model/test_model.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ def test_register_initial_desired_events(self, mocker, initial_data):
179179
'subscription',
180180
'typing',
181181
'update_message_flags',
182+
'update_display_settings',
182183
]
183184
fetch_event_types = [
184185
'realm',
@@ -189,6 +190,7 @@ def test_register_initial_desired_events(self, mocker, initial_data):
189190
'muted_topics',
190191
'realm_user',
191192
'realm_user_groups',
193+
'update_display_settings',
192194
'zulip_version',
193195
]
194196
model.client.register.assert_called_once_with(
@@ -1940,6 +1942,32 @@ def test__handle_subscription_event_subscribers_one_user_multiple_streams(
19401942
new_subscribers = model.stream_dict[stream_id]['subscribers']
19411943
assert new_subscribers == expected_subscribers
19421944

1945+
def test_update_twenty_four_hour_format(self, mocker, model):
1946+
event = {
1947+
'type': 'update_display_settings',
1948+
'setting_name': 'twenty_four_hour_time',
1949+
'setting': True
1950+
}
1951+
twenty_four_hr_format = False
1952+
1953+
first_msg_w = mocker.Mock()
1954+
second_msg_w = mocker.Mock()
1955+
first_msg_w.original_widget.message = {'id': 1}
1956+
second_msg_w.original_widget.message = {'id': 2}
1957+
self.controller.view.message_view = mocker.Mock(
1958+
log=[first_msg_w, second_msg_w])
1959+
create_msg_box_list = mocker.patch('zulipterminal.model.'
1960+
'create_msg_box_list')
1961+
# Test for change in time format
1962+
if event['setting_name'] == 'twenty_four_hour_time':
1963+
model.twenty_four_hr_format = twenty_four_hr_format
1964+
assert model.twenty_four_hr_format != event['setting']
1965+
model._handle_update_display_settings(event)
1966+
assert model.twenty_four_hr_format == event['setting']
1967+
assert create_msg_box_list.call_count == len(
1968+
self.controller.view.message_view.log)
1969+
assert model.controller.update_screen.called
1970+
19431971
@pytest.mark.parametrize('muted_streams, stream_id, is_muted', [
19441972
({1}, 1, True),
19451973
({1}, 2, False),

zulipterminal/api_types.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,18 @@ class UpdateMessageFlagsEvent(TypedDict):
106106
all: bool
107107

108108

109+
class UpdateDisplaySettings(TypedDict):
110+
type: Literal['update_display_settings']
111+
setting_name: str
112+
setting: bool
113+
114+
109115
Event = Union[
110116
MessageEvent,
111117
UpdateMessageEvent,
112118
ReactionEvent,
113119
SubscriptionEvent,
114120
TypingEvent,
115121
UpdateMessageFlagsEvent,
122+
UpdateDisplaySettings,
116123
]

zulipterminal/model.py

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ def __init__(self, controller: Any) -> None:
9696
('typing', self._handle_typing_event),
9797
('update_message_flags',
9898
self._handle_update_message_flags_event),
99+
('update_display_settings',
100+
self._handle_update_display_settings),
99101
])
100102
)
101103

@@ -149,6 +151,7 @@ def __init__(self, controller: Any) -> None:
149151
self.active_emoji_data = OrderedDict(sorted(all_emoji_data,
150152
key=lambda e: e[0]))
151153

154+
self.twenty_four_hr_format = self.initial_data['twenty_four_hour_time']
152155
self.new_user_input = True
153156
self._start_presence_updates()
154157

@@ -1166,10 +1169,17 @@ def _handle_update_message_flags_event(self, event: Event) -> None:
11661169
def formatted_local_time(self, timestamp: int,
11671170
*, show_seconds: bool) -> str:
11681171
local_time = datetime.datetime.fromtimestamp(timestamp)
1169-
if show_seconds:
1170-
return local_time.strftime('%a %b %d %H:%M:%S')
1172+
if self.twenty_four_hr_format:
1173+
if show_seconds:
1174+
time_string = '%a %b %d %H:%M:%S'
1175+
else:
1176+
time_string = '%a %b %d %H:%M'
11711177
else:
1172-
return local_time.strftime('%a %b %d %H:%M')
1178+
if show_seconds:
1179+
time_string = '%a %b %d %I:%M:%S %p'
1180+
else:
1181+
time_string = '%a %b %d %I:%M %p'
1182+
return local_time.strftime(time_string)
11731183

11741184
def _update_rendered_view(self, msg_id: int) -> None:
11751185
"""
@@ -1218,6 +1228,24 @@ def _update_rendered_view(self, msg_id: int) -> None:
12181228
self.controller.update_screen()
12191229
return
12201230

1231+
def _handle_update_display_settings(self, event: Event) -> None:
1232+
"""
1233+
Handle change to user display setting (Eg: Time format)
1234+
"""
1235+
assert event['type'] == "update_display_settings"
1236+
view = self.controller.view
1237+
if event['setting_name'] == 'twenty_four_hour_time':
1238+
self.twenty_four_hr_format = event['setting']
1239+
for msg_w in view.message_view.log:
1240+
msg_box = msg_w.original_widget
1241+
msg_id = msg_box.message['id']
1242+
last_msg = msg_box.last_message
1243+
msg_pos = view.message_view.log.index(msg_w)
1244+
msg_w_list = create_msg_box_list(self, [msg_id],
1245+
last_message=last_msg)
1246+
view.message_view.log[msg_pos] = msg_w_list[0]
1247+
self.controller.update_screen()
1248+
12211249
def _register_desired_events(self, *, fetch_data: bool=False) -> str:
12221250
fetch_types = None if not fetch_data else [
12231251
'realm',
@@ -1228,6 +1256,7 @@ def _register_desired_events(self, *, fetch_data: bool=False) -> str:
12281256
'muted_topics',
12291257
'realm_user', # Enables cross_realm_bots
12301258
'realm_user_groups',
1259+
'update_display_settings',
12311260
# zulip_version and zulip_feature_level are always returned in
12321261
# POST /register from Feature level 3.
12331262
'zulip_version',

0 commit comments

Comments
 (0)