- db = TodoDB(prefix=prefix)
- if parsed_url.path == prefix + '/todo':
- task_uuid = postvars['task_uuid'][0]
- date = postvars['date'][0]
- db.update_todo(task_uuid, date, postvars['day_weight'][0], 'done' in postvars.keys(), postvars['comment'][0])
- homepage = f'{prefix}/todo?task={task_uuid}&date={date}'
- elif parsed_url.path == prefix + '/task':
- id_ = postvars['id'][0]
- db.update_task(id_, postvars['title'][0], postvars['default_weight'][0], postvars['tags'][0])
- homepage = f'{prefix}/task?id={id_}'
- elif parsed_url.path in {prefix + '/tasks', prefix + '/day'}:
- if 't_filter_and' in postvars.keys():
- for target in postvars['t_filter_and']:
- db.t_filter_and.add(target)
- if 't_filter_not' in postvars.keys():
- for target in postvars['t_filter_not']:
- db.t_filter_not.add(target)
- if 'hide_unchosen' in postvars.keys():
- db.hide_unchosen = True
- data = [('t_and', f) for f in db.t_filter_and] + [('t_not', f) for f in db.t_filter_not] + [('hide_unchosen', int(db.hide_unchosen))]
- if parsed_url.path == prefix + '/tasks':
- encoded_params = urlencode(data)
- homepage = f'{prefix}/tasks?{encoded_params}'
- elif parsed_url.path == prefix + '/day':
- db.switch_to_day(postvars['original_selected_date'][0])
- new_selected_date = postvars['new_selected_date'][0]
- try:
- datetime.strptime(new_selected_date, '%Y-%m-%d')
- except ValueError:
- raise PlomException(f"{prefix} bad date string: {new_selected_date}")
- if new_selected_date != db.selected_date:
- if new_selected_date in db.days.keys():
- raise PlomException('cannot use same date twice')
- else:
- db.days[new_selected_date] = db.selected_day
- del db.days[db.selected_date]
- db.selected_date = new_selected_date
- 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']):
- del db.selected_day.todos[uuid]
- if 'choose' in postvars.keys():
- for i, uuid in enumerate(postvars['t_uuid']):
- if uuid in postvars['choose']:
- done = 'done' in postvars and uuid in postvars['done']
- db.update_todo(uuid, db.selected_date, postvars['day_weight'][i], done, postvars['todo_comment'][i])
- if 'comment' in postvars.keys():
- db.selected_day.comment = postvars['comment'][0]
- data += [('date', db.selected_date)]
- encoded_params = urlencode(data)
- homepage = f'{prefix}/day?{encoded_params}'
+ site = path_split(parsed_url.path)[1]
+ length = int(self.headers['content-length'])
+ postvars = PostvarsParser(parse_qs(self.rfile.read(length).decode(), keep_blank_values=1))
+
+ db = TodoDB()
+ redir_params = []
+ # if we do encounter a filter post, we repost it (and if empty, the emptying command '-')
+ for param_name, filter_db_name in {('and_tag', 'tag_filter_and'), ('not_tag', 'tag_filter_not')}:
+ filter_db = getattr(db, filter_db_name)
+ if postvars.has(param_name):
+ for target in postvars.get_all(param_name, []):
+ if len(target) > 0 and not target in filter_db:
+ filter_db += [target]
+ if len(filter_db) == 0:
+ redir_params += [(param_name, '-')]
+ redir_params += [(param_name, f) for f in filter_db]
+ if site in {'calendar', 'todo'}:
+ redir_params += [('end', postvars.get('end', '-'))]
+ redir_params += [('start', postvars.get('start', '-'))]
+ if site in {'day_todos', 'todo'}:
+ todo_parenthood = postvars.get('parenthood')
+ redir_params += [('parenthood', todo_parenthood)]
+ if postvars.has('filter'):
+ postvars.set('return_to', '')
+
+ if 'tasks' == site:
+ redir_params += [('search', postvars.get('search', ''))]
+
+ elif 'todo' == site:
+ todo_id = postvars.get('todo_id')
+ redir_params += [('id', todo_id)]
+ old_todo = db.todos[todo_id] if todo_id in db.todos.keys() else None
+ efforts = {}
+ latest_date = db.selected_date
+ for i, date in enumerate(postvars.get_all('effort_date', [])):
+ if '' == date:
+ continue
+ latest_date = date
+ efforts[date] = None
+ if not (old_todo and old_todo.deps):
+ efforts[date] = postvars.get_at_index('effort', i, on_empty=None,
+ float_if_possible=True)
+ if postvars.has('delete'):
+ has_day_effort = len([e for e in efforts.values() if e is not None]) > 0
+ if postvars.has('done')\
+ or postvars.get('comment')\
+ or postvars.get_all('tag', [])\
+ or has_day_effort:
+ raise PlomException('will not remove todo of preserve-worthy values')
+ db.delete_todo(todo_id)
+ postvars.set('return_to', 'calendar')
+ elif postvars.has('update'):
+ if postvars.has('delete_effort'):
+ for date in postvars.get_all('delete_effort'):
+ db.delete_effort(old_todo, date)
+ del efforts[date]
+ deps = [db.todos[id_] for id_ in postvars.get_all('adopt_dep', [])
+ if id_ in db.todos.keys()]
+ for dep in deps:
+ if not todo_id in [t.id_ for t in dep.dependers]:
+ dep.dependers += [db.todos[todo_id]]
+ birth_dep_ids = postvars.get_all('birth_dep', [])
+ for id_ in [id_ for id_ in birth_dep_ids if not id_ in db.tasks.keys()]:
+ raise PlomException('submitted illegal dep ID')
+ tasks_to_birth = [db.tasks[id_] for id_ in birth_dep_ids]
+ for task in tasks_to_birth:
+ deps += [db.add_todo(task=task, efforts={latest_date: None}, parenthood=todo_parenthood)]
+ db.update_todo(id_=todo_id,
+ efforts=efforts,
+ done=postvars.has('done'),
+ comment=postvars.get('comment', ''),
+ tags=postvars.get_all('tag', []),
+ importance=float(postvars.get('importance')),
+ deps=deps)
+
+ elif 'task' == site:
+ task_id = postvars.get('task_id')
+ if (postvars.has('delete') or postvars.has('fork')) and (not task_id in db.tasks.keys()):
+ if not task_id in db.tasks.keys():
+ raise PlomException('can only do this on Task that already exists')
+ if postvars.has('delete'):
+ if [t for t in db.todos.values() if task_id == t.task.id_]:
+ raise PlomException('will not remove Task describing existing Todos')
+ if postvars.get('title', '')\
+ or postvars.get_all('tag', [])\
+ or postvars.get_all('dep', [])\
+ or postvars.get('comment', ''):
+ raise PlomException('will not remove Task of preserve-worthy values')
+ db.delete_task(task_id)
+ elif postvars.has('update'):
+ dep_ids = postvars.get_all('dep', [])
+ for id_ in [id_ for id_ in dep_ids if not id_ in db.tasks.keys()]:
+ raise PlomException('submitted illegal dep ID')
+ depender_ids = postvars.get_all('depender', [])
+ for id_ in [id_ for id_ in depender_ids if not id_ in db.tasks.keys()]:
+ raise PlomException('submitted illegal dep ID')
+ task = db.update_task(
+ id_=task_id,
+ title=postvars.get('title', ''),
+ default_effort=postvars.get('default_effort', float_if_possible=True),
+ tags=postvars.get_all('tag', []),
+ comment=postvars.get('comment', ''),
+ dep_ids=dep_ids,
+ depender_ids=depender_ids)
+ if postvars.has('add_as_todo'):
+ db.add_todo(task=task, efforts={postvars.get('new_todo_date'): None})
+ elif postvars.has('fork'):
+ t = db.fork_task(task_id)
+ task_id = t.id_
+
+ # dep_ids = postvars.get_all('dep', [])
+ # for id_ in [id_ for id_ in dep_ids if not id_ in db.tasks.keys()]:
+ # raise PlomException('submitted illegal dep ID')
+ # depender_ids = postvars.get_all('depender', [])
+ # for id_ in [id_ for id_ in depender_ids if not id_ in db.tasks.keys()]:
+ # raise PlomException('submitted illegal dep ID')
+ # task = db.update_task(
+ # id_=task_id,
+ # title=postvars.get('title', ''),
+ # default_effort=postvars.get('default_effort', float_if_possible=True),
+ # tags=postvars.get_all('tag', []),
+ # comment=postvars.get('comment', ''),
+ # dep_ids=dep_ids,
+ # depender_ids=depender_ids)
+ # if postvars.has('add_as_todo'):
+ # db.add_todo(task=task, efforts={postvars.get('new_todo_date'): None})
+
+ redir_params += [('id', task_id)]
+
+ elif 'day_todos' == site:
+ if postvars.has('update'):
+ db.selected_date = postvars.get('date')
+ redir_params += [('date', db.selected_date)]
+ db.selected_day.comment = postvars.get('day_comment', '')
+ task_id = postvars.get('choose_task', None)
+ if task_id:
+ if task_id not in db.tasks.keys():
+ raise PlomException('illegal task ID entered')
+ db.add_todo(task=db.tasks[task_id], efforts={db.selected_date: None},
+ parenthood=todo_parenthood)
+ for id_ in postvars.get_all('choose_todo', []):
+ db.todos[id_].efforts[db.selected_date] = None
+ for i, todo_id in enumerate(postvars.get_all('todo_id', [])):
+ old_todo = db.todos[todo_id]
+ done = todo_id in postvars.get_all('done', [])
+ day_effort_input = postvars.get_at_index('effort', i, '')
+ day_effort = float(day_effort_input) if len(day_effort_input) > 0 else None
+ comment = postvars.get_at_index('effort_comment', i, '')
+ if (day_effort is not None) and (not done) and day_effort < 0 and 0 == len(comment):
+ if len(old_todo.efforts) > 1:
+ db.delete_effort(old_todo, db.selected_date)
+ else:
+ db.delete_todo(todo_id)
+ continue
+ importance = float(postvars.get_at_index('importance', i))
+ if old_todo\
+ and old_todo.done == done\
+ and old_todo.day_effort == day_effort\
+ and comment == old_todo.comment\
+ and old_todo.importance == importance:
+ continue
+ db.update_todo_for_day(
+ todo_id,
+ db.selected_date,
+ day_effort,
+ done,
+ comment,
+ importance)
+
+ homepage = postvars.get('return_to')
+ if not homepage:
+ encoded_params = urlencode(redir_params)
+ homepage = f'{site}?{encoded_params}'