X-Git-Url: https://plomlompom.com/repos/berlin_corona.txt?a=blobdiff_plain;f=plomtask%2Fhttp.py;h=26c8b719fec481e4106d66073a85844a1d16491a;hb=a658d31f985ec9a08181005614c3d9876e046274;hp=5ad3dd43332e3106d66a0327158d4aebcf690bdb;hpb=81e1ac998001bedd8a739e6458c7ed30e474c0da;p=plomtask diff --git a/plomtask/http.py b/plomtask/http.py index 5ad3dd4..26c8b71 100644 --- a/plomtask/http.py +++ b/plomtask/http.py @@ -1,7 +1,7 @@ """Web server stuff.""" from __future__ import annotations from dataclasses import dataclass -from typing import Any, Callable +from typing import Any, Callable, Mapping from base64 import b64encode, b64decode from http.server import BaseHTTPRequestHandler from http.server import HTTPServer @@ -106,8 +106,13 @@ class TaskHandler(BaseHTTPRequestHandler): _form_data: InputsParser _params: InputsParser - def _send_html(self, html: str, code: int = 200) -> None: + def _send_html(self, + tmpl_name: str, + ctx: Mapping[str, object], + code: int = 200) -> None: """Send HTML as proper HTTP response.""" + tmpl = self.server.jinja.get_template(tmpl_name) + html = tmpl.render(ctx) self.send_response(code) self.end_headers() self.wfile.write(bytes(html, 'utf-8')) @@ -139,9 +144,11 @@ class TaskHandler(BaseHTTPRequestHandler): msg = f'{not_found_msg}: {self._site}' raise NotFoundException(msg) except HandledException as error: - html = self.server.jinja.\ - get_template('msg.html').render(msg=error) - self._send_html(html, error.http_code) + for cls in (Day, Todo, Condition, Process, ProcessStep): + assert hasattr(cls, 'empty_cache') + cls.empty_cache() + ctx = {'msg': error} + self._send_html('msg.html', ctx, error.http_code) finally: self.conn.close() return wrapper @@ -151,13 +158,11 @@ class TaskHandler(BaseHTTPRequestHandler): def do_GET(self, handler: Callable[[], str | dict[str, object]] ) -> str | None: """Render page with result of handler, or redirect if result is str.""" - template = f'{self._site}.html' + tmpl_name = f'{self._site}.html' ctx_or_redir = handler() - if str == type(ctx_or_redir): + if isinstance(ctx_or_redir, str): return ctx_or_redir - assert isinstance(ctx_or_redir, dict) - html = self.server.jinja.get_template(template).render(**ctx_or_redir) - self._send_html(html) + self._send_html(tmpl_name, ctx_or_redir) return None @_request_wrapper('POST', 'Unknown POST target') @@ -191,8 +196,6 @@ class TaskHandler(BaseHTTPRequestHandler): ret = Day.by_date_range_with_limits(self.conn, (start, end), 'id') days, start, end = ret days = Day.with_filled_gaps(days, start, end) - for day in days: - day.collect_calendarized_todos(self.conn) today = date_in_n_days(0) return {'start': start, 'end': end, 'days': days, 'today': today} @@ -207,12 +210,12 @@ class TaskHandler(BaseHTTPRequestHandler): def do_GET_day(self) -> dict[str, object]: """Show single Day of ?date=.""" date = self._params.get_str('date', date_in_n_days(0)) + day = Day.by_id(self.conn, date, create=True) make_type = self._params.get_str('make_type') - todays_todos = Todo.by_date(self.conn, date) conditions_present = [] enablers_for = {} disablers_for = {} - for todo in todays_todos: + for todo in day.todos: for condition in todo.conditions + todo.blockers: if condition not in conditions_present: conditions_present += [condition] @@ -224,9 +227,8 @@ class TaskHandler(BaseHTTPRequestHandler): if condition in p.disables] seen_todos: set[int] = set() 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': Todo.total_effort_at_date(self.conn, date), + for t in day.todos if not t.parents] + return {'day': day, 'top_nodes': top_nodes, 'make_type': make_type, 'enablers_for': enablers_for, @@ -484,10 +486,6 @@ class TaskHandler(BaseHTTPRequestHandler): if len(efforts) > 0: todo.effort = float(efforts[i]) if efforts[i] else None todo.save(self.conn) - for condition in todo.enables: - condition.save(self.conn) - for condition in todo.disables: - condition.save(self.conn) return f'/day?date={date}&make_type={make_type}' def do_POST_todo(self) -> str: @@ -543,10 +541,6 @@ class TaskHandler(BaseHTTPRequestHandler): 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) - for condition in todo.enables: - condition.save(self.conn) - for condition in todo.disables: - condition.save(self.conn) return f'/todo?id={todo.id_}' def do_POST_process_descriptions(self) -> str: @@ -608,12 +602,10 @@ class TaskHandler(BaseHTTPRequestHandler): None)] except ValueError: new_step_title = step_identifier - process.uncache() process.set_steps(self.conn, steps) process.set_step_suppressions(self.conn, self._form_data. get_all_int('suppresses')) - process.save(self.conn) owners_to_set = [] new_owner_title = None for owner_identifier in self._form_data.get_all_str('step_of'): @@ -629,6 +621,7 @@ class TaskHandler(BaseHTTPRequestHandler): elif new_owner_title: title_b64_encoded = b64encode(new_owner_title.encode()).decode() params = f'has_step={process.id_}&title_b64={title_b64_encoded}' + process.save(self.conn) return f'/process?{params}' def do_POST_condition_descriptions(self) -> str: