diff --git a/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/FlaskBaseApp.py b/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/FlaskBaseApp.py index ea87c4a3f6bb6a36cbf50b638a17d05e18a1d811..d93ae3d80bfc7121fac4044069daa121d142aa32 100644 --- a/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/FlaskBaseApp.py +++ b/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/FlaskBaseApp.py @@ -9,6 +9,8 @@ from flask import Flask, send_from_directory from flask import jsonify from gevent.pywsgi import WSGIServer +from TheCodeLabs_FlaskUtils.menu.AbstractMenuService import AbstractMenuService + class FlaskBaseApp(ABC): def __init__(self, appName: str, @@ -17,12 +19,14 @@ class FlaskBaseApp(ABC): versionPath='version.json', settingsPath='../settings.json', serveFavicon=True, - serveRobotsTxt=False): + serveRobotsTxt=False, + menuService: AbstractMenuService = None): self._appName = appName self._rootDir = rootDir self._logger = logger self._serveFavicon = serveFavicon self._serveRobotsTxt = serveRobotsTxt + self._menuService = menuService self._version = self.__parse_version(versionPath) self._settings = self.__parse_settings(settingsPath) @@ -45,6 +49,9 @@ class FlaskBaseApp(ABC): app = self._create_flask_app() app.secret_key = self._serverSettings['secret'] + if self._menuService is not None: + app.jinja_env.globals.update(menu_items=self._menuService.get_menu_items()) + self._register_default_blueprints(app) self._register_blueprints(app) return app diff --git a/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/menu/AbstractMenuService.py b/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/menu/AbstractMenuService.py new file mode 100644 index 0000000000000000000000000000000000000000..b995341b6c5787972394946964823e79e6d5c42d --- /dev/null +++ b/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/menu/AbstractMenuService.py @@ -0,0 +1,12 @@ +import abc +from abc import ABC +from typing import List + +from TheCodeLabs_FlaskUtils.menu.MenuItem import MenuItem + + +class AbstractMenuService(ABC): + + @abc.abstractmethod + def get_menu_items(self) -> List[MenuItem]: + pass diff --git a/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/menu/MenuItem.py b/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/menu/MenuItem.py new file mode 100644 index 0000000000000000000000000000000000000000..9cfc51bb5cd9cbaa85b6b6bf81868d7eca3f027e --- /dev/null +++ b/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/menu/MenuItem.py @@ -0,0 +1,39 @@ +import uuid + +from flask import request +from flask import url_for + + +class MenuItem: + def __init__(self, endpoint: str or None, name: str, menu_items=None, secure: bool = False): + if menu_items is None: + menu_items = [] + self._endpoint = endpoint + self._name = name + self._menu_items = menu_items + self._id = uuid.uuid1() + self._secure = secure + + def id(self): + return self._id + + def name(self): + return self._name + + def endpoint(self): + return self._endpoint + + def menu_items(self): + return self._menu_items + + def is_active(self): + if request.endpoint == self._endpoint: + return True + + try: + return str.startswith(url_for(request.endpoint), url_for(self._endpoint)) + except: + return False + + def is_secure(self): + return self._secure diff --git a/TheCodeLabs_FlaskUtils/setup.py b/TheCodeLabs_FlaskUtils/setup.py index dc51c72892142ef54fb57df00bb1bc22c4ff24f4..552a5d0efd2955c1f8f5e817a3ff7fbae8969071 100644 --- a/TheCodeLabs_FlaskUtils/setup.py +++ b/TheCodeLabs_FlaskUtils/setup.py @@ -2,8 +2,12 @@ from setuptools import setup setup( name='TheCodeLabs-FlaskUtils', - packages=['TheCodeLabs_FlaskUtils', 'TheCodeLabs_FlaskUtils.auth'], - version='1.2.1', + packages=[ + 'TheCodeLabs_FlaskUtils', + 'TheCodeLabs_FlaskUtils.auth', + 'TheCodeLabs_FlaskUtils.menu' + ], + version='1.2.2', license='MIT', description='Useful python classes', author='TheCodeLabs',