diff --git a/http_server/izzylib/http_server/__init__.py b/http_server/izzylib/http_server/__init__.py index 7d8dfda..aabd388 100644 --- a/http_server/izzylib/http_server/__init__.py +++ b/http_server/izzylib/http_server/__init__.py @@ -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 diff --git a/http_server/izzylib/http_server/application.py b/http_server/izzylib/http_server/application.py index a667580..e53f581 100644 --- a/http_server/izzylib/http_server/application.py +++ b/http_server/izzylib/http_server/application.py @@ -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 diff --git a/http_server/izzylib/http_server/config.py b/http_server/izzylib/http_server/config.py index 0f63a92..3d9e50a 100644 --- a/http_server/izzylib/http_server/config.py +++ b/http_server/izzylib/http_server/config.py @@ -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}') diff --git a/http_server/izzylib/http_server/view.py b/http_server/izzylib/http_server/view.py index a561c5d..0eaa691 100644 --- a/http_server/izzylib/http_server/view.py +++ b/http_server/izzylib/http_server/view.py @@ -6,6 +6,7 @@ from .response import Response class View(HTTPMethodView): routes = [] + menu = None # example: ("Home", "\", 0) def dispatch_request(self, request, *args, **kwargs): diff --git a/http_server/setup.py b/http_server/setup.py index 696621d..f80899e 100644 --- a/http_server/setup.py +++ b/http_server/setup.py @@ -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', ]