Commit ab0ecdd4 authored by Jacek Sowiński's avatar Jacek Sowiński

Add %h and %H for sets of humanized dates

%h stands for: "due %D, starts in/started %S"
%H stands for: "%C, %h"

Also reorder %k and %K to maintain consistency in code.
parent 7120f866
...@@ -29,3 +29,26 @@ def humanize_date(p_datetime): ...@@ -29,3 +29,26 @@ def humanize_date(p_datetime):
now = arrow.now() now = arrow.now()
date = now.replace(day=p_datetime.day, month=p_datetime.month, year=p_datetime.year) date = now.replace(day=p_datetime.day, month=p_datetime.month, year=p_datetime.year)
return date.humanize() return date.humanize()
def humanize_dates(p_due=None, p_start=None, p_creation=None):
"""
Returns string with humanized versions of p_due, p_start and p_creation.
Examples:
- all dates: "16 days ago, due in a month, started 2 days ago"
- p_due and p_start: "due in a month, started 2 days ago"
- p_creation and p_due: "16 days ago, due in a month"
"""
dates_list = []
if p_creation:
dates_list.append(humanize_date(p_creation))
if p_due:
dates_list.append('due ' + humanize_date(p_due))
if p_start:
now = arrow.now().date()
start = humanize_date(p_start)
if p_start <= now:
dates_list.append('started ' + start)
else:
dates_list.append('starts in ' + start)
return ', '.join(dates_list)
...@@ -22,7 +22,7 @@ from six import u ...@@ -22,7 +22,7 @@ from six import u
from topydo.lib.Colors import NEUTRAL_COLOR, Colors from topydo.lib.Colors import NEUTRAL_COLOR, Colors
from topydo.lib.Config import config from topydo.lib.Config import config
from topydo.lib.ListFormat import filler, humanize_date from topydo.lib.ListFormat import filler, humanize_date, humanize_dates
class PrettyPrinterFilter(object): class PrettyPrinterFilter(object):
...@@ -148,22 +148,28 @@ class PrettyPrinterFormatFilter(PrettyPrinterFilter): ...@@ -148,22 +148,28 @@ class PrettyPrinterFormatFilter(PrettyPrinterFilter):
# relative due date # relative due date
'D': lambda t: humanize_date(t.due_date()) if t.due_date() else '', 'D': lambda t: humanize_date(t.due_date()) if t.due_date() else '',
# relative dates: due, start
'h': lambda t: humanize_dates(t.due_date(), t.start_date()),
# relative dates in form: creation, due, start
'H': lambda t: humanize_dates(t.due_date(), t.start_date(), t.creation_date()),
# todo ID # todo ID
'i': lambda t: str(self.todolist.number(t)), 'i': lambda t: str(self.todolist.number(t)),
# todo ID pre-filled with 1 or 2 spaces if its length is <3 # todo ID pre-filled with 1 or 2 spaces if its length is <3
'I': lambda t: filler(str(self.todolist.number(t)), 3), 'I': lambda t: filler(str(self.todolist.number(t)), 3),
# list of tags (spaces)
'K': lambda t: ' '.join([u('{}:{}').format(tag, value)
for tag, value in sorted(p_todo.tags()) if
tag not in config().hidden_tags()]),
# list of tags (spaces) without due: and t: # list of tags (spaces) without due: and t:
'k': lambda t: ' '.join([u('{}:{}').format(tag, value) 'k': lambda t: ' '.join([u('{}:{}').format(tag, value)
for tag, value in sorted(p_todo.tags()) if for tag, value in sorted(p_todo.tags()) if
tag not in config().hidden_tags() + [config().tag_start(), config().tag_due()]]), tag not in config().hidden_tags() + [config().tag_start(), config().tag_due()]]),
# list of tags (spaces)
'K': lambda t: ' '.join([u('{}:{}').format(tag, value)
for tag, value in sorted(p_todo.tags()) if
tag not in config().hidden_tags()]),
# priority # priority
'p': lambda t: t.priority() if t.priority() else '', 'p': lambda t: t.priority() if t.priority() else '',
......
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