add web frontend menu management

This commit is contained in:
Izalia Mae 2021-08-17 14:50:50 -04:00
parent bf8750a196
commit f5b2eb1193
5 changed files with 54 additions and 6 deletions

View file

@ -3,7 +3,7 @@ from datetime import datetime
start_time = datetime.now()
from .application import Application
from .config import Config
from .config import Config, UserLevel
from .request import Request
from .response import Response
from .view import View

View file

@ -9,7 +9,7 @@ from urllib.parse import parse_qsl, urlparse
from izzylib import DotDict, Path, logging
from izzylib.template import Template
from .config import Config
from .config import Config, UserLevel
from .error_handlers import GenericError, MissingTemplateError
from .middleware import AccessLog, Headers
from .view import Manifest, Style
@ -67,6 +67,9 @@ class Application(sanic.Sanic):
for route in cls.paths:
self.add_route(cls.as_view(), route)
if cls.menu:
self.set_menu_item(*cls.menu)
def add_error_handler(self, handler):
handle = handler(self)
@ -78,6 +81,18 @@ class Application(sanic.Sanic):
self.register_middleware(mw.handler, mw.attach)
def get_menu_item(self, name, level=0):
return self.cfg.menu[parse_level(level)][name]
def set_menu_item(self, name, path, level=0):
self.cfg.menu[parse_level(level)][name] = path
def del_menu_item(self, name, level=0):
del self.cfg.menu[parse_level(level)][name]
def start(self):
# register built-in middleware now so they're last in the chain
self.add_middleware(Headers)
@ -104,3 +119,16 @@ class Application(sanic.Sanic):
self.stop()
logging.info('Bye! :3')
def parse_level(level):
if type(level) == int:
new_level = UserLevel(level)
elif type(level) == str:
new_level = UserLevel[level.upper()]
elif type(level) != UserLevel:
raise TypeError(f'User level must be a string, integer, or UserLevel, not a {level.__class__.__name__}')
return new_level

View file

@ -1,3 +1,4 @@
from enum import Enum
from izzylib import DotDict
from multiprocessing import cpu_count
@ -5,6 +6,13 @@ from .request import Request
from .response import Response
class UserLevel(Enum):
GUEST = 0
USER = 10
MODERATOR = 20
ADMIN = 30
class Config(DotDict):
defaults = dict(
name = 'IzzyLib Http Server',
@ -22,16 +30,24 @@ class Config(DotDict):
sig_handler = None,
sig_handler_args = [],
sig_handler_kwargs = {},
menu = {},
tpl_search = [],
tpl_globals = {},
tpl_context = None,
tpl_autoescape = True,
tpl_default = True
tpl_default = True,
menu = {
UserLevel.GUEST: {},
UserLevel.USER: {},
UserLevel.MODERATOR: {},
UserLevel.ADMIN: {}
}
)
def __init__(self, **kwargs):
if kwargs.pop('menu', None):
raise ValueError('Use the Application.set_menu_item function to set menu items')
super().__init__({**self.defaults, **kwargs})
if kwargs.get('host') and not kwargs.get('web_host'):
@ -39,6 +55,9 @@ class Config(DotDict):
def __setitem__(self, key, value):
if key == 'menu':
raise KeyError('Use the Application.set_menu_item function to set menu items')
if key not in self.defaults.keys():
raise KeyError(f'Invalid config key {key}')

View file

@ -6,6 +6,7 @@ from .response import Response
class View(HTTPMethodView):
routes = []
menu = None # example: ("Home", "\", 0)
def dispatch_request(self, request, *args, **kwargs):

View file

@ -3,8 +3,8 @@ from setuptools import setup, find_namespace_packages
requires = [
'sanic==20.12.3',
'sanic-cors==1.0.0',
'sanic=>20.12.3',
'sanic-cors=>1.0.0',
]