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 19from ums.management.db import DB 20 21from ums.utils import AgentMessage 22 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, "AgentMessage" : AgentMessage} 101 )
class
Interface:
24class Interface(): 25 26 _PREFIX = "/app" 27 28 def __init__(self, template:Jinja2Templates, db:DB): 29 self.template = template 30 self.db = db 31 32 self.router = APIRouter( 33 prefix=self._PREFIX, 34 tags=["app, gui"] 35 ) 36 37 self._add_routes() 38 39 def _add_routes(self): 40 @self.router.get("/", response_class=RedirectResponse, summary="Redirect") 41 def index(request: Request) -> RedirectResponse: 42 return RedirectResponse(self._PREFIX + "/table") 43 44 @self.router.get("/table", response_class=HTMLResponse, summary="Table of messages") 45 def table(request: Request, 46 id:str|None=None, sender:str|None=None, recipient:str|None=None, 47 processed:bool|None=None, 48 time_after:int|str|None=None, time_before:int|str|None=None, 49 limit:int=10, offset:int=0, _count_only:bool=False 50 ): 51 52 db_args = { 53 "limit" : limit, 54 "offset" : offset 55 } 56 57 convert_time = lambda t: self.template.env.globals["date2timestamp"](t) \ 58 if not re.match(r'^\d+$', t) else int(t) 59 for v,n,f in ( 60 (id,'id',str), (sender,'sender',str), (recipient,'recipient',str), 61 (processed,'processed', bool), 62 (time_after, 'time_after', convert_time), (time_before, 'time_before', convert_time) 63 ): 64 if not v is None: 65 db_args[n] = f(v) 66 67 if _count_only: 68 return self.db.len(**db_args) 69 else: 70 def pagination_link(**kwargs): 71 link_args = db_args.copy() 72 link_args.update(kwargs) 73 return urlencode(link_args) 74 75 return self.template.TemplateResponse( 76 'table.html', 77 {"request" : request, 78 "db" : self.db, "db_args" : db_args, 79 "pagination_link" : pagination_link 80 } 81 ) 82 83 @self.router.get("/table/total", summary="Total number of messages in table") 84 def table_total(request: Request, 85 id:str|None=None, sender:str|None=None, recipient:str|None=None, 86 processed:bool|None=None, 87 time_after:int|str|None=None, time_before:int|str|None=None, 88 limit:int=10, offset:int=0 89 ) -> int: 90 91 kwargs = locals().copy() 92 del kwargs['table'] 93 kwargs['_count_only'] = True 94 95 return table(**kwargs) 96 97 @self.router.get("/new", response_class=HTMLResponse, summary="Add new riddle") 98 def new(request: Request): 99 return self.template.TemplateResponse( 100 'new.html', 101 {"request" : request, "AgentMessage" : AgentMessage} 102 )
Interface( template: starlette.templating.Jinja2Templates, db: ums.management.db.DB)