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
 19
 20from ums.management.db import DB
 21
 22class Interface():
 23
 24	_PREFIX = "/app"
 25
 26	def __init__(self, template:Jinja2Templates, db:DB):
 27		self.template = template
 28		self.db = db
 29		
 30		self.router = APIRouter(
 31			prefix=self._PREFIX,
 32			tags=["app, gui"]
 33		)
 34		
 35		self._add_routes()
 36
 37	def _add_routes(self):
 38		@self.router.get("/", response_class=RedirectResponse, summary="Redirect")
 39		def index(request: Request) -> RedirectResponse:
 40			return RedirectResponse(self._PREFIX + "/table")
 41		
 42		@self.router.get("/table", response_class=HTMLResponse, summary="Table of messages")
 43		def table(request: Request,
 44			id:str|None=None, sender:str|None=None, recipient:str|None=None,
 45			processed:bool|None=None,
 46			time_after:int|str|None=None, time_before:int|str|None=None,
 47			limit:int=10, offset:int=0, _count_only:bool=False
 48		):
 49			
 50			db_args = {
 51				"limit" : limit,
 52				"offset" : offset
 53			}
 54
 55			convert_time = lambda t: self.template.env.globals["date2timestamp"](t) \
 56				if not re.match(r'^\d+$', t) else int(t)
 57			for v,n,f in (
 58				(id,'id',str), (sender,'sender',str), (recipient,'recipient',str),
 59				(processed,'processed', bool),
 60				(time_after, 'time_after', convert_time), (time_before, 'time_before', convert_time) 
 61			):
 62				if not v is None:
 63					db_args[n] = f(v)
 64
 65			if _count_only:
 66				return self.db.len(**db_args)
 67			else:
 68				def pagination_link(**kwargs):
 69					link_args = db_args.copy()
 70					link_args.update(kwargs)
 71					return urlencode(link_args)
 72			
 73				return self.template.TemplateResponse(
 74					'table.html',
 75					{"request" : request,
 76						"db" : self.db, "db_args" : db_args,
 77						"pagination_link" : pagination_link
 78					}
 79				)
 80			
 81		@self.router.get("/table/total", summary="Total number of messages in table")
 82		def table_total(request: Request,
 83			id:str|None=None, sender:str|None=None, recipient:str|None=None,
 84			processed:bool|None=None,
 85			time_after:int|str|None=None, time_before:int|str|None=None,
 86			limit:int=10, offset:int=0
 87		) -> int:
 88
 89			kwargs = locals().copy()
 90			del kwargs['table']
 91			kwargs['_count_only'] = True
 92
 93			return table(**kwargs)
 94
 95		@self.router.get("/new", response_class=HTMLResponse, summary="Add new riddle")
 96		def new(request: Request):
 97			return self.template.TemplateResponse(
 98				'new.html',
 99				{"request" : request}
100			)
class Interface:
 23class Interface():
 24
 25	_PREFIX = "/app"
 26
 27	def __init__(self, template:Jinja2Templates, db:DB):
 28		self.template = template
 29		self.db = db
 30		
 31		self.router = APIRouter(
 32			prefix=self._PREFIX,
 33			tags=["app, gui"]
 34		)
 35		
 36		self._add_routes()
 37
 38	def _add_routes(self):
 39		@self.router.get("/", response_class=RedirectResponse, summary="Redirect")
 40		def index(request: Request) -> RedirectResponse:
 41			return RedirectResponse(self._PREFIX + "/table")
 42		
 43		@self.router.get("/table", response_class=HTMLResponse, summary="Table of messages")
 44		def table(request: Request,
 45			id:str|None=None, sender:str|None=None, recipient:str|None=None,
 46			processed:bool|None=None,
 47			time_after:int|str|None=None, time_before:int|str|None=None,
 48			limit:int=10, offset:int=0, _count_only:bool=False
 49		):
 50			
 51			db_args = {
 52				"limit" : limit,
 53				"offset" : offset
 54			}
 55
 56			convert_time = lambda t: self.template.env.globals["date2timestamp"](t) \
 57				if not re.match(r'^\d+$', t) else int(t)
 58			for v,n,f in (
 59				(id,'id',str), (sender,'sender',str), (recipient,'recipient',str),
 60				(processed,'processed', bool),
 61				(time_after, 'time_after', convert_time), (time_before, 'time_before', convert_time) 
 62			):
 63				if not v is None:
 64					db_args[n] = f(v)
 65
 66			if _count_only:
 67				return self.db.len(**db_args)
 68			else:
 69				def pagination_link(**kwargs):
 70					link_args = db_args.copy()
 71					link_args.update(kwargs)
 72					return urlencode(link_args)
 73			
 74				return self.template.TemplateResponse(
 75					'table.html',
 76					{"request" : request,
 77						"db" : self.db, "db_args" : db_args,
 78						"pagination_link" : pagination_link
 79					}
 80				)
 81			
 82		@self.router.get("/table/total", summary="Total number of messages in table")
 83		def table_total(request: Request,
 84			id:str|None=None, sender:str|None=None, recipient:str|None=None,
 85			processed:bool|None=None,
 86			time_after:int|str|None=None, time_before:int|str|None=None,
 87			limit:int=10, offset:int=0
 88		) -> int:
 89
 90			kwargs = locals().copy()
 91			del kwargs['table']
 92			kwargs['_count_only'] = True
 93
 94			return table(**kwargs)
 95
 96		@self.router.get("/new", response_class=HTMLResponse, summary="Add new riddle")
 97		def new(request: Request):
 98			return self.template.TemplateResponse(
 99				'new.html',
100				{"request" : request}
101			)
Interface( template: starlette.templating.Jinja2Templates, db: ums.management.db.DB)
27	def __init__(self, template:Jinja2Templates, db:DB):
28		self.template = template
29		self.db = db
30		
31		self.router = APIRouter(
32			prefix=self._PREFIX,
33			tags=["app, gui"]
34		)
35		
36		self._add_routes()
template
db
router