def update_relative_due_date(self): if not Task.scan_due_date(self.raw): match = Task._any_due_date_regex.search(self.raw) if match: date = Util.mod_date_by(Util.get_today(), match.group(1)) if date: self.raw = re.sub(Task._any_due_date_regex, " ", self.raw).strip() self.set_due(date)
def commit_due(self, text): self.frame.set_focus("body") self.update_footer("") focus, _ = self.listbox.get_focus() try: due = focus.task.get_due() or Util.get_today() due = Util.mod_date_by(due, text) focus.task.set_due(due) self.tasklist.save() self.fill_listbox() except Exception: self.update_header("Invalid format!")
def update_header(self, message="", color="header_message"): today = Util.get_today_str() self.frame.header = urwid.AttrMap( urwid.Columns([ urwid.Text([ ( "header_task_count", "{0} Tasks ".format( len(Tasklist.filter_pending(self.items))), ), ( "header_task_due_count", " {0} due ".format( len(Tasklist.filter_due(self.items, today))), ), ("header_sort", " s:{0} ".format(self.sort_order[0])), ( "header_view", " v:{0}days ".format(self.view_days) if self.view_days >= 0 else "", ), ]), urwid.Text((color, message), align="right"), ]), "header", )
def update_task(self, search=None): t = self.task today = Util.get_today() self.status = t.get_status(today.isoformat(), Util.get_next_monday().isoformat()) if search: show = Tasklist.get_search_highlight(search, t.raw) text = urwid.Text(show, wrap=self.wrapping) else: status_col = "status_" + self.status[0] if t.is_done() or t.is_deleted(): text_col = status_col elif t.priority and t.priority.lower() in "abcdef": text_col = "priority_" + t.priority.lower() else: text_col = "plain" due_name = Util.get_date_name(t.get_due(), today=today) if t.rec_int: if t.rec_int[0] == "+": rec_text = "every " + t.rec_int[1:] else: rec_text = "after " + t.rec_int else: rec_text = "" desc = t.get_desc() tags = ' '.join(t.tags) main = urwid.Text([(text_col, desc), " ", ('context', tags)], wrap=self.wrapping) due = urwid.Text((status_col, due_name)) rec = urwid.Text(("plain", rec_text)) context = urwid.Text(("context", ",".join(t.contexts))) text = urwid.Columns( [("weight", 15, main), (12, due), (25, context)], dividechars=2 ) self._w = urwid.AttrMap( urwid.AttrMap(text, None, "selected"), None, self.colorscheme.focus_map )
def set_done(self, done=True): if self.is_done() == done: return if done: self.set_priority("") today = datetime.date.today() self.update("x " + today.isoformat() + " " + self.raw) if self.rec_int: (prefix, value, itype) = Task._rec_int_parts_regex.match( self.rec_int).groups() value = int(value) date = self.get_due() if prefix == "+" else today return Util.date_add_interval(date, itype, value) else: self.update(re.sub(Task._done_regex, "", self.raw))
def task_changed(self): # finished editing self.skip_task_list_updated = False focus, idx = self.listbox.get_focus() t = focus.task if t.raw: t.update_relative_due_date() if not t.creation_date: t.set_creation_date(Util.get_today()) self.update_footer("") self.tasklist.save() elif idx == 0: # new empty task self.tasklist.delete_by_id(t.task_id) t = None self.fill_listbox(t)
def toggle_done(self, focus): t = focus.task if t.is_done(): t.set_done(False) self.tasklist.save() self.fill_listbox() else: last = t.raw rec = t.set_done() if rec: self.tasklist.insert_new(-1, t.raw) # insert done t.update(last) t.set_due(rec) t.set_creation_date(Util.get_today()) else: self.listbox.move_offs(1) self.archive_tasks() # save & update list
def filter_by_days(items, days): if days >= 0: due = Util.get_today_str(days) return [item for item in items if item.is_due(due) or not item.has_due()] else: return items