Module: check_mk
Branch: master
Commit: fe0bc46c04819af37a81c5c1608f3be71ccfa0b2
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=fe0bc46c04819a…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Sat Jan 21 19:02:09 2012 +0100
New valuespec for relative date
---
web/htdocs/valuespec.py | 104 ++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 93 insertions(+), 11 deletions(-)
diff --git a/web/htdocs/valuespec.py b/web/htdocs/valuespec.py
index b7bca58..5067b51 100644
--- a/web/htdocs/valuespec.py
+++ b/web/htdocs/valuespec.py
@@ -165,6 +165,7 @@ class Age(ValueSpec):
if type(value) != int:
raise MKUserError(varprefix, _("The value has type %s, but must be of
type int") % (type(value)))
+
# Editor for a single integer
class Integer(ValueSpec):
def __init__(self, **kwargs):
@@ -729,6 +730,83 @@ class OptionalDropdownChoice(ValueSpec):
self._explicit.validate_datatype(self, value, varprefix + "_ex")
+# Input of date with optimization for nearby dates
+# in the future. Useful for example for alarms. The
+# date is represented by a UNIX timestamp where the
+# seconds are silently ignored.
+def round_date(t):
+ return int(t) / seconds_per_day * seconds_per_day
+
+def today():
+ return round_date(time.time())
+
+seconds_per_day = 86400
+
+weekdays = {
+ 0: _("Monday"),
+ 1: _("Tuesday"),
+ 2: _("Wednesday"),
+ 3: _("Thursday"),
+ 4: _("Friday"),
+ 5: _("Saturday"),
+ 6: _("Sunday"),
+}
+
+class RelativeDate(OptionalDropdownChoice):
+
+ def __init__(self, **kwargs):
+ ValueSpec.__init__(self, **kwargs)
+ self._choices = [
+ (0, _("today")),
+ (1, _("tomorrow"))]
+ weekday = time.localtime(today()).tm_wday
+ for w in range(2, 7):
+ wd = (weekday + w) % 7
+ self._choices.append((w, weekdays[wd]))
+ for w in range(0, 7):
+ wd = (weekday + w) % 7
+ if w < 2:
+ title = _(" next week")
+ else:
+ title = _(" in %d days") % (w + 7)
+ self._choices.append((w + 7, weekdays[wd] + title))
+ self._explicit = Integer()
+ self._otherlabel = _("in ... days")
+
+
+ def canonical_value(self):
+ return today()
+
+ def render_input(self, varprefix, value):
+ reldays = (round_date(value) - today()) / seconds_per_day
+ OptionalDropdownChoice.render_input(self, varprefix, reldays)
+
+ def value_to_text(self, value):
+ reldays = (round_date(value) - today()) / seconds_per_day
+ if reldays == -1:
+ return _("Yesterday")
+ elif reldays == -2:
+ return _("two days ago")
+ elif reldays < 0:
+ return _("%d days ago") % -reldays
+ elif reldays < len(self._choices):
+ return self._choices[reldays][1]
+ else:
+ return _("in %d days") % reldays
+
+ def from_html_vars(self, varprefix):
+ reldays = OptionalDropdownChoice.from_html_vars(self, varprefix)
+ return today() + reldays * seconds_per_day
+
+ def validate_datatype(self, value, varprefix):
+ if type(value) not in [ float, int ]:
+ raise MKUserError(varprefix, _("Date must be a number value"))
+
+ def validate_value(self, value, varprefix):
+ pass
+
+
+
# Make a configuration value optional, i.e. it may be None.
# The user has a checkbox for activating the option. Example:
@@ -751,31 +829,35 @@ class Optional(ValueSpec):
checked = html.get_checkbox(varprefix + "_use")
else:
checked = self._negate != (value != None)
- html.write("<div style=\"float: none;\">")
- html.checkbox(varprefix + "_use" , checked,
- onclick="valuespec_toggle_option(this, %r, %r)" %
- (div_id, self._negate and 1 or 0))
+ html.write("<span>")
+
if self._label:
- html.write(self._label)
+ label = self._label
elif self.title():
- html.write(_(self.title()))
+ label = _(self.title())
elif self._negate:
- html.write(_(" Ignore this option"))
+ label = _(" Ignore this option")
else:
- html.write(_(" Activate this option"))
+ label = _(" Activate this option")
+
+ html.checkbox(varprefix + "_use" , checked,
+ onclick="valuespec_toggle_option(this, %r, %r)" %
+ (div_id, self._negate and 1 or 0),
+ label = label)
+
if self._sameline:
html.write(" ")
else:
html.write("<br><br>")
- html.write("</div>")
- html.write('<div id="%s" style="float: left; display:
%s">' % (
+ html.write("</span>")
+ html.write('<span id="%s" display: %s">' % (
div_id, checked == self._negate and "none" or ""))
if value == None:
value = self._valuespec.default_value()
if self._valuespec.title():
html.write(self._valuespec.title() + " ")
self._valuespec.render_input(varprefix + "_value", value)
- html.write('</div>\n')
+ html.write('</span>\n')
def value_to_text(self, value):
if value == None: