ums.management.interface
1# Agenten Plattform 2# 3# (c) 2024 Magnus Bender 4# Institute of Humanities-Centered Artificial Intelligence (CHAI) 5# Universitaet Hamburg 6# https://www.chai.uni-hamburg.de/~bender 7# 8# source code released under the terms of GNU Public License Version 3 9# https://www.gnu.org/licenses/gpl-3.0.txt 10 11import re 12 13from urllib.parse import urlencode 14 15from fastapi import APIRouter, Request 16from fastapi.responses import HTMLResponse, RedirectResponse 17from fastapi.templating import Jinja2Templates 18 19 20from ums.management.db import DB 21 22class Interface(): 23 24 _PREFIX = "/app" 25 26 def __init__(self, template:Jinja2Templates, db:DB): 27 self.template = template 28 self.db = db 29 30 self.router = APIRouter( 31 prefix=self._PREFIX, 32 tags=["app, gui"] 33 ) 34 35 self._add_routes() 36 37 def _add_routes(self): 38 @self.router.get("/", response_class=RedirectResponse, summary="Redirect") 39 def index(request: Request) -> RedirectResponse: 40 return RedirectResponse(self._PREFIX + "/table") 41 42 @self.router.get("/table", response_class=HTMLResponse, summary="Table of messages") 43 def table(request: Request, 44 id:str|None=None, sender:str|None=None, recipient:str|None=None, 45 processed:bool|None=None, 46 time_after:int|str|None=None, time_before:int|str|None=None, 47 limit:int=10, offset:int=0, _count_only:bool=False 48 ): 49 50 db_args = { 51 "limit" : limit, 52 "offset" : offset 53 } 54 55 convert_time = lambda t: self.template.env.globals["date2timestamp"](t) \ 56 if not re.match(r'^\d+$', t) else int(t) 57 for v,n,f in ( 58 (id,'id',str), (sender,'sender',str), (recipient,'recipient',str), 59 (processed,'processed', bool), 60 (time_after, 'time_after', convert_time), (time_before, 'time_before', convert_time) 61 ): 62 if not v is None: 63 db_args[n] = f(v) 64 65 if _count_only: 66 return self.db.len(**db_args) 67 else: 68 def pagination_link(**kwargs): 69 link_args = db_args.copy() 70 link_args.update(kwargs) 71 return urlencode(link_args) 72 73 return self.template.TemplateResponse( 74 'table.html', 75 {"request" : request, 76 "db" : self.db, "db_args" : db_args, 77 "pagination_link" : pagination_link 78 } 79 ) 80 81 @self.router.get("/table/total", summary="Total number of messages in table") 82 def table_total(request: Request, 83 id:str|None=None, sender:str|None=None, recipient:str|None=None, 84 processed:bool|None=None, 85 time_after:int|str|None=None, time_before:int|str|None=None, 86 limit:int=10, offset:int=0 87 ) -> int: 88 89 kwargs = locals().copy() 90 del kwargs['table'] 91 kwargs['_count_only'] = True 92 93 return table(**kwargs) 94 95 @self.router.get("/new", response_class=HTMLResponse, summary="Add new riddle") 96 def new(request: Request): 97 return self.template.TemplateResponse( 98 'new.html', 99 {"request" : request} 100 )
class
Interface:
23class Interface(): 24 25 _PREFIX = "/app" 26 27 def __init__(self, template:Jinja2Templates, db:DB): 28 self.template = template 29 self.db = db 30 31 self.router = APIRouter( 32 prefix=self._PREFIX, 33 tags=["app, gui"] 34 ) 35 36 self._add_routes() 37 38 def _add_routes(self): 39 @self.router.get("/", response_class=RedirectResponse, summary="Redirect") 40 def index(request: Request) -> RedirectResponse: 41 return RedirectResponse(self._PREFIX + "/table") 42 43 @self.router.get("/table", response_class=HTMLResponse, summary="Table of messages") 44 def table(request: Request, 45 id:str|None=None, sender:str|None=None, recipient:str|None=None, 46 processed:bool|None=None, 47 time_after:int|str|None=None, time_before:int|str|None=None, 48 limit:int=10, offset:int=0, _count_only:bool=False 49 ): 50 51 db_args = { 52 "limit" : limit, 53 "offset" : offset 54 } 55 56 convert_time = lambda t: self.template.env.globals["date2timestamp"](t) \ 57 if not re.match(r'^\d+$', t) else int(t) 58 for v,n,f in ( 59 (id,'id',str), (sender,'sender',str), (recipient,'recipient',str), 60 (processed,'processed', bool), 61 (time_after, 'time_after', convert_time), (time_before, 'time_before', convert_time) 62 ): 63 if not v is None: 64 db_args[n] = f(v) 65 66 if _count_only: 67 return self.db.len(**db_args) 68 else: 69 def pagination_link(**kwargs): 70 link_args = db_args.copy() 71 link_args.update(kwargs) 72 return urlencode(link_args) 73 74 return self.template.TemplateResponse( 75 'table.html', 76 {"request" : request, 77 "db" : self.db, "db_args" : db_args, 78 "pagination_link" : pagination_link 79 } 80 ) 81 82 @self.router.get("/table/total", summary="Total number of messages in table") 83 def table_total(request: Request, 84 id:str|None=None, sender:str|None=None, recipient:str|None=None, 85 processed:bool|None=None, 86 time_after:int|str|None=None, time_before:int|str|None=None, 87 limit:int=10, offset:int=0 88 ) -> int: 89 90 kwargs = locals().copy() 91 del kwargs['table'] 92 kwargs['_count_only'] = True 93 94 return table(**kwargs) 95 96 @self.router.get("/new", response_class=HTMLResponse, summary="Add new riddle") 97 def new(request: Request): 98 return self.template.TemplateResponse( 99 'new.html', 100 {"request" : request} 101 )
Interface( template: starlette.templating.Jinja2Templates, db: ums.management.db.DB)