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