From 1be8f00a7708a89236a6b7a8aceccbd5bbd958a0 Mon Sep 17 00:00:00 2001 From: Chris Caron Date: Sat, 30 Mar 2024 12:10:24 -0400 Subject: [PATCH] Added cookie for remembering config id accessed via website --- apprise_api/api/context_processors.py | 2 +- apprise_api/core/middleware/config.py | 83 +++++++++++++++++++++++++++ apprise_api/core/settings/__init__.py | 1 + 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 apprise_api/core/middleware/config.py diff --git a/apprise_api/api/context_processors.py b/apprise_api/api/context_processors.py index 90849d0..fcb4167 100644 --- a/apprise_api/api/context_processors.py +++ b/apprise_api/api/context_processors.py @@ -53,7 +53,7 @@ def default_config_id(request): """ Returns a unique config identifier """ - return {'DEFAULT_CONFIG_ID': settings.APPRISE_DEFAULT_CONFIG_ID} + return {'DEFAULT_CONFIG_ID': request.default_config_id} def unique_config_id(request): diff --git a/apprise_api/core/middleware/config.py b/apprise_api/core/middleware/config.py new file mode 100644 index 0000000..4aaa7fd --- /dev/null +++ b/apprise_api/core/middleware/config.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2023 Chris Caron +# All rights reserved. +# +# This code is licensed under the MIT License. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files(the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions : +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +import re +from django.conf import settings +from core.themes import SiteTheme, SITE_THEMES +import datetime + + +class DetectConfigMiddleware: + """ + Using the `key=` variable, allow one pre-configure the default + configuration to use. + + """ + + _is_cfg_path = re.compile(r'/cfg/(?P[\w_-]{1,128})') + + def __init__(self, get_response): + """ + Prepare our initialization + """ + self.get_response = get_response + + def __call__(self, request): + """ + Define our middleware hook + """ + + result = self._is_cfg_path.match(request.path) + if not result: + # Our current config + config = \ + request.COOKIES.get('key', settings.APPRISE_DEFAULT_CONFIG_ID) + + # Extract our key (fall back to our default if not set) + config = request.GET.get("key", config).strip() + + else: + config = result.group('key') + + if not config: + # Fallback to default config + config = settings.APPRISE_DEFAULT_CONFIG_ID + + # Set our theme to a cookie + request.default_config_id = config + + # Get our response object + response = self.get_response(request) + + # Set our cookie + max_age = 365 * 24 * 60 * 60 # 1 year + expires = datetime.datetime.utcnow() + \ + datetime.timedelta(seconds=max_age) + + # Set our cookie + response.set_cookie('key', config, expires=expires) + + # return our response + return response diff --git a/apprise_api/core/settings/__init__.py b/apprise_api/core/settings/__init__.py index 0f58976..4f8d547 100644 --- a/apprise_api/core/settings/__init__.py +++ b/apprise_api/core/settings/__init__.py @@ -66,6 +66,7 @@ INSTALLED_APPS = [ MIDDLEWARE = [ 'django.middleware.common.CommonMiddleware', 'core.middleware.theme.AutoThemeMiddleware', + 'core.middleware.config.DetectConfigMiddleware', ] ROOT_URLCONF = 'core.urls'