X-Git-Url: https://plomlompom.com/repos/berlin_corona.txt?a=blobdiff_plain;f=todo.py;h=8c911fb1a9247325fcd603a2e65ed6b9269f41d0;hb=053b249eb31c5772f5e391058a7580d05966d1a5;hp=478a41e106e23c525eb7af7d172d4e518165cf63;hpb=942c977e0052d09300625e7a5c1b5fc2eede9098;p=misc diff --git a/todo.py b/todo.py index 478a41e..8c911fb 100644 --- a/todo.py +++ b/todo.py @@ -3,7 +3,6 @@ import json from uuid import uuid4 from datetime import datetime, timedelta from urllib.parse import parse_qs -from jinja2 import Template from jinja2 import Environment as JinjaEnv, FileSystemLoader as JinjaFSLoader from urllib.parse import urlparse db_path = '/home/plom/org/todo_new.json' @@ -160,6 +159,7 @@ class Day: if v == self: return k + class Todo: def __init__(self, day, done=False, day_effort=None, comment='', day_tags=None, importance=1.0): @@ -202,8 +202,8 @@ class Todo: def tags(self): return self.day_tags | self.task.tags - def is_empty(self): - return self.done or (self.day_effort is not None) or len(self.comment) > 0 or len(self.day_tags) > 0 + def internals_empty(self): + return len(self.comment) == 0 and len(self.day_tags) == 0 class TodoDB(PlomDB): @@ -309,7 +309,7 @@ class TodoDB(PlomDB): task_rows.sort(key=lambda r: False if not r['todo'] else True, reverse=True) elif task_sort == 'comment': task_rows.sort(key=lambda r: '' if not r['todo'] else r['todo'].comment, reverse=True) - return j2env.get_template('day.html').render(db=self, action=self.prefix+'/day', prev_date=prev_date_str, next_date=next_date_str, task_rows=task_rows) + return j2env.get_template('day.html').render(db=self, action=self.prefix+'/day', prev_date=prev_date_str, next_date=next_date_str, task_rows=task_rows, sort=task_sort) def show_calendar(self, start_date_str, end_date_str): self.t_filter_and = ['calendar'] @@ -333,21 +333,25 @@ class TodoDB(PlomDB): days_to_show[current_date].weekday = datetime.strptime(current_date, DATE_FORMAT).strftime('%A')[:2] return j2env.get_template('calendar.html').render(db=self, days=days_to_show, action=self.prefix+'/calendar', today=str(datetime.now())[:10], start_date=start_date_str, end_date=end_date_str) - def show_todo(self, task_uuid, selected_date): + def show_todo(self, task_uuid, selected_date, referer): + if selected_date not in self.days.keys(): + self.days[selected_date] = self.add_day() if task_uuid in self.days[selected_date].todos: todo = self.days[selected_date].todos[task_uuid] else: todo = self.days[selected_date].add_todo(task_uuid) - return j2env.get_template('todo.html').render(db=self, todo=todo, action=self.prefix+'/todo') + return j2env.get_template('todo.html').render(db=self, todo=todo, action=self.prefix+'/todo', referer=referer) def update_todo_mini(self, task_uuid, date, day_effort, done, importance): + if date not in self.days.keys(): + self.days[date] = self.add_day() if task_uuid in self.days[date].todos.keys(): todo = self.days[date].todos[task_uuid] else: todo = self.days[date].add_todo(task_uuid) - todo.day_effort = float(day_effort) if len(day_effort) > 0 else None + todo.day_effort = day_effort todo.done = done - todo.importance = float(importance) + todo.importance = importance return todo def collect_tags(self, tags_joined, tags_checked): @@ -359,13 +363,15 @@ class TodoDB(PlomDB): return tags def update_todo(self, task_uuid, date, day_effort, done, comment, day_tags_joined, day_tags_checked, importance): + day_effort = float(day_effort) if len(day_effort) > 0 else None + importance = float(importance) todo = self.update_todo_mini(task_uuid, date, day_effort, done, importance) todo.comment = comment todo.day_tags = self.collect_tags(day_tags_joined, day_tags_checked) - def show_task(self, id_): + def show_task(self, id_, referer=''): task = self.tasks[id_] if id_ else self.add_task() - return j2env.get_template('task.html').render(db=self, task=task, action=self.prefix+'/task') + return j2env.get_template('task.html').render(db=self, task=task, action=self.prefix+'/task', referer=referer) def update_task(self, id_, title, default_effort, tags_joined, tags_checked, links): task = self.tasks[id_] if id_ in self.tasks.keys() else self.add_task(id_) @@ -444,27 +450,41 @@ class TodoHandler(PlomHandler): db.update_task(id_, postvars['title'][0], postvars['default_effort'][0], postvars['joined_tags'][0], collect_checked('tag_', postvars), collect_checked('link_', postvars)) elif parsed_url.path == app_config['prefix'] + '/day': + # always store the two hide params in the URL if possible … TODO: find out if really necessary if 'expect_unchosen_done' in postvars.keys(): params_to_encode += [('hide_unchosen', int('hide_unchosen' in postvars.keys()))] + [('hide_done', int('hide_done' in postvars.keys()))] + if 'selected_date' in postvars.keys(): - db.selected_date = postvars['selected_date'][0] - if 't_uuid' in postvars.keys(): - for i, uuid in enumerate(postvars['t_uuid']): - t = db.tasks[uuid] - if uuid in db.selected_day.todos.keys() and ((not 'choose' in postvars) or uuid not in postvars['choose']) and not db.selected_day.todos[uuid].is_empty(): - del db.selected_day.todos[uuid] - if 'choose' in postvars.keys(): - for i, uuid in enumerate(postvars['t_uuid']): - uuids = postvars['choose'] + postvars['done'] if 'done' in postvars.keys() else [] - if uuid in uuids or postvars['day_effort'][i] != '' or postvars['importance'][i] != '1.0': - done = 'done' in postvars and uuid in postvars['done'] - db.update_todo_mini(uuid, db.selected_date, postvars['day_effort'][i], done, postvars['importance'][i]) - if 'day_comment' in postvars.keys(): - db.selected_day.comment = postvars['day_comment'][0] - params_to_encode += [('selected_date', db.selected_date)] - - encoded_params = urlencode(params_to_encode) - homepage = f'{parsed_url.path}?{encoded_params}' + db.selected_date = postvars['selected_date'][0] + if 'day_comment' in postvars.keys(): + db.selected_day.comment = postvars['day_comment'][0] + params_to_encode += [('selected_date', db.selected_date)] + + # handle todo list updates via task UUIDs + if 't_uuid' in postvars.keys(): + for i, uuid in enumerate(postvars['t_uuid']): + task = db.tasks[uuid] + old_todo = None if not uuid in db.selected_day.todos.keys() else db.selected_day.todos[uuid] + selects_as_todo = 'choose' in postvars and uuid in postvars['choose'] + too_much_keepworthy_data = ('done' in postvars and uuid in postvars['done']) or postvars['day_effort'][i] != '' or (old_todo and not old_todo.internals_empty()) + if old_todo and too_much_keepworthy_data and not selects_as_todo: + raise PlomException('cannot deselect task as todo of preserve-worthy values') + elif old_todo and not selects_as_todo: + del db.selected_day.todos[uuid] + else: + done = ('done' in postvars) and (uuid in postvars['done']) + day_effort_input = postvars['day_effort'][i] + day_effort = float(day_effort_input) if len(day_effort_input) > 0 else None + importance = float(postvars['importance'][i]) + if old_todo and old_todo.done == done and old_todo.day_effort == day_effort and old_todo.importance == importance: + continue + db.update_todo_mini(uuid, db.selected_date, day_effort, done, importance) + + if 'referer' in postvars.keys() and len(postvars['referer'][0]) > 0: + homepage = postvars['referer'][0] + else: + encoded_params = urlencode(params_to_encode) + homepage = f'{parsed_url.path}?{encoded_params}' db.write() self.redirect(homepage) @@ -501,6 +521,7 @@ class TodoHandler(PlomHandler): selected_date = t_filter_and = t_filter_not = None hide_unchosen = hide_done = False + referer = params.get('referer', [''])[0] if parsed_url.path in {app_config['prefix'] + '/day', app_config['prefix'] + '/tasks'}: selected_date = get_param('selected_date') if parsed_url.path in {app_config['prefix'] + '/day', app_config['prefix'] + '/tasks', app_config['prefix'] + '/task'}: @@ -516,10 +537,10 @@ class TodoHandler(PlomHandler): elif parsed_url.path == app_config['prefix'] + '/todo': todo_date = params.get('date', [None])[0] task_uuid = params.get('task', [None])[0] - page = db.show_todo(task_uuid, todo_date) + page = db.show_todo(task_uuid, todo_date, referer) elif parsed_url.path == app_config['prefix'] + '/task': id_ = params.get('id', [None])[0] - page = db.show_task(id_) + page = db.show_task(id_, referer) elif parsed_url.path == app_config['prefix'] + '/tasks': page = db.show_tasks() elif parsed_url.path == app_config['prefix'] + '/add_task':