Module: check_mk
Branch: master
Commit: f7bce57e9c02863007e7e3841067a706b148712e
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=f7bce57e9c0286…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Sun Mar 3 21:19:40 2019 +0100
Moved row limit handling out of views.show_view()
Change-Id: I2822e00b0a6eeaf93194a6ecb20efa5a3dd2eceb
---
cmk/gui/mobile.py | 5 ++++-
cmk/gui/plugins/dashboard/view.py | 3 +++
cmk/gui/views.py | 40 ++++++++++++++++++++++-----------------
tests/unit/cmk/gui/test_views.py | 32 +++++++++++++++++++++++++++++++
4 files changed, 62 insertions(+), 18 deletions(-)
diff --git a/cmk/gui/mobile.py b/cmk/gui/mobile.py
index ad2774c..e872aa8 100644
--- a/cmk/gui/mobile.py
+++ b/cmk/gui/mobile.py
@@ -236,6 +236,8 @@ def page_index():
for view_name, view_spec in views.get_permitted_views().items():
if view_spec.get("mobile") and not view_spec.get("hidden"):
view = views.View(view_name, view_spec)
+ view.row_limit = views.get_limit()
+
url = "mobile_view.py?view_name=%s" % view_name
count = ""
if not view_spec.get("mustsearch"):
@@ -281,6 +283,7 @@ def page_view():
raise MKUserError("view_name", "No view defined with the name
'%s'." % view_name)
view = views.View(view_name, view_spec)
+ view.row_limit = views.get_limit()
title = views.view_title(view_spec)
mobile_html_head(title)
@@ -357,7 +360,7 @@ class MobileViewRenderer(views.ViewRenderer):
html.write(_("No hosts/services found."))
else:
try:
- cmk.gui.view_utils.check_limit(rows, views.get_limit(), config.user)
+ cmk.gui.view_utils.check_limit(rows, self.view.row_limit,
config.user)
layout.render(rows, view_spec, group_cells, cells, num_columns,
show_checkboxes and not html.do_actions())
except Exception as e:
diff --git a/cmk/gui/plugins/dashboard/view.py b/cmk/gui/plugins/dashboard/view.py
index 1533902..e6c0e93 100644
--- a/cmk/gui/plugins/dashboard/view.py
+++ b/cmk/gui/plugins/dashboard/view.py
@@ -91,6 +91,9 @@ class ViewDashlet(IFrameDashlet):
painter_options = PainterOptions.get_instance()
painter_options.load(self._dashlet_spec["name"])
+
view = views.View(self._dashlet_spec["name"], self._dashlet_spec)
+ view.row_limit = views.get_limit()
+
view_renderer = views.GUIViewRenderer(view, show_buttons=False)
views.show_view(view, view_renderer)
diff --git a/cmk/gui/views.py b/cmk/gui/views.py
index 82b3840..63948f0 100644
--- a/cmk/gui/views.py
+++ b/cmk/gui/views.py
@@ -209,6 +209,7 @@ class View(object):
super(View, self).__init__()
self.name = view_name
self.spec = view_spec
+ self._row_limit = None # type: Optional[int]
@property
def datasource(self):
@@ -226,6 +227,17 @@ class View(object):
_("The view '%s' using the datasource '%s' can
not be rendered "
"because the datasource does not exist.") % (self.name,
self.datasource))
+ @property
+ def row_limit(self):
+ if self.datasource.ignore_limit:
+ return None
+
+ return self._row_limit
+
+ @row_limit.setter
+ def row_limit(self, row_limit):
+ self._row_limit = row_limit
+
class ViewRenderer(object):
__metaclass__ = abc.ABCMeta
@@ -349,7 +361,7 @@ class GUIViewRenderer(ViewRenderer):
if not has_done_actions:
# Limit exceeded? Show warning
if display_options.enabled(display_options.W):
- cmk.gui.view_utils.check_limit(rows, get_limit(), config.user)
+ cmk.gui.view_utils.check_limit(rows, self.view.row_limit, config.user)
layout.render(rows, view_spec, group_cells, cells, num_columns,
show_checkboxes and
not html.do_actions())
headinfo = "%d %s" % (row_count, _("row") if row_count ==
1 else _("rows"))
@@ -1115,6 +1127,7 @@ def page_view():
view_spec, view_name = html.get_item_input("view_name",
get_permitted_views())
view = View(view_name, view_spec)
+ view.row_limit = get_limit()
# Gather the page context which is needed for the "add to visual" popup
menu
# to add e.g. views to dashboards or reports
@@ -1132,8 +1145,7 @@ def page_view():
# Display view with real data. This is *the* function everying
# is about.
-def show_view(view, view_renderer, only_count=False, limit=None):
-
+def show_view(view, view_renderer, only_count=False):
display_options.load_from_html()
# Load from hard painter options > view > hard coded default
@@ -1211,15 +1223,6 @@ def show_view(view, view_renderer, only_count=False, limit=None):
else:
only_sites = None
- # Prepare limit:
- # We had a problem with stats queries on the logtable where
- # the limit was not applied on the resulting rows but on the
- # lines of the log processed. This resulted in wrong stats.
- # For these datasources we ignore the query limits.
- if limit is None: # Otherwise: specified as argument
- if not view.datasource.ignore_limit:
- limit = get_limit()
-
# Fork to availability view. We just need the filter headers, since we do not query
the normal
# hosts and service table, but "statehist". This is *not* true for BI
availability, though (see later)
if html.request.var("mode") == "availability" and
("aggr" not in view.datasource.infos or
@@ -1229,7 +1232,7 @@ def show_view(view, view_renderer, only_count=False, limit=None):
context.update(visuals.get_singlecontext_html_vars(view.spec))
return cmk.gui.plugins.views.availability.render_availability_page(
- view.spec, view.datasource, context, filterheaders, only_sites, limit)
+ view.spec, view.datasource, context, filterheaders, only_sites,
view.row_limit)
query = filterheaders + view.spec.get("add_headers", "")
@@ -1265,12 +1268,15 @@ def show_view(view, view_renderer, only_count=False, limit=None):
# is a list of argument to hand over to the function together with all other
arguments that
# are passed to query_data().
if callable(view.datasource.table):
- rows = view.datasource.table(columns, query, only_sites, limit,
all_active_filters)
+ rows = view.datasource.table(columns, query, only_sites, view.row_limit,
+ all_active_filters)
elif isinstance(view.datasource.table, tuple):
func, args = view.datasource.table
- rows = func(view.datasource, columns, add_columns, query, only_sites, limit,
*args)
+ rows = func(view.datasource, columns, add_columns, query, only_sites,
view.row_limit,
+ *args)
else:
- rows = query_data(view.datasource, columns, add_columns, query, only_sites,
limit)
+ rows = query_data(view.datasource, columns, add_columns, query, only_sites,
+ view.row_limit)
# Now add join information, if there are join columns
if join_cells:
@@ -1548,8 +1554,8 @@ def play_alarm_sounds():
break # only one sound at one time
-# How many data rows may the user query?
def get_limit():
+ """How many data rows may the user query?"""
limitvar = html.request.var("limit", "soft")
if limitvar == "hard" and
config.user.may("general.ignore_soft_limit"):
return config.hard_query_limit
diff --git a/tests/unit/cmk/gui/test_views.py b/tests/unit/cmk/gui/test_views.py
index 3438d61..a1f84e0 100644
--- a/tests/unit/cmk/gui/test_views.py
+++ b/tests/unit/cmk/gui/test_views.py
@@ -9,6 +9,7 @@ import cmk.gui.config as config
import cmk.gui.views # pylint: disable=unused-import
import cmk.gui.default_permissions
+from cmk.gui.globals import html
from cmk.gui.valuespec import ValueSpec
import cmk.gui.plugins.views
import cmk.gui.modules as modules
@@ -5794,3 +5795,34 @@ def test_create_view_basics(register_builtin_html,
load_view_plugins):
assert view.name == view_name
assert view.spec == view_spec
assert isinstance(view.datasource, cmk.gui.plugins.views.utils.DataSource)
+ assert view.row_limit is None
+
+def test_view_row_limit(register_builtin_html, load_view_plugins):
+ view_name = "allhosts"
+ view_spec = cmk.gui.views.multisite_builtin_views[view_name]
+
+ view = cmk.gui.views.View(view_name, view_spec)
+ assert view.row_limit is None
+ view.row_limit = 101
+ assert view.row_limit == 101
+ assert cmk.gui.views.get_limit() == 1000
+
+(a)pytest.mark.parametrize("limit,permissions,result"sult", [
+ ("soft", [], 1000),
+ ("hard", [], 1000),
+ ("none", [], 1000),
+
+ ("soft", ["general.ignore_soft_limit"], 1000),
+ ("hard", ["general.ignore_soft_limit"], 5000),
+ # Strange. Shouldn't this stick to the hard limit?
+ ("none", ["general.ignore_soft_limit"], 1000),
+
+ ("soft", ["general.ignore_soft_limit",
"general.ignore_hard_limit"], 1000),
+ ("hard", ["general.ignore_soft_limit",
"general.ignore_hard_limit"], 5000),
+ ("none", ["general.ignore_soft_limit",
"general.ignore_hard_limit"], None),
+])
+def test_gui_view_row_limit(register_builtin_html, monkeypatch, limit, permissions,
result):
+ monkeypatch.setitem(html.request._vars, "limit", limit)
+ for perm in permissions:
+ monkeypatch.setitem(config.user.permissions, perm, True)
+ assert cmk.gui.views.get_limit() == result