From 1321c0fab7bde10baa13606710190ea8f8824f54 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Fri, 21 Jun 2024 14:02:22 +0200 Subject: [PATCH] Tidy up (even if pylint disapproves) unwieldy POST handlers code. --- plomtask/http.py | 152 +++++++++++++++++++++++++++++------------------ tests/todos.py | 5 +- 2 files changed, 96 insertions(+), 61 deletions(-) diff --git a/plomtask/http.py b/plomtask/http.py index 18b77a6..4c0d6a3 100644 --- a/plomtask/http.py +++ b/plomtask/http.py @@ -535,38 +535,56 @@ class TaskHandler(BaseHTTPRequestHandler): def do_POST_day(self) -> str: """Update or insert Day of date and Todos mapped to it.""" + # pylint: disable=too-many-locals date = self._params.get_str('date') + day_comment = self._form_data.get_str('day_comment') + make_type = self._form_data.get_str('make_type') + old_todos = self._form_data.get_all_int('todo_id') + new_todos = self._form_data.get_all_int('new_todo') + is_done = [t_id in self._form_data.get_all_int('done') + for t_id in old_todos] + comments = self._form_data.get_all_str('comment') + efforts = [float(effort) if effort else None + for effort in self._form_data.get_all_str('effort')] + if old_todos and 3*[len(old_todos)] != [len(is_done), len(comments), + len(efforts)]: + msg = 'not equal number each of number of todo_id, comments, ' +\ + 'and efforts inputs' + raise BadFormatException(msg) day = Day.by_id_or_create(self.conn, date) - day.comment = self._form_data.get_str('day_comment') + day.comment = day_comment day.save(self.conn) - make_type = self._form_data.get_str('make_type') - for process_id in sorted(self._form_data.get_all_int('new_todo')): + for process_id in sorted(new_todos): if 'empty' == make_type: process = Process.by_id(self.conn, process_id) todo = Todo(None, process, False, date) todo.save(self.conn) else: Todo.create_with_children(self.conn, process_id, date) - done_ids = self._form_data.get_all_int('done') - comments = self._form_data.get_all_str('comment') - efforts = self._form_data.get_all_str('effort') - for i, todo_id in enumerate(self._form_data.get_all_int('todo_id')): + for i, todo_id in enumerate(old_todos): todo = Todo.by_id(self.conn, todo_id) - todo.is_done = todo_id in done_ids - if len(comments) > 0: - todo.comment = comments[i] - if len(efforts) > 0: - todo.effort = float(efforts[i]) if efforts[i] else None + todo.is_done = is_done[i] + todo.comment = comments[i] + todo.effort = efforts[i] todo.save(self.conn) return f'/day?date={date}&make_type={make_type}' @_delete_or_post(Todo, '/') def do_POST_todo(self, todo: Todo) -> str: """Update Todo and its children.""" + # pylint: disable=too-many-locals adopted_child_ids = self._form_data.get_all_int('adopt') processes_to_make_full = self._form_data.get_all_int('make_full') processes_to_make_empty = self._form_data.get_all_int('make_empty') fill_fors = self._form_data.get_first_strings_starting('fill_for_') + effort = self._form_data.get_str('effort', ignore_strict=True) + conditions = self._form_data.get_all_int('conditions') + disables = self._form_data.get_all_int('disables') + blockers = self._form_data.get_all_int('blockers') + enables = self._form_data.get_all_int('enables') + is_done = len(self._form_data.get_all_str('done')) > 0 + calendarize = len(self._form_data.get_all_str('calendarize')) > 0 + comment = self._form_data.get_str('comment', ignore_strict=True) for v in fill_fors.values(): if v.startswith('make_empty_'): processes_to_make_empty += [int(v[11:])] @@ -595,16 +613,14 @@ class TaskHandler(BaseHTTPRequestHandler): for process_id in processes_to_make_full: made = Todo.create_with_children(self.conn, process_id, todo.date) todo.add_child(made) - effort = self._form_data.get_str('effort', ignore_strict=True) todo.effort = float(effort) if effort else None - todo.set_conditions(self.conn, - self._form_data.get_all_int('conditions')) - todo.set_blockers(self.conn, self._form_data.get_all_int('blockers')) - todo.set_enables(self.conn, self._form_data.get_all_int('enables')) - todo.set_disables(self.conn, self._form_data.get_all_int('disables')) - todo.is_done = len(self._form_data.get_all_str('done')) > 0 - todo.calendarize = len(self._form_data.get_all_str('calendarize')) > 0 - todo.comment = self._form_data.get_str('comment', ignore_strict=True) + todo.set_conditions(self.conn, conditions) + todo.set_blockers(self.conn, blockers) + todo.set_enables(self.conn, enables) + todo.set_disables(self.conn, disables) + todo.is_done = is_done + todo.calendarize = calendarize + todo.comment = comment todo.save(self.conn) return f'/todo?id={todo.id_}' @@ -623,52 +639,67 @@ class TaskHandler(BaseHTTPRequestHandler): @_delete_or_post(Process, '/processes') def do_POST_process(self, process: Process) -> str: """Update or insert Process of ?id= and fields defined in postvars.""" - process.title.set(self._form_data.get_str('title')) - process.description.set(self._form_data.get_str('description')) - process.effort.set(self._form_data.get_float('effort')) - process.set_conditions(self.conn, - self._form_data.get_all_int('conditions')) - process.set_blockers(self.conn, - self._form_data.get_all_int('blockers')) - process.set_enables(self.conn, self._form_data.get_all_int('enables')) - process.set_disables(self.conn, - self._form_data.get_all_int('disables')) - process.calendarize = self._form_data.get_all_str('calendarize') != [] + # pylint: disable=too-many-locals + # pylint: disable=too-many-statements + title = self._form_data.get_str('title') + description = self._form_data.get_str('description') + effort = self._form_data.get_float('effort') + conditions = self._form_data.get_all_int('conditions') + blockers = self._form_data.get_all_int('blockers') + enables = self._form_data.get_all_int('enables') + disables = self._form_data.get_all_int('disables') + calendarize = self._form_data.get_all_str('calendarize') != [] + suppresses = self._form_data.get_all_int('suppresses') + step_of = self._form_data.get_all_str('step_of') + keep_steps = self._form_data.get_all_int('keep_step') + step_ids = self._form_data.get_all_int('steps') + new_top_steps = self._form_data.get_all_str('new_top_step') + step_process_id_to = {} + step_parent_id_to = {} + new_steps_to = {} + for step_id in step_ids: + name = f'new_step_to_{step_id}' + new_steps_to[step_id] = self._form_data.get_all_int(name) + for step_id in keep_steps: + name = f'step_{step_id}_process_id' + step_process_id_to[step_id] = self._form_data.get_int(name) + name = f'step_{step_id}_parent_id' + step_parent_id_to[step_id] = self._form_data.get_int_or_none(name) + process.title.set(title) + process.description.set(description) + process.effort.set(effort) + process.set_conditions(self.conn, conditions) + process.set_blockers(self.conn, blockers) + process.set_enables(self.conn, enables) + process.set_disables(self.conn, disables) + process.calendarize = calendarize process.save(self.conn) assert isinstance(process.id_, int) + new_step_title = None steps: list[ProcessStep] = [] - for step_id in self._form_data.get_all_int('keep_step'): - if step_id not in self._form_data.get_all_int('steps'): + for step_id in keep_steps: + if step_id not in step_ids: raise BadFormatException('trying to keep unknown step') - for step_id in self._form_data.get_all_int('steps'): - if step_id not in self._form_data.get_all_int('keep_step'): - continue - step_process_id = self._form_data.get_int( - f'step_{step_id}_process_id') - parent_id = self._form_data.get_int_or_none( - f'step_{step_id}_parent_id') - steps += [ProcessStep(step_id, process.id_, step_process_id, - parent_id)] - for step_id in self._form_data.get_all_int('steps'): - for step_process_id in self._form_data.get_all_int( - f'new_step_to_{step_id}'): - steps += [ProcessStep(None, process.id_, step_process_id, - step_id)] - new_step_title = None - for step_identifier in self._form_data.get_all_str('new_top_step'): + step = ProcessStep(step_id, process.id_, + step_process_id_to[step_id], + step_parent_id_to[step_id]) + steps += [step] + for step_id in step_ids: + new = [ProcessStep(None, process.id_, step_process_id, step_id) + for step_process_id in new_steps_to[step_id]] + steps += new + for step_identifier in new_top_steps: try: step_process_id = int(step_identifier) - steps += [ProcessStep(None, process.id_, step_process_id, - None)] + step = ProcessStep(None, process.id_, step_process_id, None) + steps += [step] except ValueError: new_step_title = step_identifier process.set_steps(self.conn, steps) - process.set_step_suppressions(self.conn, - self._form_data. - get_all_int('suppresses')) + process.set_step_suppressions(self.conn, suppresses) owners_to_set = [] new_owner_title = None - for owner_identifier in self._form_data.get_all_str('step_of'): + for owner_identifier in step_of: try: owners_to_set += [int(owner_identifier)] except ValueError: @@ -695,8 +726,11 @@ class TaskHandler(BaseHTTPRequestHandler): @_delete_or_post(Condition, '/conditions') def do_POST_condition(self, condition: Condition) -> str: """Update/insert Condition of ?id= and fields defined in postvars.""" - condition.is_active = self._form_data.get_str('is_active') == 'True' - condition.title.set(self._form_data.get_str('title')) - condition.description.set(self._form_data.get_str('description')) + is_active = self._form_data.get_str('is_active') == 'True' + title = self._form_data.get_str('title') + description = self._form_data.get_str('description') + condition.is_active = is_active + condition.title.set(title) + condition.description.set(description) condition.save(self.conn) return f'/condition?id={condition.id_}' diff --git a/tests/todos.py b/tests/todos.py index 7f106bc..626b744 100644 --- a/tests/todos.py +++ b/tests/todos.py @@ -400,11 +400,12 @@ class TestsWithServer(TestCaseWithServer): form_data = {'day_comment': '', 'new_todo': [1], 'make_type': 'full'} self.check_post(form_data, '/day?date=2024-01-01&make_type=full', 302) todo = Todo.by_date(self.db_conn, '2024-01-01')[0] - form_data = {'day_comment': '', 'todo_id': [1], 'make_type': 'full'} + form_data = {'day_comment': '', 'todo_id': [1], 'make_type': 'full', + 'comment': [''], 'done': [], 'effort': ['']} self.check_post(form_data, '/day?date=2024-01-01&make_type=full', 302) self.assertEqual(todo.is_done, False) form_data = {'day_comment': '', 'todo_id': [1], 'done': [1], - 'make_type': 'full'} + 'make_type': 'full', 'comment': [''], 'effort': ['']} self.check_post(form_data, '/day?date=2024-01-01&make_type=full', 302) self.assertEqual(todo.is_done, True) -- 2.30.2