106 lines
3.1 KiB
Python
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
|
|
}
|
|
) |