Skip to content

Commit 0b939ed

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. Fixes #770
1 parent 1be52c5 commit 0b939ed

File tree

5 files changed

+58
-5
lines changed

5 files changed

+58
-5
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: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ def test_register_initial_desired_events(self, mocker, initial_data):
177177
'subscription',
178178
'typing',
179179
'update_message_flags',
180+
'update_display_settings',
180181
]
181182
fetch_event_types = [
182183
'realm',
@@ -187,6 +188,7 @@ def test_register_initial_desired_events(self, mocker, initial_data):
187188
'muted_topics',
188189
'realm_user',
189190
'realm_user_groups',
191+
'update_display_settings',
190192
'zulip_version',
191193
]
192194
model.client.register.assert_called_once_with(
@@ -1916,6 +1918,23 @@ def test__handle_subscription_event_subscribers_one_user_multiple_streams(
19161918
new_subscribers = model.stream_dict[stream_id]['subscribers']
19171919
assert new_subscribers == expected_subscribers
19181920

1921+
@pytest.mark.parametrize('event, twenty_four_hr_format', [
1922+
({'setting_name': 'twenty_four_hour_time',
1923+
'setting': True}, False),
1924+
], ids=['twenty_four_hour_time'])
1925+
def test__handle_update_display_settings(self, mocker, model,
1926+
twenty_four_hr_format,
1927+
event):
1928+
event['type'] = 'update_display_settings'
1929+
1930+
# Test for change in time format
1931+
if event['setting_name'] == 'twenty_four_hour_time':
1932+
model.twenty_four_hr_format = twenty_four_hr_format
1933+
assert model.twenty_four_hr_format != event['setting']
1934+
model._handle_update_display_settings(event)
1935+
assert model.twenty_four_hr_format == event['setting']
1936+
assert model.controller.update_screen.called
1937+
19191938
@pytest.mark.parametrize('muted_streams, stream_id, is_muted', [
19201939
({1}, 1, True),
19211940
({1}, 2, False),

zulipterminal/api_types.py

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

9292

93+
class UpdateDisplaySettings(TypedDict):
94+
type: Literal['update_display_settings']
95+
setting_name: str
96+
setting: bool
97+
98+
9399
Event = Union[
94100
MessageEvent,
95101
UpdateMessageEvent,
96102
ReactionEvent,
97103
SubscriptionEvent,
98104
TypingEvent,
99105
UpdateMessageFlagsEvent,
106+
UpdateDisplaySettings,
100107
]

zulipterminal/model.py

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ def __init__(self, controller: Any) -> None:
8989
('typing', self._handle_typing_event),
9090
('update_message_flags',
9191
self._handle_update_message_flags_event),
92+
('update_display_settings',
93+
self._handle_update_display_settings),
9294
])
9395
)
9496

@@ -142,6 +144,7 @@ def __init__(self, controller: Any) -> None:
142144
self.active_emoji_data = OrderedDict(sorted(all_emoji_data,
143145
key=lambda e: e[0]))
144146

147+
self.twenty_four_hr_format = self.initial_data['twenty_four_hour_time']
145148
self.new_user_input = True
146149
self._start_presence_updates()
147150

@@ -1139,10 +1142,16 @@ def _handle_update_message_flags_event(self, event: Event) -> None:
11391142
def formatted_local_time(self, timestamp: int,
11401143
*, show_seconds: bool) -> str:
11411144
local_time = datetime.datetime.fromtimestamp(timestamp)
1142-
if show_seconds:
1143-
return local_time.strftime('%a %b %d %H:%M:%S')
1145+
if self.twenty_four_hr_format:
1146+
if show_seconds:
1147+
return local_time.strftime('%a %b %d %H:%M:%S')
1148+
else:
1149+
return local_time.strftime('%a %b %d %H:%M')
11441150
else:
1145-
return local_time.strftime('%a %b %d %H:%M')
1151+
if show_seconds:
1152+
return local_time.strftime('%a %b %d %I:%M:%S %p')
1153+
else:
1154+
return local_time.strftime('%a %b %d %I:%M %p')
11461155

11471156
def _update_rendered_view(self, msg_id: int) -> None:
11481157
"""
@@ -1191,6 +1200,24 @@ def _update_rendered_view(self, msg_id: int) -> None:
11911200
self.controller.update_screen()
11921201
return
11931202

1203+
def _handle_update_display_settings(self, event: Event) -> None:
1204+
"""
1205+
Handle change to user display setting (Eg: Time format)
1206+
"""
1207+
assert event['type'] == "update_display_settings"
1208+
view = self.controller.view
1209+
if event['setting_name'] == 'twenty_four_hour_time':
1210+
self.twenty_four_hr_format = event['setting']
1211+
for msg_w in view.message_view.log:
1212+
msg_box = msg_w.original_widget
1213+
msg_id = msg_box.message['id']
1214+
last_msg = msg_box.last_message
1215+
msg_pos = view.message_view.log.index(msg_w)
1216+
msg_w_list = create_msg_box_list(self, [msg_id],
1217+
last_message=last_msg)
1218+
view.message_view.log[msg_pos] = msg_w_list[0]
1219+
self.controller.update_screen()
1220+
11941221
def _register_desired_events(self, *, fetch_data: bool=False) -> str:
11951222
fetch_types = None if not fetch_data else [
11961223
'realm',
@@ -1201,6 +1228,7 @@ def _register_desired_events(self, *, fetch_data: bool=False) -> str:
12011228
'muted_topics',
12021229
'realm_user', # Enables cross_realm_bots
12031230
'realm_user_groups',
1231+
'update_display_settings',
12041232
# zulip_version and zulip_feature_level are always returned in
12051233
# POST /register from Feature level 3.
12061234
'zulip_version',

zulipterminal/ui_tools/boxes.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,6 @@ def __init__(self, message: Message, model: 'Model',
689689

690690
# mouse_event helper variable
691691
self.displaying_selection_hint = False
692-
693692
super().__init__(self.main_view())
694693

695694
def need_recipient_header(self) -> bool:
@@ -1133,7 +1132,6 @@ def soup2markup(cls, soup: Any, metadata: Dict[str, Any],
11331132
return markup, metadata['message_links'], metadata['time_mentions']
11341133

11351134
def main_view(self) -> List[Any]:
1136-
11371135
# Recipient Header
11381136
if self.need_recipient_header():
11391137
if self.message['type'] == 'stream':

0 commit comments

Comments
 (0)