Module: check_mk
Branch: master
Commit: 8945063120da22639e30d2c284f2813837b927e9
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=8945063120da22…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Sat Jul 21 16:50:47 2018 +0200
Make simple GUI themes possible
* Theme is now configurable
a) Override the default theme for the the whole installation
b) Each user can change the theme in his user profile
A theme is created by adding a new theme directory to web/htdocs/themes
and placing a theme.css in this directory. Images must be placed in
the images sub directory.
To be able to choose the theme using the GUI it needs to be added to
the lists of themes in the valuespecs.
* Themes can now override standard icons
The icons need to be placed into web/htdocs/themes/[theme]/images
with the exact same name as the original below web/htdocs/images.
Simplified and documented icon path detection during this progress.
Change-Id: I5176401fc0a553c9c5985332af82ad26d35f3ba5
---
cmk/gui/htmllib.py | 48 ++++++++++++++++------
cmk/gui/plugins/config/base.py | 3 ++
cmk/gui/plugins/userdb/user_attributes.py | 31 ++++++++++++++
cmk/gui/plugins/wato/check_mk_configuration.py | 15 +++++++
.../check_mk/skel/etc/check_mk/apache.conf | 2 +-
web/app/index.wsgi | 3 ++
6 files changed, 89 insertions(+), 13 deletions(-)
diff --git a/cmk/gui/htmllib.py b/cmk/gui/htmllib.py
index f62279a..8d028b2 100644
--- a/cmk/gui/htmllib.py
+++ b/cmk/gui/htmllib.py
@@ -1081,6 +1081,7 @@ class html(HTMLGenerator):
# Settings
self.mobile = False
+ self._theme = None
# Forms
self.form_name = None
@@ -1129,6 +1130,15 @@ class html(HTMLGenerator):
self._init_screenshot_mode()
self._init_debug_mode()
+ self.init_theme()
+
+
+ def init_theme(self):
+ self.set_theme(config.ui_theme)
+
+
+ def set_theme(self, theme_id):
+ self._theme = theme_id or config.ui_theme
def _verify_not_using_threaded_mpm(self):
@@ -1781,6 +1791,11 @@ class html(HTMLGenerator):
gui_colors.GUIColors().render_html()
+ if self._theme and self._theme != "classic":
+ fname = self._css_filename_for_browser("themes/%s/theme" %
self._theme)
+ self.stylesheet(fname)
+
+
def _plugin_stylesheets(self):
plugin_stylesheets = set([])
for dir in [ cmk.paths.web_dir + "/htdocs/css", cmk.paths.local_web_dir
+ "/htdocs/css" ]:
@@ -2760,20 +2775,29 @@ class html(HTMLGenerator):
def _detect_icon_path(self, icon_name):
- # Detect whether or not the icon is available as images/icon_*.png
- # or images/icons/*.png. When an icon is available as internal icon,
- # always use this one
- is_internal = False
- rel_path =
"share/check_mk/web/htdocs/images/icon_"+icon_name+".png"
- if os.path.exists(cmk.paths.omd_root+"/"+rel_path):
- is_internal = True
- elif os.path.exists(cmk.paths.omd_root+"/local/"+rel_path):
- is_internal = True
+ """Detect from which place an icon shall be used and return
it's path relative to
+ htdocs/
+
+ Priority:
+ 1. In case a theme is active: themes/images/icon_[name].png in site local
hierarc
+hy
+ 2. In case a theme is active: themes/images/icon_[name].png in standard
hierarchy
+ 3. images/icon_[name].png in site local hierarchy
+ 4. images/icon_[name].png in standard hierarchy
+ 5. images/icons/[name].png in site local hierarchy
+ 6. images/icons/[name].png in standard hierarchy
+ """
+
+ if self._theme and self._theme != "classic":
+ rel_path = "share/check_mk/web/htdocs/themes/%s/images/icon_%s.png"
% (self._theme, icon_name)
+ if os.path.exists(cmk.paths.omd_root+"/"+rel_path) or
os.path.exists(cmk.paths.omd_root+"/local/"+rel_path):
+ return "themes/%s/images/icon_%s.png" % (self._theme,
icon_name)
- if is_internal:
+ rel_path =
"share/check_mk/web/htdocs/images/icon_"+icon_name+".png"
+ if os.path.exists(cmk.paths.omd_root+"/"+rel_path) or
os.path.exists(cmk.paths.omd_root+"/local/"+rel_path):
return "images/icon_%s.png" % icon_name
- else:
- return "images/icons/%s.png" % icon_name
+
+ return "images/icons/%s.png" % icon_name
def render_icon_button(self, url, help, icon, id=None, onclick=None,
diff --git a/cmk/gui/plugins/config/base.py b/cmk/gui/plugins/config/base.py
index 4c4a9fe..b2dda5a 100644
--- a/cmk/gui/plugins/config/base.py
+++ b/cmk/gui/plugins/config/base.py
@@ -211,6 +211,9 @@ service_view_grouping = []
# Custom user stylesheet to load (resides in htdocs/)
custom_style_sheet = None
+# UI theme to use
+ui_theme = "classic"
+
# URL for start page in main frame (welcome page)
start_url = "dashboard.py"
diff --git a/cmk/gui/plugins/userdb/user_attributes.py
b/cmk/gui/plugins/userdb/user_attributes.py
index 03c4b25..9e91fbf 100644
--- a/cmk/gui/plugins/userdb/user_attributes.py
+++ b/cmk/gui/plugins/userdb/user_attributes.py
@@ -143,3 +143,34 @@ class StartURLUserAttribute(UserAttribute):
def domain(self):
return "multisite"
+
+
+
+class UIThemeUserAttribute(UserAttribute):
+ def name(self):
+ return "ui_theme"
+
+
+ def valuespec(self):
+ return Alternative(
+ title = _("User interface theme"),
+ style = "dropdown",
+ orientation = "horizontal",
+ elements = [
+ FixedValue(None,
+ title = _("Use the default theme"),
+ totext = "",
+ ),
+ DropdownChoice(
+ title = _("Set custom theme"),
+ choices = [
+ ("classic", _("Classic user interface")),
+ ("facelift", _("Face lifted")),
+ ],
+ ),
+ ],
+ )
+
+
+ def domain(self):
+ return "multisite"
diff --git a/cmk/gui/plugins/wato/check_mk_configuration.py
b/cmk/gui/plugins/wato/check_mk_configuration.py
index 936d9d2..487cc7d 100644
--- a/cmk/gui/plugins/wato/check_mk_configuration.py
+++ b/cmk/gui/plugins/wato/check_mk_configuration.py
@@ -105,6 +105,21 @@ def web_log_level_elements():
return elements
+register_configvar(
+ group,
+ "ui_theme",
+ DropdownChoice(
+ title = _("User interface theme"),
+ help = _("Change the default user interface theme of your Check_MK
installation"),
+ choices = [
+ ("classic", _("Classic user interface")),
+ ("facelift", _("Face lifted")),
+ ],
+ ),
+ domain = "multisite",
+)
+
+
register_configvar(group,
"bulk_discovery_default_settings",
vs_bulk_discovery(),
diff --git a/omd/packages/check_mk/skel/etc/check_mk/apache.conf
b/omd/packages/check_mk/skel/etc/check_mk/apache.conf
index a9f789d..3c38b82 100644
--- a/omd/packages/check_mk/skel/etc/check_mk/apache.conf
+++ b/omd/packages/check_mk/skel/etc/check_mk/apache.conf
@@ -69,7 +69,7 @@ Alias /###SITE###/check_mk ###ROOT###/share/check_mk/web/htdocs
# the version strings. This is done with mod_rewrite.
# e.g. change
http://localhost/event/check_mk/js/checkmk-2014.10.22.js to
# e.g. change
http://localhost/event/check_mk/js/checkmk.js
- RewriteRule "^(js/|)([a-z0-9_]+)-(.+?)\.(js|css)$"
"/###SITE###/check_mk/$1$2.$4"
+ RewriteRule "^(js/|themes/.*?/|)([a-z0-9_]+)-(.+?)\.(js|css)$"
"/###SITE###/c heck_mk/$1$2.$4"
# Rewrite rules for handling the local-hierarchy. All URI to static
# files are redirected, if those exist in local/. Thus the user
diff --git a/web/app/index.wsgi b/web/app/index.wsgi
index dcd4605..e0cc0d1 100644
--- a/web/app/index.wsgi
+++ b/web/app/index.wsgi
@@ -190,6 +190,9 @@ class Application(object):
# has been initialized
self._localize_request()
+ # Update the UI theme with the attribute configured by the user
+ html.set_theme(config.user.get_attribute("ui_theme"))
+
self._ensure_general_access()
handler()