Module: check_mk
Branch: master
Commit: 6bec6891bead9763d8d39ea18b8e941ca5ec65fe
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=6bec6891bead97…
Author: Andreas Boesl <ab(a)mathias-kettner.de>
Date: Thu Nov 8 14:28:32 2012 +0100
Valuespec: fixed exception in DropDownchoice(), Display help texts of Alternative()
---
ChangeLog | 2 ++
web/htdocs/valuespec.py | 3 ++-
2 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index ad5fab6..b1ff70d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -68,6 +68,8 @@
* FIX: Fixed editing of icon_image rules
* Added support of locked hosts and folders ( created by CMDB )
* Logwatch: logwatch agents/plugins now with ok pattern support
+ * Valuespec: Alternative Value Spec now shows helptext of its elements
+ * Valuespec: DropdownChoice, fixed exception on validate_datatype
Checks & Agents:
* New check mssql_counters.locks: Monitors locking related information of
diff --git a/web/htdocs/valuespec.py b/web/htdocs/valuespec.py
index 44fefcc..1e6ea41 100644
--- a/web/htdocs/valuespec.py
+++ b/web/htdocs/valuespec.py
@@ -874,7 +874,7 @@ class DropdownChoice(ValueSpec):
if val == value:
return
raise MKUserError(varprefix, _("Invalid value %s, must be in %s") %
- ", ".join([v for (v,t) in self.choices()]))
+ (value, ", ".join([v for (v,t) in self.choices()])))
# Special conveniance variant for monitoring states
@@ -1606,6 +1606,7 @@ class Alternative(ValueSpec):
else:
checked = vs == mvs
+ html.help(vs.help())
title = vs.title()
if not title and nr:
html.write(" ")
Module: check_mk
Branch: master
Commit: e7ad89375a3c2c205c912e11069eb43e3b0c755a
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=e7ad89375a3c2c…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Thu Nov 8 10:24:53 2012 +0100
Fix complain code in certain ValueSpecs
---
web/htdocs/valuespec.py | 48 ++++++++++++++++++++++++++++++++--------------
1 files changed, 33 insertions(+), 15 deletions(-)
diff --git a/web/htdocs/valuespec.py b/web/htdocs/valuespec.py
index 5da0caa..44fefcc 100644
--- a/web/htdocs/valuespec.py
+++ b/web/htdocs/valuespec.py
@@ -624,17 +624,12 @@ class ListOf(ValueSpec):
# of entries is stored in the hidden variable 'varprefix'
def render_input(self, varprefix, value):
- # In the 'complain' phase, where the user already saved the
- # form but the validation failed, we must not display the
- # original 'value' but take the value from the HTML variables.
- if html.has_var("%s_count" % varprefix):
- value = self.from_html_vars(varprefix)
-
- html.hidden_field('%s_count' % varprefix,
- str(len(value)),
- id = '%s_count' % varprefix,
- add_var = True
- )
+ # Beware: the 'value' is only the default value in case the form
+ # has not yet been filled in. In the complain phase we must
+ # ignore 'value' but reuse the input from the HTML variables -
+ # even if they are not syntactically correct. Calling from_html_vars
+ # here is *not* an option since this might not work in case of
+ # a wrong user input.
# Render reference element for cloning
html.write('<table style="display:none" id="%s_prototype">' % varprefix)
@@ -650,10 +645,25 @@ class ListOf(ValueSpec):
self._valuespec.default_value())
html.write('</td></tr></table>')
+ # In the 'complain' phase, where the user already saved the
+ # form but the validation failed, we must not display the
+ # original 'value' but take the value from the HTML variables.
+ if html.has_var("%s_count" % varprefix):
+ filled_in = True
+ count = int(html.var("%s_count" % varprefix))
+ value = [None] * count # dummy for the loop
+ else:
+ filled_in = False
+ html.hidden_field('%s_count' % varprefix,
+ str(len(value)),
+ id = '%s_count' % varprefix,
+ add_var = True
+ )
+
# Actual table of currently existing entries
html.write('<table class="valuespec_listof" id="%s_table">' % varprefix)
- for nr, v in enumerate(value):
+ for nr, v in enumerate(value):
html.push_transformation(lambda x: x.replace(self._magic, str(nr+1)))
html.write('<tr><td class=vlof_buttons>')
html.hidden_field(varprefix + "_indexof_%d" % (nr+1), "") # reconstruct order after moving stuff
@@ -1766,6 +1776,8 @@ class Dictionary(ValueSpec):
self._headers = kwargs.get("headers")
def render_input(self, varprefix, value):
+ if type(value) != dict:
+ value = {} # makes code simpler in complain phase
if self._render == "form":
self.render_input_form(varprefix, value)
else:
@@ -1807,7 +1819,13 @@ class Dictionary(ValueSpec):
div_id, not visible and "none" or (oneline and "inline-block" or "")))
if self._columns == 1:
html.help(vs.help())
- vs.render_input(vp, value.get(param, vs.default_value()))
+ # Remember: in complain mode we do not render 'value' (the default value),
+ # but re-display the values from the HTML variables. We must not use 'value'
+ # in that case.
+ if type(value) == dict:
+ vs.render_input(vp, value.get(param, vs.default_value()))
+ else:
+ vs.render_input(vp, None)
html.write("</div>")
if not oneline:
html.write("</td></tr>")
@@ -2010,9 +2028,9 @@ class Foldable(ValueSpec):
self._title_function = kwargs.get("title_function", None)
def render_input(self, varprefix, value):
- if self._title_function:
+ try:
title = self._title_function(value)
- else:
+ except:
title = self._valuespec.title()
if not title:
title = _("(no title)")
Module: check_mk
Branch: master
Commit: 8b3971990af634c254289085ed62e447c867a30d
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=8b3971990af634…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Thu Nov 8 10:26:29 2012 +0100
Notifications editable by user himself
---
web/htdocs/default_permissions.py | 7 +++++++
web/htdocs/wato.py | 26 ++++++++++++++++++++++----
2 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/web/htdocs/default_permissions.py b/web/htdocs/default_permissions.py
index 2a51b64..d2c3a4c 100644
--- a/web/htdocs/default_permissions.py
+++ b/web/htdocs/default_permissions.py
@@ -111,6 +111,13 @@ def load():
[ 'admin', 'user' ]
)
+ config.declare_permission('general.edit_notifications',
+ _('Edit personal notification settings'),
+ _('This allows a user to edit his personal notification settings. You also need the permission '
+ '<i>Edit the user profile</i> in order to do this.'),
+ [ 'admin', 'user' ]
+ )
+
config.declare_permission('general.change_password',
_('Edit the user password'),
_('Permits the user to change the password.'),
diff --git a/web/htdocs/wato.py b/web/htdocs/wato.py
index 174f78b..cd017b5 100644
--- a/web/htdocs/wato.py
+++ b/web/htdocs/wato.py
@@ -11027,6 +11027,10 @@ def page_user_profile():
# load the new language
load_language(config.get_language())
+ if config.may('general.edit_notifications'):
+ value = forms.get_input(vs_notification_method, "notification_method")
+ users[config.user_id]["notification_method"] = value
+
# Change the password if requested
if config.may('general.change_password'):
password = html.var('password')
@@ -11059,15 +11063,19 @@ def page_user_profile():
if html.has_user_errors():
html.show_user_errors()
+ users = load_users()
+ user = users.get(config.user_id)
+ if user == None:
+ html.warning(_("Sorry, your user account does not exist."))
+ html.footer()
+ return
+
html.begin_form("profile", method="POST")
html.write('<div class=wato>')
forms.header(_("Personal Settings"))
forms.section(_("Name"), simple=True)
- html.write(config.user_id)
-
- if config.may('general.edit_profile'):
- select_language(config.get_language(''))
+ html.write(user["alias"])
if config.may('general.change_password'):
forms.section(_("Password"))
@@ -11076,6 +11084,16 @@ def page_user_profile():
forms.section(_("Password confirmation"))
html.password_input('password2')
+ if config.may('general.edit_profile'):
+ select_language(config.get_language(''))
+ # Let the user configure how he wants to be notified
+ if config.may('general.edit_notifications') and user.get("notifications_enabled"):
+ forms.section(_("Notifications"))
+ html.help(_("Here you can configure how you want to be notified about host and service problems and "
+ "other monitoring events."))
+ vs_notification_method.render_input("notification_method", user.get("notification_method"))
+ # forms.input(vs_notification_method, "notification_method", user.get("notification_method"))
+
# Save button
forms.end()
html.button("_save", _("Save"))