Module: check_mk
Branch: master
Commit: 8b17175c0d355b881e35656e8ed81ca0d5b2818d
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=8b17175c0d355b…
Author: Sven Panne <sp(a)mathias-kettner.de>
Date: Wed Jan 9 08:51:30 2019 +0100
Stash variables via a context manager only.
This is conceptually much simpler, uses less code and even fixes a few
border cases when exceptions were thrown.
Change-Id: I09378bfcd13103f41362a9142ade259e2b320d2a
---
cmk/gui/dashboard.py | 26 ++++++++++++--------------
cmk/gui/htmllib.py | 19 +++++++++----------
cmk/gui/visuals.py | 35 +++++++++++++++++------------------
3 files changed, 38 insertions(+), 42 deletions(-)
diff --git a/cmk/gui/dashboard.py b/cmk/gui/dashboard.py
index 85d0395..100f35c 100644
--- a/cmk/gui/dashboard.py
+++ b/cmk/gui/dashboard.py
@@ -640,26 +640,24 @@ def render_dashlet_title_html(dashlet_instance):
def render_dashlet_content(dashlet_instance, is_update, stash_html_vars=True):
- if stash_html_vars:
- html.stash_vars()
- html.del_all_vars()
- html.set_var("name", dashlet_instance.dashboard_name)
-
- try:
+ def update_or_show():
visuals.add_context_to_uri_vars(dashlet_instance.dashlet_spec)
if dashlet_instance.wato_folder is not None:
html.set_var("wato_folder", dashlet_instance.wato_folder)
-
with html.plugged():
- if not is_update:
- dashlet_instance.show()
- else:
+ if is_update:
dashlet_instance.update()
-
+ else:
+ dashlet_instance.show()
return html.drain()
- finally:
- if stash_html_vars:
- html.unstash_vars()
+
+ if stash_html_vars:
+ with html.stashed_vars():
+ html.del_all_vars()
+ html.set_var("name", dashlet_instance.dashboard_name)
+ return update_or_show()
+ else:
+ return update_or_show()
def render_dashlet_exception_content(dashlet_instance, nr, e):
diff --git a/cmk/gui/htmllib.py b/cmk/gui/htmllib.py
index 524a8a0..1a6b6ff 100644
--- a/cmk/gui/htmllib.py
+++ b/cmk/gui/htmllib.py
@@ -992,9 +992,6 @@ class html(HTMLGenerator):
self.start_time = time.time()
self.last_measurement = self.start_time
- # Variable management
- self._var_stash = []
-
# Register helpers
self.encoder = Encoder()
self.timeout_manager = TimeoutManager()
@@ -1146,13 +1143,15 @@ class html(HTMLGenerator):
def del_all_vars(self, prefix=None):
self.request.del_all_vars(prefix)
- def stash_vars(self):
- self._var_stash.append(dict(self.request.all_vars()))
-
- def unstash_vars(self):
- self.request.del_all_vars()
- for varname, value in self._var_stash.pop().iteritems():
- self.request.set_var(varname, value)
+ @contextmanager
+ def stashed_vars(self):
+ saved_vars = dict(self.request.all_vars())
+ try:
+ yield
+ finally:
+ self.request.del_all_vars()
+ for varname, value in saved_vars.iteritems():
+ self.request.set_var(varname, value)
def get_ascii_input(self, varname, deflt=None):
"""Helper to retrieve a byte string and ensure it only contains
ASCII characters
diff --git a/cmk/gui/visuals.py b/cmk/gui/visuals.py
index a051121..723b4b6 100644
--- a/cmk/gui/visuals.py
+++ b/cmk/gui/visuals.py
@@ -1154,25 +1154,24 @@ def get_filter_headers(datasource, context):
# Prepare Filter headers for Livestatus
filter_headers = ""
only_sites = None
- html.stash_vars()
- for filter_name, filter_vars in context.items():
- # first set the HTML variables. Sorry - the filters need this
- if isinstance(filter_vars, dict): # this is a multi-context filter
- for uri_varname, value in filter_vars.items():
- html.set_var(uri_varname, value)
- else:
- html.set_var(filter_name, filter_vars)
-
- # Now compute filter headers for all infos of the used datasource
- our_infos = datasource["infos"]
- for filter_name, filter_object in multisite_filters.items():
- if filter_object.info in our_infos:
- header = filter_object.filter(datasource["table"])
- if header.startswith("Sites:"):
- only_sites = header.strip().split(" ")[1:]
+ with html.stashed_vars():
+ for filter_name, filter_vars in context.items():
+ # first set the HTML variables. Sorry - the filters need this
+ if isinstance(filter_vars, dict): # this is a multi-context filter
+ for uri_varname, value in filter_vars.items():
+ html.set_var(uri_varname, value)
else:
- filter_headers += header
- html.unstash_vars()
+ html.set_var(filter_name, filter_vars)
+
+ # Now compute filter headers for all infos of the used datasource
+ our_infos = datasource["infos"]
+ for filter_name, filter_object in multisite_filters.items():
+ if filter_object.info in our_infos:
+ header = filter_object.filter(datasource["table"])
+ if header.startswith("Sites:"):
+ only_sites = header.strip().split(" ")[1:]
+ else:
+ filter_headers += header
return filter_headers, only_sites