Merge "Add ability to sort change list"

This commit is contained in:
Jenkins 2014-11-19 23:37:01 +00:00 committed by Gerrit Code Review
commit 35030cec1c
3 changed files with 56 additions and 5 deletions

View File

@ -578,12 +578,15 @@ class DatabaseSession(object):
except sqlalchemy.orm.exc.NoResultFound:
return None
def getChanges(self, query, unreviewed=False):
def getChanges(self, query, unreviewed=False, sort_by='number'):
self.database.log.debug("Search query: %s" % query)
q = self.session().query(Change).filter(self.search.parse(query))
if unreviewed:
q = q.filter(change_table.c.hidden==False, change_table.c.reviewed==False)
q = q.order_by(change_table.c.number)
if sort_by == 'updated':
q = q.order_by(change_table.c.updated)
else:
q = q.order_by(change_table.c.number)
self.database.log.debug("Search SQL: %s" % q)
try:
return q.all()

View File

@ -53,6 +53,9 @@ REFRESH = 'refresh'
EDIT_TOPIC = 'edit topic'
EDIT_COMMIT_MESSAGE = 'edit commit message'
SUBMIT_CHANGE = 'submit change'
SORT_BY_NUMBER = 'sort by number'
SORT_BY_UPDATED = 'sort by updated'
SORT_BY_REVERSE = 'reverse the sort'
# Project list screen:
TOGGLE_LIST_REVIEWED = 'toggle list reviewed'
TOGGLE_LIST_SUBSCRIBED = 'toggle list subscribed'
@ -97,6 +100,9 @@ DEFAULT_KEYMAP = {
EDIT_TOPIC: 'ctrl t',
EDIT_COMMIT_MESSAGE: 'ctrl d',
SUBMIT_CHANGE: 'ctrl u',
SORT_BY_NUMBER: 'n',
SORT_BY_UPDATED: 'u',
SORT_BY_REVERSE: 'r',
TOGGLE_LIST_REVIEWED: 'l',
TOGGLE_LIST_SUBSCRIBED: 'L',

View File

@ -106,7 +106,13 @@ class ChangeListView(urwid.WidgetWrap):
(key(keymap.TOGGLE_REVIEWED),
"Toggle the reviewed flag for the currently selected change"),
(key(keymap.REFRESH),
"Sync all projects")
"Sync all projects"),
(key(keymap.SORT_BY_NUMBER),
"Sort changes by number"),
(key(keymap.SORT_BY_UPDATED),
"Sort changes by how recently the change was updated"),
(key(keymap.SORT_BY_REVERSE),
"Reverse the sort")
]
def __init__(self, app, query, query_desc=None, unreviewed=False):
@ -120,6 +126,8 @@ class ChangeListView(urwid.WidgetWrap):
self.display_owner = self.display_project = self.display_updated = True
if '_project_key' in query:
self.display_project = False
self.sort_by = 'number'
self.reverse = False
self.header = ChangeListHeader(self.display_project, self.display_owner,
self.display_updated)
self.categories = []
@ -133,7 +141,8 @@ class ChangeListView(urwid.WidgetWrap):
def refresh(self):
unseen_keys = set(self.change_rows.keys())
with self.app.db.getSession() as session:
lst = session.getChanges(self.query, self.unreviewed)
lst = session.getChanges(self.query, self.unreviewed,
sort_by=self.sort_by)
if self.unreviewed:
self.title = u'Unreviewed changes in %s' % self.query_desc
else:
@ -144,7 +153,11 @@ class ChangeListView(urwid.WidgetWrap):
categories |= set(change.getCategories())
self.categories = sorted(categories)
i = 0
for change in lst:
if self.reverse:
change_list = reversed(lst)
else:
change_list = lst
for change in change_list:
row = self.change_rows.get(change.key)
if not row:
row = ChangeRow(change, self.categories, self.display_project,
@ -163,6 +176,11 @@ class ChangeListView(urwid.WidgetWrap):
self.listbox.body.remove(row)
del self.change_rows[key]
def clearChangeList(self):
for key, value in self.change_rows.iteritems():
self.listbox.body.remove(value)
self.change_rows = {}
def getNextChangeKey(self, change_key):
row = self.change_rows.get(change_key)
try:
@ -225,6 +243,30 @@ class ChangeListView(urwid.WidgetWrap):
sync.SyncSubscribedProjectsTask(sync.HIGH_PRIORITY))
self.app.status.update()
return None
if keymap.SORT_BY_NUMBER in commands:
if not len(self.listbox.body):
return None
self.sort_by = 'number'
self.clearChangeList()
self.refresh()
return None
if keymap.SORT_BY_UPDATED in commands:
if not len(self.listbox.body):
return None
self.sort_by = 'updated'
self.clearChangeList()
self.refresh()
return None
if keymap.SORT_BY_REVERSE in commands:
if not len(self.listbox.body):
return None
if self.reverse:
self.reverse = False
else:
self.reverse = True
self.clearChangeList()
self.refresh()
return None
return key
def onSelect(self, button, change_key):