X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=plomtask%2Fhttp.py;h=71305b218aee0ef61b1e0589e18fad7b2671c6f1;hb=6c3fca10aa663422abc48b96b38628dc2771701a;hp=1a06f3094c9c66a95f73b9a13e52d7618d3b2aaa;hpb=2f4c681e1c4d78eacc1daa5f297f06038b45912e;p=plomtask diff --git a/plomtask/http.py b/plomtask/http.py index 1a06f30..71305b2 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: @@ -110,12 +118,12 @@ class TaskHandler(BaseHTTPRequestHandler): finally: self.conn.close() - def do_GET_calendar(self) -> dict[str, object]: + def _do_GET_calendar(self) -> dict[str, object]: """Show Days from ?start= to ?end=.""" 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) @@ -124,10 +132,21 @@ class TaskHandler(BaseHTTPRequestHandler): today = date_in_n_days(0) return {'start': start, 'end': end, 'days': days, 'today': today} + def do_GET_calendar(self) -> dict[str, object]: + """Show Days from ?start= to ?end= – normal view.""" + return self._do_GET_calendar() + + def do_GET_calendar_txt(self) -> dict[str, object]: + """Show Days from ?start= to ?end= – minimalist view.""" + return self._do_GET_calendar() + def do_GET_day(self) -> dict[str, object]: """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 = {} @@ -145,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, @@ -379,6 +399,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 @@ -447,6 +492,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')