Commit 8ff2b1bf authored by Bram Schoenmakers's avatar Bram Schoenmakers

Give groups proper names instead of internal representations

parent 0de3e0a9
...@@ -28,8 +28,7 @@ def is_priority_field(p_field): ...@@ -28,8 +28,7 @@ def is_priority_field(p_field):
""" Returns True when the field name denotes the priority. """ """ Returns True when the field name denotes the priority. """
return p_field.startswith('prio') return p_field.startswith('prio')
def get_field_function(p_field, p_group=False):
def get_field_function(p_field):
""" """
Given a property (string) of a todo, return a function that attempts to Given a property (string) of a todo, return a function that attempts to
access that property. If the property could not be located, return the access that property. If the property could not be located, return the
...@@ -38,19 +37,21 @@ def get_field_function(p_field): ...@@ -38,19 +37,21 @@ def get_field_function(p_field):
# default result # default result
result = lambda a: a result = lambda a: a
lower = lambda s: s if p_group else s.lower()
if is_priority_field(p_field): if is_priority_field(p_field):
# assign dummy priority when a todo has no priority # assign dummy priority when a todo has no priority
result = lambda a: a.priority() or 'ZZ' result = lambda a: a.priority() or ('None' if p_group else 'ZZ')
elif p_field == 'context' or p_field == 'contexts': elif p_field == 'context' or p_field == 'contexts':
result = lambda a: sorted([c.lower() for c in a.contexts()]) result = lambda a: sorted([lower(c) for c in a.contexts()])
elif p_field == 'creationdate' or p_field == 'creation': elif p_field == 'creationdate' or p_field == 'creation':
# when a task has no creation date, push it to the end by assigning it # when a task has no creation date, push it to the end by assigning it
# the maximum possible date. # the maximum possible date.
result = (lambda a: a.creation_date() if a.creation_date() result = (lambda a: a.creation_date() if a.creation_date()
else date.max) else ('None' if p_group else date.max))
elif p_field == 'done' or p_field == 'completed' or p_field == 'completion': elif p_field == 'done' or p_field == 'completed' or p_field == 'completion':
result = (lambda a: a.completion_date() if a.completion_date() result = (lambda a: a.completion_date() if a.completion_date()
else date.max) else ('None' if p_group else date.max))
elif p_field == 'importance': elif p_field == 'importance':
result = importance result = importance
elif p_field == 'importance-avg' or p_field == 'importance-average': elif p_field == 'importance-avg' or p_field == 'importance-average':
...@@ -58,15 +59,18 @@ def get_field_function(p_field): ...@@ -58,15 +59,18 @@ def get_field_function(p_field):
elif p_field == 'length': elif p_field == 'length':
result = lambda a: a.length() result = lambda a: a.length()
elif p_field == 'project' or p_field == 'projects': elif p_field == 'project' or p_field == 'projects':
result = lambda a: sorted([c.lower() for c in a.projects()]) result = lambda a: sorted([lower(p) for p in a.projects()])
elif p_field == 'text': elif p_field == 'text':
result = lambda a: a.text() result = lambda a: a.text()
else: else:
# try to find the corresponding tag # try to find the corresponding tag
# when a tag is not present, push it to the end of the list by giving # when a tag is not present, push it to the end of the list by giving
# it an artificially higher value # it an artificially higher value
result = (lambda a: "0" + a.tag_value(p_field) if a.has_tag(p_field) if p_group:
else "1") result = (lambda a: a.tag_value(p_field) if a.has_tag(p_field) else '')
else:
result = (lambda a: "0" + a.tag_value(p_field) if a.has_tag(p_field)
else "1")
return result return result
...@@ -107,8 +111,9 @@ class Sorter(object): ...@@ -107,8 +111,9 @@ class Sorter(object):
""" """
def __init__(self, p_sortstring="desc:priority", p_groupstring=""): def __init__(self, p_sortstring="desc:priority", p_groupstring=""):
self.groupfunctions = self._parse(p_groupstring) if p_groupstring else [] self.groupfunctions = self._parse(p_groupstring, p_group=True) if p_groupstring else []
self.sortfunctions = self._parse(p_sortstring) self.pregroupfunctions = self._parse(p_groupstring, p_group=False) if p_groupstring else []
self.sortfunctions = self._parse(p_sortstring, p_group=False)
def sort(self, p_todos): def sort(self, p_todos):
""" """
...@@ -126,7 +131,7 @@ class Sorter(object): ...@@ -126,7 +131,7 @@ class Sorter(object):
Groups the todos according to the given group string. Groups the todos according to the given group string.
""" """
# preorder todos for the group sort # preorder todos for the group sort
p_todos = _apply_sort_functions(p_todos, self.groupfunctions) p_todos = _apply_sort_functions(p_todos, self.pregroupfunctions)
# initialize result with a single group # initialize result with a single group
result = OrderedDict([((), p_todos)]) result = OrderedDict([((), p_todos)])
...@@ -155,7 +160,7 @@ class Sorter(object): ...@@ -155,7 +160,7 @@ class Sorter(object):
return result return result
def _parse(self, p_string): def _parse(self, p_string, p_group):
""" """
Parses a sort string and returns a list of functions and the Parses a sort string and returns a list of functions and the
desired order. desired order.
...@@ -176,7 +181,7 @@ class Sorter(object): ...@@ -176,7 +181,7 @@ class Sorter(object):
field = parsed_field.group('field') field = parsed_field.group('field')
if field: if field:
function = get_field_function(field) function = get_field_function(field, p_group)
# reverse order for priority: lower characters have higher # reverse order for priority: lower characters have higher
# priority # priority
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment