From 9d99e078f14ae7c2cc985de816c3a606fc4e9b8a Mon Sep 17 00:00:00 2001 From: "James E. Blair" Date: Wed, 11 Mar 2015 08:45:11 -0700 Subject: [PATCH] Display times in local tz By default, display times using the local timezone. Add timezone info to time displays where space permits. Add an option to restore the current behavior where times are displayed in UTC. Change-Id: I6035b6277dc49774537a762b2946c56a3b8dec17 Co-Authored-By: Bradley Jones --- examples/reference-gertty.yaml | 4 ++++ gertty/app.py | 8 ++++++++ gertty/config.py | 2 ++ gertty/view/change.py | 7 ++++--- gertty/view/change_list.py | 19 ++++++++++++------- 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/examples/reference-gertty.yaml b/examples/reference-gertty.yaml index 256b765..1dbebae 100644 --- a/examples/reference-gertty.yaml +++ b/examples/reference-gertty.yaml @@ -146,6 +146,10 @@ commentlinks: # default. To disable this behavior, uncomment the following line: # thread-changes: false +# Times are displayed in the local timezone by default. To display +# them in UTC instead, uncomment the following line: +# display-times-in-utc: true + # Uncomment the following lines to Hide comments by default that match # certain criteria. You can toggle their display with 't'. Currently # the only supported criterion is "author". diff --git a/gertty/app.py b/gertty/app.py index 00f7231..04be6d4 100644 --- a/gertty/app.py +++ b/gertty/app.py @@ -14,6 +14,7 @@ # under the License. import argparse +import dateutil import logging import os import Queue @@ -441,6 +442,13 @@ class App(object): self.log.debug("Open URL %s" % url) webbrowser.open_new_tab(url) + def time(self, dt): + utc = dt.replace(tzinfo=dateutil.tz.tzutc()) + if self.config.utc: + return utc + local = utc.astimezone(dateutil.tz.tzlocal()) + return local + def version(): return "Gertty version: %s" % gertty.version.version_info.version_string() diff --git a/gertty/config.py b/gertty/config.py index b5285d4..f46b004 100644 --- a/gertty/config.py +++ b/gertty/config.py @@ -111,6 +111,7 @@ class ConfigSchema(object): 'diff-view': str, 'hide-comments': self.hide_comments, 'thread-changes': bool, + 'display-times-in-utc': bool }) return schema @@ -212,6 +213,7 @@ class Config(object): self.hide_comments.append(re.compile(h['author'])) self.thread_changes = self.config.get('thread-changes', True) + self.utc = self.config.get('display-times-in-utc', False) def getServer(self, name=None): for server in self.config['servers']: diff --git a/gertty/view/change.py b/gertty/view/change.py index e33d1e8..110aee2 100644 --- a/gertty/view/change.py +++ b/gertty/view/change.py @@ -360,6 +360,7 @@ class ChangeMessageBox(mywid.HyperText): def refresh(self, message): self.message_created = message.created + created = self.app.time(message.created) lines = message.message.split('\n') if message.draft: lines.insert(0, '') @@ -367,7 +368,7 @@ class ChangeMessageBox(mywid.HyperText): text = [('change-message-name', message.author_name), ('change-message-header', ': '+lines.pop(0)), ('change-message-header', - message.created.strftime(' (%Y-%m-%d %H:%M:%S%z)'))] + created.strftime(' (%Y-%m-%d %H:%M:%S%z)'))] if message.draft and not message.pending: text.append(('change-message-draft', ' (draft)')) if lines and lines[-1]: @@ -570,8 +571,8 @@ class ChangeView(urwid.WidgetWrap): self.project_label.set_text(('change-data', change.project.name)) self.branch_label.set_text(('change-data', change.branch)) self.topic_label.set_text(('change-data', self.topic)) - self.created_label.set_text(('change-data', str(change.created))) - self.updated_label.set_text(('change-data', str(change.updated))) + self.created_label.set_text(('change-data', str(self.app.time(change.created)))) + self.updated_label.set_text(('change-data', str(self.app.time(change.updated)))) self.status_label.set_text(('change-data', change.status)) self.commit_message.set_text(change.revisions[-1].message) diff --git a/gertty/view/change_list.py b/gertty/view/change_list.py index 3e15964..a25406f 100644 --- a/gertty/view/change_list.py +++ b/gertty/view/change_list.py @@ -59,9 +59,10 @@ class ChangeRow(urwid.Button): def selectable(self): return True - def __init__(self, change, categories, project=False, owner=False, + def __init__(self, app, change, categories, project=False, owner=False, updated=False, callback=None): super(ChangeRow, self).__init__('', on_press=callback, user_data=change.key) + self.app = app self.change_key = change.key self.subject = urwid.Text(u'', wrap='clip') self.number = urwid.Text(u'') @@ -95,10 +96,12 @@ class ChangeRow(urwid.Button): self.number.set_text(str(change.number)) self.project.set_text(change.project.name.split('/')[-1]) self.owner.set_text(change.owner_name) - if datetime.date.today() == change.updated.date(): - self.updated.set_text(change.updated.strftime("%I:%M %p").upper()) + today = self.app.time(datetime.datetime.utcnow()).date() + updated_time = self.app.time(change.updated) + if today == updated_time.date(): + self.updated.set_text(updated_time.strftime("%I:%M %p").upper()) else: - self.updated.set_text(change.updated.strftime("%Y-%m-%d")) + self.updated.set_text(updated_time.strftime("%Y-%m-%d")) del self.columns.contents[self.num_columns:] for category in categories: v = change.getMaxForCategory(category) @@ -226,9 +229,11 @@ class ChangeListView(urwid.WidgetWrap): for change in change_list: row = self.change_rows.get(change.key) if not row: - row = ChangeRow(change, self.categories, self.display_project, - self.display_owner, self.display_updated, - callback=self.onSelect) + row = ChangeRow(self.app, change, self.categories, + self.display_project, + self.display_owner, + self.display_updated, + callback=self.onSelect) self.listbox.body.insert(i, row) self.change_rows[change.key] = row else: