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)
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()
template
db
router