from .dates_add_days import parse_iso_date from .dates_day_of_week import day_name from .dates_days_between import days_between from .todo_due_status import due_status from .todo_item import Todo MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] def due_label(todo: Todo, today: str) -> str: """The short English label for a todo's due date, built on due_status.""" status = due_status(todo, today) if status == "done" or status == "none": return "" due = todo.due assert due is not None if status == "overdue": late = days_between(due, today) return "1 day overdue" if late == 1 else "%d days overdue" % late if status == "today": return "Due today" if status == "tomorrow": return "Due tomorrow" d = parse_iso_date(due) label = "Due %s %d %s" % (day_name(due)[0:3], d.day, MONTHS[d.month - 1]) # The year only when it differs, so next January never reads as this one. return label if d.year == parse_iso_date(today).year else "%s %d" % (label, d.year)