X-Git-Url: https://plomlompom.com/repos/%7B%7Bprefix%7D%7D/static/gitweb.js?a=blobdiff_plain;f=plomtask%2Fhttp.py;h=44c710b3b9bd46e04f67a210d6c3e526b0d43724;hb=4691a05e64acb2239f9d449b36f4ff5c678a1d6c;hp=bb05fa9618effaf7279ffe8553f872d3d1f16e05;hpb=eea64af900512aaa83146a02f6e7c6d0092b5b3a;p=plomtask diff --git a/plomtask/http.py b/plomtask/http.py index bb05fa9..44c710b 100644 --- a/plomtask/http.py +++ b/plomtask/http.py @@ -45,6 +45,13 @@ class InputsParser: return default return self.inputs[key][0] + def get_first_strings_starting(self, prefix: str) -> dict[str, str]: + """Retrieve list of (first) strings at key starting with prefix.""" + ret = {} + for key in [k for k in self.inputs.keys() if k.startswith(prefix)]: + ret[key] = self.inputs[key][0] + return ret + def get_int(self, key: str) -> int: """Retrieve single/first value of key as int, error if empty.""" val = self.get_int_or_none(key) @@ -90,6 +97,7 @@ class InputsParser: class TaskHandler(BaseHTTPRequestHandler): """Handles single HTTP request.""" + # pylint: disable=too-many-public-methods server: TaskServer def do_GET(self) -> None: @@ -115,7 +123,7 @@ class TaskHandler(BaseHTTPRequestHandler): start = self.params.get_str('start') end = self.params.get_str('end') if not end: - end = date_in_n_days(60) + end = date_in_n_days(366) ret = Day.by_date_range_with_limits(self.conn, (start, end), 'id') days, start, end = ret days = Day.with_filled_gaps(days, start, end) @@ -136,6 +144,9 @@ class TaskHandler(BaseHTTPRequestHandler): """Show single Day of ?date=.""" date = self.params.get_str('date', date_in_n_days(0)) todays_todos = Todo.by_date(self.conn, date) + total_effort = 0.0 + for todo in todays_todos: + total_effort += todo.performed_effort conditions_present = [] enablers_for = {} disablers_for = {} @@ -153,6 +164,7 @@ class TaskHandler(BaseHTTPRequestHandler): top_nodes = [t.get_step_tree(seen_todos) for t in todays_todos if not t.parents] return {'day': Day.by_id(self.conn, date, create=True), + 'total_effort': total_effort, 'top_nodes': top_nodes, 'enablers_for': enablers_for, 'disablers_for': disablers_for, @@ -377,7 +389,8 @@ class TaskHandler(BaseHTTPRequestHandler): todo.set_blockers(self.conn, self.form_data.get_all_int('blocker')) 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 + if len(self.form_data.get_all_str('done')) > 0 != todo.is_done: + 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.save(self.conn) @@ -387,6 +400,31 @@ class TaskHandler(BaseHTTPRequestHandler): condition.save(self.conn) return f'/todo?id={todo.id_}' + def _do_POST_versioned_timestamps(self, cls: Any, attr_name: str) -> str: + """Update history timestamps for VersionedAttribute.""" + id_ = self.params.get_int_or_none('id') + item = cls.by_id(self.conn, id_) + attr = getattr(item, attr_name) + for k, v in self.form_data.get_first_strings_starting('at:').items(): + old = k[3:] + if old[19:] != v: + attr.reset_timestamp(old, f'{v}.0') + attr.save(self.conn) + cls_name = cls.__name__.lower() + return f'/{cls_name}_{attr_name}s?id={item.id_}' + + def do_POST_process_descriptions(self) -> str: + """Update history timestamps for Process.description.""" + return self._do_POST_versioned_timestamps(Process, 'description') + + def do_POST_process_efforts(self) -> str: + """Update history timestamps for Process.effort.""" + return self._do_POST_versioned_timestamps(Process, 'effort') + + def do_POST_process_titles(self) -> str: + """Update history timestamps for Process.title.""" + return self._do_POST_versioned_timestamps(Process, 'title') + def do_POST_process(self) -> str: """Update or insert Process of ?id= and fields defined in postvars.""" # pylint: disable=too-many-branches @@ -455,6 +493,14 @@ class TaskHandler(BaseHTTPRequestHandler): params = f'has_step={process.id_}&title_b64={title_b64_encoded}' return f'/process?{params}' + def do_POST_condition_descriptions(self) -> str: + """Update history timestamps for Condition.description.""" + return self._do_POST_versioned_timestamps(Condition, 'description') + + def do_POST_condition_titles(self) -> str: + """Update history timestamps for Condition.title.""" + return self._do_POST_versioned_timestamps(Condition, 'title') + def do_POST_condition(self) -> str: """Update/insert Condition of ?id= and fields defined in postvars.""" id_ = self.params.get_int_or_none('id')