diff --git a/allianceauth/menu/apps.py b/allianceauth/menu/apps.py index 1bea6e29..93e1b081 100644 --- a/allianceauth/menu/apps.py +++ b/allianceauth/menu/apps.py @@ -3,6 +3,7 @@ import logging from django.apps import AppConfig from django.db.utils import ProgrammingError, OperationalError + logger = logging.getLogger(__name__) @@ -12,8 +13,7 @@ class MenuConfig(AppConfig): def ready(self): try: - logger.debug("Syncing MenuItem Hooks") - from allianceauth.menu.providers import MenuItem - MenuItem.sync_hook_models() + from allianceauth.menu.providers import menu_provider + menu_provider.clear_synced_flag() except (ProgrammingError, OperationalError): logger.warning("Migrations not completed for MenuItems") diff --git a/allianceauth/menu/middleware.py b/allianceauth/menu/middleware.py new file mode 100644 index 00000000..440befb3 --- /dev/null +++ b/allianceauth/menu/middleware.py @@ -0,0 +1,15 @@ +from django.utils.deprecation import MiddlewareMixin + +import logging + +from allianceauth.menu.providers import menu_provider + +logger = logging.getLogger(__name__) + + +class MenuSyncMiddleware(MiddlewareMixin): + + def __call__(self, request): + """Alliance Auth Menu Sync Middleware""" + menu_provider.check_and_sync_menu() + return super().__call__(request) diff --git a/allianceauth/menu/providers.py b/allianceauth/menu/providers.py index 578a63b3..a5e3702d 100644 --- a/allianceauth/menu/providers.py +++ b/allianceauth/menu/providers.py @@ -1,10 +1,49 @@ -from django.template.loader import render_to_string +import logging -from allianceauth.hooks import get_hooks +from django.core.cache import cache -from .models import MenuItem +from allianceauth.menu.models import MenuItem +from allianceauth.utils.django import StartupCommand + +logger = logging.getLogger(__name__) + +MENU_SYNC_CACHE_KEY = "ALLIANCEAUTH-MENU-SYNCED" +MENU_CACHE_KEY = "ALLIANCEAUTH-MENU-CACHE" class MenuProvider(): - def __init__(self) -> None: + + def clear_synced_flag(self) -> bool: + return cache.delete(MENU_SYNC_CACHE_KEY) + + def set_synced_flag(self) -> bool: + return cache.set(MENU_SYNC_CACHE_KEY, True) + + def get_synced_flag(self) -> bool: + return cache.get(MENU_SYNC_CACHE_KEY, False) + + def sync_menu_models(self): + MenuItem.sync_hook_models() + self.set_synced_flag() + + def check_and_sync_menu(self) -> None: + if self.get_synced_flag(): + # performance hit to each page view to ensure tests work. + # tests clear DB but not cache. + # TODO rethink all of this? + if MenuItem.objects.all().count() > 0: + logger.debug("Menu Hooks Synced") + else: + self.sync_menu_models() + else: + logger.debug("Syncing Menu Hooks") + self.sync_menu_models() + + def get_and_cache_menu(self): pass + + def clear_menu_cache(self): + pass + + +menu_provider = MenuProvider() diff --git a/allianceauth/menu/templatetags/menu_menu_items.py b/allianceauth/menu/templatetags/menu_menu_items.py index 04a1288a..3b6eec62 100644 --- a/allianceauth/menu/templatetags/menu_menu_items.py +++ b/allianceauth/menu/templatetags/menu_menu_items.py @@ -3,7 +3,6 @@ from django import template from allianceauth.hooks import get_hooks from allianceauth.menu.models import MenuItem -from ..providers import MenuProvider register = template.Library() diff --git a/allianceauth/permissions_tool/tests.py b/allianceauth/permissions_tool/tests.py index 97222d67..9354a0e3 100644 --- a/allianceauth/permissions_tool/tests.py +++ b/allianceauth/permissions_tool/tests.py @@ -3,7 +3,6 @@ from django import urls from django.contrib.auth.models import Group, Permission from allianceauth.tests.auth_utils import AuthUtils -from allianceauth.menu.models import MenuItem class PermissionsToolViewsTestCase(WebTest): def setUp(self): @@ -34,8 +33,6 @@ class PermissionsToolViewsTestCase(WebTest): self.member.user_permissions.add(self.permission) AuthUtils.connect_signals() - # TODO find a nicer way to do this later - MenuItem.sync_hook_models() def test_menu_item(self): # If we change the side menu again this will fail again. diff --git a/allianceauth/project_template/project_name/settings/base.py b/allianceauth/project_template/project_name/settings/base.py index cb9ff5ae..a046b3d7 100644 --- a/allianceauth/project_template/project_name/settings/base.py +++ b/allianceauth/project_template/project_name/settings/base.py @@ -72,6 +72,7 @@ PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) BASE_DIR = os.path.dirname(PROJECT_DIR) MIDDLEWARE = [ + 'allianceauth.menu.middleware.MenuSyncMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'allianceauth.authentication.middleware.UserSettingsMiddleware',