From 16ff1936cd366290e58f385f100851e766e263d0 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 16 Mar 2023 19:55:07 +1100 Subject: [PATCH] Bypass cache when displaying settings on "settings" page (#4499) * Bypass cache when displaying settings on "settings" page - Sometimes caching issues can cause "old" values to be stored (depends on the worker) - Until we have a shared cache, this is a problem - Force the settings to be re-loaded from the database when displaying - Further improvement would be to render them via the API * Bypass cache for report and label printing * Update test (cherry picked from commit 18c7c1d756353547204006c7767f2d221bc1d399) --- InvenTree/label/api.py | 4 ++-- InvenTree/part/templatetags/inventree_extras.py | 11 +++++++---- InvenTree/report/api.py | 6 +++--- InvenTree/report/tests.py | 2 +- InvenTree/templates/InvenTree/settings/setting.html | 8 ++++---- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/InvenTree/label/api.py b/InvenTree/label/api.py index 9d8092f551..fb2e8da433 100644 --- a/InvenTree/label/api.py +++ b/InvenTree/label/api.py @@ -185,7 +185,7 @@ class LabelPrintMixin(LabelFilterMixin): outputs = [] # In debug mode, generate single HTML output, rather than PDF - debug_mode = common.models.InvenTreeSetting.get_setting('REPORT_DEBUG_MODE') + debug_mode = common.models.InvenTreeSetting.get_setting('REPORT_DEBUG_MODE', cache=False) label_name = "label.pdf" @@ -260,7 +260,7 @@ class LabelPrintMixin(LabelFilterMixin): pdf = outputs[0].get_document().copy(pages).write_pdf() - inline = common.models.InvenTreeUserSetting.get_setting('LABEL_INLINE', user=request.user) + inline = common.models.InvenTreeUserSetting.get_setting('LABEL_INLINE', user=request.user, cache=False) return InvenTree.helpers.DownloadFile( pdf, diff --git a/InvenTree/part/templatetags/inventree_extras.py b/InvenTree/part/templatetags/inventree_extras.py index c64f6bcbc7..ef95922625 100644 --- a/InvenTree/part/templatetags/inventree_extras.py +++ b/InvenTree/part/templatetags/inventree_extras.py @@ -318,20 +318,23 @@ def setting_object(key, *args, **kwargs): (Or return None if the setting does not exist) if a user-setting was requested return that """ + + cache = kwargs.get('cache', True) + if 'plugin' in kwargs: # Note, 'plugin' is an instance of an InvenTreePlugin class plugin = kwargs['plugin'] - return PluginSetting.get_setting_object(key, plugin=plugin) + return PluginSetting.get_setting_object(key, plugin=plugin, cache=cache) if 'method' in kwargs: - return NotificationUserSetting.get_setting_object(key, user=kwargs['user'], method=kwargs['method']) + return NotificationUserSetting.get_setting_object(key, user=kwargs['user'], method=kwargs['method'], cache=cache) if 'user' in kwargs: - return InvenTreeUserSetting.get_setting_object(key, user=kwargs['user']) + return InvenTreeUserSetting.get_setting_object(key, user=kwargs['user'], cache=cache) - return InvenTreeSetting.get_setting_object(key) + return InvenTreeSetting.get_setting_object(key, cache=cache) @register.simple_tag() diff --git a/InvenTree/report/api.py b/InvenTree/report/api.py index 738c7b859b..1c27c16393 100644 --- a/InvenTree/report/api.py +++ b/InvenTree/report/api.py @@ -185,7 +185,7 @@ class ReportPrintMixin: outputs = [] # In debug mode, generate single HTML output, rather than PDF - debug_mode = common.models.InvenTreeSetting.get_setting('REPORT_DEBUG_MODE') + debug_mode = common.models.InvenTreeSetting.get_setting('REPORT_DEBUG_MODE', cache=False) # Start with a default report name report_name = "report.pdf" @@ -254,7 +254,7 @@ class ReportPrintMixin: status=400, ) - inline = common.models.InvenTreeUserSetting.get_setting('REPORT_INLINE', user=request.user) + inline = common.models.InvenTreeUserSetting.get_setting('REPORT_INLINE', user=request.user, cache=False) return InvenTree.helpers.DownloadFile( pdf, @@ -342,7 +342,7 @@ class StockItemTestReportPrint(RetrieveAPI, StockItemReportMixin, ReportPrintMix def report_callback(self, item, report, request): """Callback to (optionally) save a copy of the generated report""" - if common.models.InvenTreeSetting.get_setting('REPORT_ATTACH_TEST_REPORT'): + if common.models.InvenTreeSetting.get_setting('REPORT_ATTACH_TEST_REPORT', cache=False): # Construct a PDF file object pdf = report.get_document().write_pdf() diff --git a/InvenTree/report/tests.py b/InvenTree/report/tests.py index a24f141c82..b9cb8c1632 100644 --- a/InvenTree/report/tests.py +++ b/InvenTree/report/tests.py @@ -375,7 +375,7 @@ class BuildReportTest(ReportTest): self.assertEqual(headers['Content-Disposition'], 'attachment; filename="report.pdf"') # Now, set the download type to be "inline" - inline = InvenTreeUserSetting.get_setting_object('REPORT_INLINE', user=self.user) + inline = InvenTreeUserSetting.get_setting_object('REPORT_INLINE', cache=False, user=self.user) inline.value = True inline.save() diff --git a/InvenTree/templates/InvenTree/settings/setting.html b/InvenTree/templates/InvenTree/settings/setting.html index 1b9a020658..34f2a39173 100644 --- a/InvenTree/templates/InvenTree/settings/setting.html +++ b/InvenTree/templates/InvenTree/settings/setting.html @@ -2,13 +2,13 @@ {% load i18n %} {% if plugin %} -{% setting_object key plugin=plugin as setting %} +{% setting_object key cache=False plugin=plugin as setting %} {% elif user_setting %} -{% setting_object key user=request.user as setting %} +{% setting_object key cache=False user=request.user as setting %} {% elif notification_setting %} -{% setting_object key method=method user=request.user as setting %} +{% setting_object key cache=False method=method user=request.user as setting %} {% else %} -{% setting_object key as setting %} +{% setting_object key cache=False as setting %} {% endif %}