X-Git-Url: https://plomlompom.com/repos/berlin_corona.txt?a=blobdiff_plain;f=plomtask%2Fhttp.py;h=26c8b719fec481e4106d66073a85844a1d16491a;hb=a658d31f985ec9a08181005614c3d9876e046274;hp=230ed3f26c5d53398a27d87558a28abeb28ceff5;hpb=344d6c234e50953b36ac9fed2cfce8d4ba64a5b3;p=plomtask diff --git a/plomtask/http.py b/plomtask/http.py index 230ed3f..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') @@ -205,8 +210,7 @@ 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, - init_empty_todo_list=True) + day = Day.by_id(self.conn, date, create=True) make_type = self._params.get_str('make_type') conditions_present = [] enablers_for = {} @@ -482,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: @@ -541,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: @@ -606,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'): @@ -627,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: