+ task.title.set(title)
+ task.default_effort.set(float(default_effort) if len(default_effort) > 0 else None)
+ task.tags.set(self.collect_tags(tags_joined, tags_checked))
+ task.subtask_ids.set(subtask_ids)
+ task.comment = comment
+
+ def show_tasks(self, expand_uuid):
+ expanded_tasks = {}
+ if expand_uuid:
+ for uuid in self.tasks[expand_uuid].subtask_ids.now:
+ expanded_tasks[uuid] = self.tasks[uuid]
+ return j2env.get_template('tasks.html').render(
+ db=self,
+ filter_and=self.t_filter_and,
+ filter_not=self.t_filter_not,
+ expand_uuid=expand_uuid,
+ expanded_tasks=expanded_tasks)
+
+ def show_pick_tasks(self, search, hide_chosen_tasks, sort_order=None):
+ prev_date_str, next_date_str = self.neighbor_dates()
+ chosen_todos = self.selected_day.linked_todos_as_list
+ relevant_todos = []
+ for todo in self.todos.values():
+ if todo.done or (not todo.visible) or (not todo.matches(search)) or todo.earliest_date >= self.selected_date:
+ continue
+ relevant_todos += [todo]
+ tasks = []
+ chosen_tasks = [todo.task for todo in self.selected_day.linked_todos_as_list]
+ for uuid, task in self.tasks.items():
+ if (not task.visible) or (not task.matches(search)) or (hide_chosen_tasks and task in chosen_tasks):
+ continue
+ tasks += [task]
+ if sort_order == 'title':
+ chosen_todos.sort(key=lambda t: t.title)
+ relevant_todos.sort(key=lambda t: t.title)
+ tasks.sort(key=lambda t: t.title.then)
+ elif sort_order == 'effort':
+ chosen_todos.sort(key=lambda t: t.day_effort if t.day_effort else t.default_effort if t.done else 0, reverse=True)
+ relevant_todos.sort(key=lambda t: t.all_days_effort, reverse=True)
+ tasks.sort(key=lambda t: t.default_effort.then, reverse=True)
+ return j2env.get_template('pick_tasks.html').render(
+ sort=sort_order,
+ tags=self.t_tags,
+ chosen_todos=chosen_todos,
+ filter_and=self.t_filter_and,
+ filter_not=self.t_filter_not,
+ day=self.selected_day,
+ prev_date=prev_date_str,
+ next_date=next_date_str,
+ tasks=tasks,
+ hide_chosen_tasks=hide_chosen_tasks,
+ relevant_todos=relevant_todos,
+ search=search)
+
+
+class ParamsParser:
+
+ def __init__(self, parsed_url_query, cookie_db):
+ self.params = parse_qs(parsed_url_query)
+ self.cookie_db = cookie_db
+
+ def get(self, key, default=None):
+ boolean = bool == type(default)
+ param = self.params.get(key, [default])[0]
+ if boolean:
+ param = param != '0'
+ return param
+
+ def get_cookied(self, key, default=None):
+ param = self.get(key, default)
+ if param == '-':
+ param = None
+ if key in self.cookie_db.keys():
+ del self.cookie_db[key]
+ if param is None and key in self.cookie_db.keys():
+ param = self.cookie_db[key]
+ if param is not None:
+ self.cookie_db[key] = param
+ return param
+
+ def get_cookied_chain(self, key, default=None):
+ # default = default if default else ['-']
+ params = self.params.get(key, default)
+ if params == ['-']:
+ params = None
+ if key in self.cookie_db.keys():
+ del self.cookie_db[key]
+ if params is None and key in self.cookie_db.keys():
+ params = self.cookie_db[key]
+ if params is not None:
+ self.cookie_db[key] = params
+ return params