# Agenten Plattform # # (c) 2024 Magnus Bender # Institute of Humanities-Centered Artificial Intelligence (CHAI) # Universitaet Hamburg # https://www.chai.uni-hamburg.de/~bender # # source code released under the terms of GNU Public License Version 3 # https://www.gnu.org/licenses/gpl-3.0.txt import re from urllib.parse import urlencode from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.templating import Jinja2Templates from ums.management.db import DB from ums.utils import (AgentMessage, RiddleDataType, list_shared_data, list_shared_schema, SHARE_PATH) class Interface(): _PREFIX = "/app" def __init__(self, template:Jinja2Templates, db:DB): self.template = template self.db = db self.router = APIRouter( prefix=self._PREFIX, tags=["app, gui"] ) self._add_routes() def _add_routes(self): @self.router.get("/", response_class=RedirectResponse, summary="Redirect") def index(request: Request) -> RedirectResponse: return RedirectResponse(self._PREFIX + "/table") @self.router.get("/table", response_class=HTMLResponse, summary="Table of messages") def table(request: Request, id:str|None=None, sender:str|None=None, recipient:str|None=None, processed:bool|None=None, time_after:int|str|None=None, time_before:int|str|None=None, limit:int=10, offset:int=0, _count_only:bool=False ): db_args = { "limit" : limit, "offset" : offset } convert_time = lambda t: self.template.env.globals["date2timestamp"](t) \ if not re.match(r'^\d+$', t) else int(t) for v,n,f in ( (id,'id',str), (sender,'sender',str), (recipient,'recipient',str), (processed,'processed', bool), (time_after, 'time_after', convert_time), (time_before, 'time_before', convert_time) ): if not v is None: db_args[n] = f(v) if _count_only: return self.db.len(**db_args) else: def pagination_link(**kwargs): link_args = db_args.copy() link_args.update(kwargs) return urlencode(link_args) return self.template.TemplateResponse( 'table.html', {"request" : request, "db" : self.db, "db_args" : db_args, "pagination_link" : pagination_link } ) @self.router.get("/table/total", summary="Total number of messages in table") def table_total(request: Request, id:str|None=None, sender:str|None=None, recipient:str|None=None, processed:bool|None=None, time_after:int|str|None=None, time_before:int|str|None=None, limit:int=10, offset:int=0 ) -> int: kwargs = locals().copy() del kwargs['table'] kwargs['_count_only'] = True return table(**kwargs) @self.router.get("/new", response_class=HTMLResponse, summary="Add new riddle") def new(request: Request): return self.template.TemplateResponse( 'new.html', {"request" : request, "AgentMessage" : AgentMessage, "RiddleDataType": RiddleDataType, "shared_data" : list_shared_data(), "shared_schema" : list_shared_schema(), "SHARE_PATH" : SHARE_PATH } )