home · contact · privacy
Use different do_GET handlers for different paths.
[plomtask] / task.py
1 #!/usr/bin/env python3
2 """plom's task manager"""
3 from http.server import BaseHTTPRequestHandler
4 from http.server import HTTPServer
5 from urllib.parse import urlparse
6 from os.path import split as path_split
7 from jinja2 import Environment as JinjaEnv, FileSystemLoader as JinjaFSLoader
8 from days import Day
9
10 HTTP_PORT = 8082
11 TEMPLATES_DIR = 'templates'
12
13
14 class HandledException(Exception):
15     """To identify Exceptions based on expected (if faulty) user behavior."""
16
17
18 class TaskHandler(BaseHTTPRequestHandler):
19     """Handles single HTTP request."""
20
21     def do_GET(self):
22         """Handle any GET request."""
23         parsed_url = urlparse(self.path)
24         site = path_split(parsed_url.path)[1]
25         if 'calendar' == site:
26             html = self.do_GET_calendar()
27         else:
28             html = self.do_GET_msg('I have nothing to say at this point.')
29         self.send_response(200)
30         self.end_headers()
31         self.wfile.write(bytes(html, 'utf-8'))
32
33     def do_GET_msg(self, msg):
34         """Show message."""
35         return self.server.jinja.get_template('msg.html').render(
36                 msg=msg)
37
38     def do_GET_calendar(self):
39         """Show sorted Days."""
40         days = [Day('2024-01-03'), Day('2024-01-01'), Day('2024-01-02')]
41         days.sort()
42         return self.server.jinja.get_template('calendar.html').render(
43                 days=days)
44
45
46 def main():
47     """Main loop."""
48     server = HTTPServer(('localhost', HTTP_PORT), TaskHandler)
49     server.jinja = JinjaEnv(loader=JinjaFSLoader(TEMPLATES_DIR))
50     print(f'running at port {HTTP_PORT}')
51     try:
52         server.serve_forever()
53     except KeyboardInterrupt:
54         print('aborting due to keyboard interrupt')
55     server.server_close()
56
57
58 if __name__ == '__main__':
59     from sys import exit as sys_exit
60     try:
61         main()
62     except HandledException as e:
63         print(f'Aborting due to: {e}')
64         sys_exit(1)