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 <jones.bradley@me.com>
This commit is contained in:
James E. Blair 2015-03-11 08:45:11 -07:00
parent c5f7246717
commit 9d99e078f1
5 changed files with 30 additions and 10 deletions

View File

@ -146,6 +146,10 @@ commentlinks:
# default. To disable this behavior, uncomment the following line: # default. To disable this behavior, uncomment the following line:
# thread-changes: false # 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 # Uncomment the following lines to Hide comments by default that match
# certain criteria. You can toggle their display with 't'. Currently # certain criteria. You can toggle their display with 't'. Currently
# the only supported criterion is "author". # the only supported criterion is "author".

View File

@ -14,6 +14,7 @@
# under the License. # under the License.
import argparse import argparse
import dateutil
import logging import logging
import os import os
import Queue import Queue
@ -441,6 +442,13 @@ class App(object):
self.log.debug("Open URL %s" % url) self.log.debug("Open URL %s" % url)
webbrowser.open_new_tab(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(): def version():
return "Gertty version: %s" % gertty.version.version_info.version_string() return "Gertty version: %s" % gertty.version.version_info.version_string()

View File

@ -111,6 +111,7 @@ class ConfigSchema(object):
'diff-view': str, 'diff-view': str,
'hide-comments': self.hide_comments, 'hide-comments': self.hide_comments,
'thread-changes': bool, 'thread-changes': bool,
'display-times-in-utc': bool
}) })
return schema return schema
@ -212,6 +213,7 @@ class Config(object):
self.hide_comments.append(re.compile(h['author'])) self.hide_comments.append(re.compile(h['author']))
self.thread_changes = self.config.get('thread-changes', True) self.thread_changes = self.config.get('thread-changes', True)
self.utc = self.config.get('display-times-in-utc', False)
def getServer(self, name=None): def getServer(self, name=None):
for server in self.config['servers']: for server in self.config['servers']:

View File

@ -360,6 +360,7 @@ class ChangeMessageBox(mywid.HyperText):
def refresh(self, message): def refresh(self, message):
self.message_created = message.created self.message_created = message.created
created = self.app.time(message.created)
lines = message.message.split('\n') lines = message.message.split('\n')
if message.draft: if message.draft:
lines.insert(0, '') lines.insert(0, '')
@ -367,7 +368,7 @@ class ChangeMessageBox(mywid.HyperText):
text = [('change-message-name', message.author_name), text = [('change-message-name', message.author_name),
('change-message-header', ': '+lines.pop(0)), ('change-message-header', ': '+lines.pop(0)),
('change-message-header', ('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: if message.draft and not message.pending:
text.append(('change-message-draft', ' (draft)')) text.append(('change-message-draft', ' (draft)'))
if lines and lines[-1]: if lines and lines[-1]:
@ -570,8 +571,8 @@ class ChangeView(urwid.WidgetWrap):
self.project_label.set_text(('change-data', change.project.name)) self.project_label.set_text(('change-data', change.project.name))
self.branch_label.set_text(('change-data', change.branch)) self.branch_label.set_text(('change-data', change.branch))
self.topic_label.set_text(('change-data', self.topic)) self.topic_label.set_text(('change-data', self.topic))
self.created_label.set_text(('change-data', str(change.created))) self.created_label.set_text(('change-data', str(self.app.time(change.created))))
self.updated_label.set_text(('change-data', str(change.updated))) self.updated_label.set_text(('change-data', str(self.app.time(change.updated))))
self.status_label.set_text(('change-data', change.status)) self.status_label.set_text(('change-data', change.status))
self.commit_message.set_text(change.revisions[-1].message) self.commit_message.set_text(change.revisions[-1].message)

View File

@ -59,9 +59,10 @@ class ChangeRow(urwid.Button):
def selectable(self): def selectable(self):
return True 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): updated=False, callback=None):
super(ChangeRow, self).__init__('', on_press=callback, user_data=change.key) super(ChangeRow, self).__init__('', on_press=callback, user_data=change.key)
self.app = app
self.change_key = change.key self.change_key = change.key
self.subject = urwid.Text(u'', wrap='clip') self.subject = urwid.Text(u'', wrap='clip')
self.number = urwid.Text(u'') self.number = urwid.Text(u'')
@ -95,10 +96,12 @@ class ChangeRow(urwid.Button):
self.number.set_text(str(change.number)) self.number.set_text(str(change.number))
self.project.set_text(change.project.name.split('/')[-1]) self.project.set_text(change.project.name.split('/')[-1])
self.owner.set_text(change.owner_name) self.owner.set_text(change.owner_name)
if datetime.date.today() == change.updated.date(): today = self.app.time(datetime.datetime.utcnow()).date()
self.updated.set_text(change.updated.strftime("%I:%M %p").upper()) updated_time = self.app.time(change.updated)
if today == updated_time.date():
self.updated.set_text(updated_time.strftime("%I:%M %p").upper())
else: 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:] del self.columns.contents[self.num_columns:]
for category in categories: for category in categories:
v = change.getMaxForCategory(category) v = change.getMaxForCategory(category)
@ -226,9 +229,11 @@ class ChangeListView(urwid.WidgetWrap):
for change in change_list: for change in change_list:
row = self.change_rows.get(change.key) row = self.change_rows.get(change.key)
if not row: if not row:
row = ChangeRow(change, self.categories, self.display_project, row = ChangeRow(self.app, change, self.categories,
self.display_owner, self.display_updated, self.display_project,
callback=self.onSelect) self.display_owner,
self.display_updated,
callback=self.onSelect)
self.listbox.body.insert(i, row) self.listbox.body.insert(i, row)
self.change_rows[change.key] = row self.change_rows[change.key] = row
else: else: