# 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 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} )