106 lines
3.1 KiB
Python

# 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=["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, solution: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), (solution,'solution', 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, solution: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
}
)