X-Git-Url: https://plomlompom.com/repos/feed.xml?a=blobdiff_plain;f=plomtask%2Ftask.py;fp=plomtask%2Ftask.py;h=49ca883932baacc795d6818f0b764a4ba90bdfdb;hb=4546631ed7cc59f3e66a1902b28930f955b2b03f;hp=0000000000000000000000000000000000000000;hpb=51cdb0020cf8f1c0a0c11cc80be98863fce2448b;p=plomtask diff --git a/plomtask/task.py b/plomtask/task.py new file mode 100755 index 0000000..49ca883 --- /dev/null +++ b/plomtask/task.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +"""plom's task manager""" +from http.server import BaseHTTPRequestHandler +from http.server import HTTPServer +from urllib.parse import urlparse +from os.path import split as path_split +from jinja2 import Environment as JinjaEnv, FileSystemLoader as JinjaFSLoader +from .days import Day + +HTTP_PORT = 8082 +TEMPLATES_DIR = 'templates' + + +class HandledException(Exception): + """To identify Exceptions based on expected (if faulty) user behavior.""" + + +class TaskServer(HTTPServer): + """Variant of HTTPServer that knows .jinja as Jinja Environment.""" + + def __init__(self, *args, **kwargs): + super().__init__(self, *args, **kwargs) + self.jinja = JinjaEnv(loader=JinjaFSLoader(TEMPLATES_DIR)) + + +class TaskHandler(BaseHTTPRequestHandler): + """Handles single HTTP request.""" + server: TaskServer + + def send_html(self, html: str, code: int = 200): + """Send HTML as proper HTTP response.""" + self.send_response(code) + self.end_headers() + self.wfile.write(bytes(html, 'utf-8')) + + def send_msg(self, msg: str, code: int = 400): + """Send message in HTML formatting as HTTP response.""" + html = self.server.jinja.get_template('msg.html').render(msg=msg) + self.send_html(html, code) + + def do_GET(self): + """Handle any GET request.""" + try: + parsed_url = urlparse(self.path) + site = path_split(parsed_url.path)[1] + if 'calendar' == site: + html = self.do_GET_calendar() + else: + raise HandledException('Test!') + self.send_html(html) + except HandledException as error: + self.send_msg(error) + + def do_GET_calendar(self): + """Show sorted Days.""" + days = [Day('2024-01-03'), Day('2024-01-01'), Day('2024-01-02')] + days.sort() + return self.server.jinja.get_template('calendar.html').render( + days=days) + + +def main(): + """Main loop.""" + server = TaskServer(('localhost', HTTP_PORT), TaskHandler) + print(f'running at port {HTTP_PORT}') + try: + server.serve_forever() + except KeyboardInterrupt: + print('aborting due to keyboard interrupt') + server.server_close() + + +if __name__ == '__main__': + from sys import exit as sys_exit + try: + main() + except HandledException as e: + print(f'Aborting due to: {e}') + sys_exit(1)