def _show_try_form(self): html.begin_form('try') forms.header(_('Try Pattern Match')) forms.section(_('Hostname')) self._vs_host().render_input("host", self._hostname) forms.section(_('Logfile')) html.help(_('Here you need to insert the original file or pathname')) html.text_input('file', size=80) forms.section(_('Text to match')) html.help( _('You can insert some text (e.g. a line of the logfile) to test the patterns defined ' 'for this logfile. All patterns for this logfile are listed below. Matching patterns ' 'will be highlighted after clicking the "Try out" button.')) html.text_input('match', cssclass='match', size=100) forms.end() html.button('_try', _('Try out')) html.request.del_var('folder') # Never hand over the folder here html.hidden_fields() html.end_form()
def _render_bulk_move_form(self) -> str: with html.plugged(): choices = self._folder.choices_for_moving_host() if not choices: return "" choices.insert(0, ("@", _("(select target folder)"))) html.dropdown( "_bulk_moveto", choices, deflt="@", label=_("Move to folder:"), onchange="cmk.selection.update_bulk_moveto(this.value)", class_='bulk_moveto', form="form_hosts") html.button("_bulk_move", _("Move"), form="form_hosts") return html.drain()
def page(self): html.begin_form("random") forms.header(_("Create Random Hosts")) forms.section(_("Number to create")) html.write_text("%s: " % _("Hosts to create in each folder")) html.text_input("count", default_value="10", cssclass="number") html.set_focus("count") html.br() html.write_text("%s: " % _("Number of folders to create in each level")) html.text_input("folders", default_value="10", cssclass="number") html.br() html.write_text("%s: " % _("Levels of folders to create")) html.text_input("levels", default_value="1", cssclass="number") forms.end() html.button("start", _("Start!"), "submit") html.hidden_fields() html.end_form()
def _show_try_form(self): html.begin_form("try") forms.header(_("Try Pattern Match")) forms.section(_("Hostname")) self._vs_host().render_input("host", self._hostname) forms.section(_("Logfile")) html.help(_("Here you need to insert the original file or pathname")) html.text_input("file", size=80) forms.section(_("Text to match")) html.help( _("You can insert some text (e.g. a line of the logfile) to test the patterns defined " "for this logfile. All patterns for this logfile are listed below. Matching patterns " 'will be highlighted after clicking the "Try out" button.')) html.text_input("match", cssclass="match", size=100) forms.end() html.button("_try", _("Try out")) request.del_var("folder") # Never hand over the folder here html.hidden_fields() html.end_form()
def render_page_confirm(acktime, prev_url, failed_notifications): title = _("Confirm failed notifications") breadcrumb = make_simple_page_breadcrumb(mega_menu_registry.menu_monitoring(), title) html.header(title, breadcrumb) if failed_notifications: html.open_div(class_="really") html.write_text( _("Do you really want to acknowledge all failed notifications up to %s?") % cmk.utils.render.date_and_time(acktime)) html.begin_form("confirm", method="GET", action=prev_url) html.hidden_field('acktime', acktime) html.button('_confirm', _("Yes")) html.end_form() html.close_div() render_notification_table(failed_notifications) html.footer()
def confirm_with_preview(msg: Union[str, HTML], confirm_options: List[Tuple[str, str]], method: str = "POST") -> Optional[bool]: """Show a confirm dialog to the user BE AWARE: In case you just want to have some action confirmed by the user, you should use the javascript powere confirm dialg (make_confirm, add_confirm_on_submit, ...). This method is used only in places where we explicitly need to show important information to the user before he can decide whether or not to confirm the action. The confirm dialog is normally not a dialog which need to be protected by a transid itselfs. It is only a intermediate step to the real action But there are use cases where the confirm dialog is used during rendering a normal page, for example when deleting a dashlet from a dashboard. In such cases, the transid must be added by the confirm dialog. """ if html.request.var("_do_actions") == _("Cancel"): # User has pressed "Cancel", now invalidate the unused transid html.check_transaction() return None # None --> "Cancel" if not any( [html.request.has_var(varname) for _title, varname in confirm_options]): if html.mobile: html.open_center() html.open_div(class_="really") html.write_text(msg) html.begin_form("confirm", method=method, add_transid=False) html.hidden_fields(add_action_vars=True) for title, varname in confirm_options: html.button(varname, title, "really") html.button("_do_actions", _("Cancel")) html.end_form() html.close_div() if html.mobile: html.close_center() return False # False --> "Dialog shown, no answer yet" # Now check the transaction. True: "Yes", None --> Browser reload of "yes" page return True if html.check_transaction() else None
def _host_bulk_move_to_folder_combo(self, top): choices = self._folder.choices_for_moving_host() if not choices: return choices.insert(0, ("@", _("(select target folder)"))) html.button("_bulk_move", _("Move to:")) html.write(" ") field_name = 'bulk_moveto' if top: field_name = '_top_bulk_moveto' if html.request.has_var('bulk_moveto'): html.javascript('cmk.selection.update_bulk_moveto("%s")' % html.request.var('bulk_moveto', '')) html.dropdown(field_name, choices, deflt="@", onchange="cmk.selection.update_bulk_moveto(this.value)", class_='bulk_moveto')
def render(self, what): html.button("_acknowledge", _("Acknowledge")) html.button("_remove_ack", _("Remove Acknowledgement")) html.hr() html.checkbox("_ack_sticky", config.view_action_defaults["ack_sticky"], label=_("sticky")) html.checkbox("_ack_notify", config.view_action_defaults["ack_notify"], label=_("send notification")) html.checkbox("_ack_persistent", config.view_action_defaults["ack_persistent"], label=_('persistent comment')) html.hr() self._vs_expire().render_input("_ack_expire", config.view_action_defaults.get("ack_expire", 0)) html.help( _("Note: Expiration of acknowledgements only works when using the Checkmk Micro Core.")) html.hr() html.write_text(_("Comment") + ": ") html.text_input("_ack_comment", size=48, submit="_acknowledge")
def page(self): hosts = get_hosts_from_checkboxes() html.p( _("You have selected <b>%d</b> hosts for bulk cleanup. This means removing " "explicit attribute values from hosts. The hosts will then inherit attributes " "configured at the host list or folders or simply fall back to the builtin " "default values.") % len(hosts)) html.begin_form("bulkcleanup", method="POST") forms.header(_("Attributes to remove from hosts")) if not self._select_attributes_for_bulk_cleanup(hosts): forms.end() html.write_text( _("The selected hosts have no explicit attributes")) else: forms.end() html.button("_save", _("Save & Finish")) html.hidden_fields() html.end_form()
def page(self): self._folder.show_breadcrump() # Show search form html.begin_form("edit_host", method="GET") html.prevent_password_auto_completion() forms.header(_("General Properties")) forms.section(_("Hostname")) html.text_input("host_search_host") html.set_focus("host_search_host") # Attributes configure_attributes(False, {}, "host_search", parent=None, varprefix="host_search_") # Button forms.end() html.button("_local", _("Search in %s") % self._folder.title(), "submit") html.hidden_field("host_search", "1") html.hidden_fields() html.end_form()
def inpage_search_form(mode: Optional[str] = None, default_value: str = "") -> None: form_name = "inpage_search_form" reset_button_id = "%s_reset" % form_name was_submitted = request.get_ascii_input("filled_in") == form_name html.begin_form(form_name, add_transid=False) html.text_input("search", size=32, default_value=default_value, placeholder=_("Filter"), required=True, title="") html.hidden_fields() if mode: html.hidden_field("mode", mode, add_var=True) reset_url = request.get_ascii_input_mandatory("reset_url", requested_file_with_query(request)) html.hidden_field("reset_url", reset_url, add_var=True) html.button("submit", "", cssclass="submit", help_=_("Apply")) html.buttonlink(reset_url, "", obj_id=reset_button_id, title=_("Reset")) html.end_form() html.javascript("cmk.page_menu.inpage_search_init(%s, %s)" % (json.dumps(reset_button_id), json.dumps(was_submitted)))
def page_login() -> None: title = _("Checkmk Mobile") mobile_html_head(title) jqm_page_header(title, id_="login") html.div(_("Welcome to Checkmk Mobile."), id_="loginhead") html.begin_form("login", method="POST", add_transid=False) # Keep information about original target URL default_origtarget = ("index.py" if requested_file_name(request) in ["login", "logout"] else makeuri(request, [])) origtarget = request.get_url_input("_origtarget", default_origtarget) html.hidden_field("_origtarget", escaping.escape_attribute(origtarget)) html.text_input("_username", label=_("Username:"******"username", id_="input_user") html.password_input( "_password", size=None, label=_("Password:"******"current-password", id_="input_pass", ) html.br() html.button("_login", _("Login")) html.set_focus("_username") html.end_form() html.open_div(id_="loginfoot") html.img("themes/facelift/images/logo_cmk_small.png", class_="logomk") html.div( HTML( _('© <a target="_blank" href="https://checkmk.com">tribe29 GmbH</a>' )), class_="copyright", ) html.close_div() # close content-div html.close_div() html.close_div() # close page-div mobile_html_foot()
def page(self): # type: () -> None host_names = get_hostnames_from_checkboxes() hosts = { host_name: watolib.Folder.current().host(host_name) for host_name in host_names } current_host_hash = sha256(six.ensure_binary(repr(hosts))).hexdigest() # When bulk edit has been made with some hosts, then other hosts have been selected # and then another bulk edit has made, the attributes need to be reset before # rendering the form. Otherwise the second edit will have the attributes of the # first set. host_hash = html.request.var("host_hash") if not host_hash or host_hash != current_host_hash: html.request.del_vars(prefix="attr_") html.request.del_vars(prefix="bulk_change_") html.p("%s%s %s" % ( _("You have selected <b>%d</b> hosts for bulk edit. You can now change " "host attributes for all selected hosts at once. ") % len(hosts), _("If a select is set to <i>don't change</i> then currenty not all selected " "hosts share the same setting for this attribute. " "If you leave that selection, all hosts will keep their individual settings." ), _("In case you want to <i>unset</i> attributes on multiple hosts, you need to " "use the <i>bulk cleanup</i> action instead of bulk edit."))) html.begin_form("edit_host", method="POST") html.prevent_password_auto_completion() html.hidden_field("host_hash", current_host_hash) configure_attributes(False, hosts, "bulk", parent=watolib.Folder.current()) forms.end() html.button("_save", _("Save & Finish")) html.hidden_fields() html.end_form()
def page(self): html.h3(_("Upload Icon")) html.p(_("Allowed are single PNG image files with a maximum size of 80x80 px.")) html.begin_form('upload_form', method='POST') self._vs_upload().render_input('_upload_icon', None) html.button('_do_upload', _('Upload'), 'submit') html.hidden_fields() html.end_form() icons = sorted(self._load_custom_icons().items()) with table_element("icons", _("Custom Icons")) as table: for icon_name, category_name in icons: table.row() table.cell(_("Actions"), css="buttons") delete_url = make_action_link([("mode", "icons"), ("_delete", icon_name)]) html.icon_button(delete_url, _("Delete this Icon"), "delete") table.cell(_("Icon"), html.render_icon(icon_name), css="buttons") table.text_cell(_("Name"), icon_name) table.text_cell(_("Category"), IconSelector.category_alias(category_name))
def page(self) -> None: html.begin_form("group") forms.header(_("Properties")) forms.section(_("Name"), simple=not self._new) html.help( _("The name of the group is used as an internal key. It cannot be " "changed later. It is also visible in the status GUI.")) if self._new: html.text_input("name") html.set_focus("name") else: html.write_text(self._name) html.set_focus("alias") forms.section(_("Alias")) html.help(_("An Alias or description of this group.")) html.text_input("alias", self.group["alias"]) self._show_extra_page_elements() forms.end() html.button("save", _("Save")) html.hidden_fields() html.end_form()
def render(self, what): html.button("_enable_notifications", _("Enable")) html.button("_disable_notifications", _("Disable"))
def _bulk_actions(self, table, at_least_one_imported, top, withsearch, colspan, show_checkboxes): table.row(collect_headers=False, fixed=True) table.cell(css="bulksearch", colspan=3) if not show_checkboxes: onclick_uri = html.makeuri([('show_checkboxes', '1'), ('selection', weblib.selection_id())]) checkbox_title = _('Show Checkboxes and bulk actions') else: onclick_uri = html.makeuri([('show_checkboxes', '0')]) checkbox_title = _('Hide Checkboxes and bulk actions') html.toggle_button("checkbox_on", show_checkboxes, "checkbox", title=checkbox_title, onclick="location.href=\'%s\'" % onclick_uri, is_context_button=False) if withsearch: html.text_input("search") html.button("_search", _("Search")) html.set_focus("search") table.cell(css="bulkactions", colspan=colspan - 3) html.write_text(' ' + _("Selected hosts:\n")) if not self._folder.locked_hosts(): if config.user.may("wato.manage_hosts"): html.button("_bulk_delete", _("Delete")) if config.user.may("wato.edit_hosts"): html.button("_bulk_edit", _("Edit")) html.button("_bulk_cleanup", _("Cleanup")) if config.user.may("wato.services"): html.button("_bulk_inventory", _("Discovery")) if not self._folder.locked_hosts(): if config.user.may("wato.parentscan"): html.button("_parentscan", _("Parentscan")) if config.user.may("wato.edit_hosts") and config.user.may( "wato.move_hosts"): self._host_bulk_move_to_folder_combo(top) if at_least_one_imported: html.button("_bulk_movetotarget", _("Move to Target Folders"))
def page(self): # TODO: remove subclass specific things specifict things (everything with _type == 'user') html.begin_form("attr") forms.header(_("Properties")) forms.section(_("Name"), simple=not self._new) html.help( _("The name of the attribute is used as an internal key. It cannot be " "changed later.")) if self._new: html.text_input("name", self._attr.get('name')) html.set_focus("name") else: html.write_text(self._name) html.set_focus("title") forms.section(_("Title") + "<sup>*</sup>") html.help(_("The title is used to label this attribute.")) html.text_input("title", self._attr.get('title')) forms.section(_('Topic')) html.help( _('The attribute is added to this section in the edit dialog.')) html.dropdown('topic', self._topics, deflt=self._attr.get('topic', self._default_topic)) forms.section(_('Help Text') + "<sup>*</sup>") html.help( _('You might want to add some helpful description for the attribute.' )) html.text_area('help', self._attr.get('help', '')) forms.section(_('Data type')) html.help(_('The type of information to be stored in this attribute.')) if self._new: html.dropdown('type', custom_attr_types(), deflt=self._attr.get('type')) else: html.write(dict(custom_attr_types())[self._attr.get('type')]) self._add_extra_form_sections() forms.section(_('Show in WATO host table')) html.help( _('This attribute is only visibile on the edit host and folder pages by default, but ' 'you can also make it visible in the host overview tables of WATO.' )) html.checkbox( 'show_in_table', self._attr.get('show_in_table', False), label=_( "Show the setting of the attribute in the WATO host list table" )) forms.section(_('Add to monitoring configuration')) html.help(self._macro_help) html.checkbox('add_custom_macro', self._attr.get('add_custom_macro', False), label=self._macro_label) forms.end() html.show_localization_hint() html.button("save", _("Save")) html.hidden_fields() html.end_form()
def render(self, what): html.button("_resched_checks", _("Reschedule")) html.write_text(" " + _("and spread over") + " ") html.number_input("_resched_spread", 0, size=3) html.write_text(" " + _("minutes") + " ")
def edit_dictionaries( dictionaries, # type: List[Tuple[str, Union[Transform, Dictionary]]] value, # type: Dict[str, Any] focus=None, # type: Optional[str] hover_help=True, # type: bool validate=None, # type: Optional[Callable[[Any], None]] buttontext=None, # type: Optional[Text] title=None, # type: Optional[Text] buttons=None, # type: List[Tuple[str, Text, str]] method="GET", # type: str preview=False, # type: bool varprefix="", # type: str formname="form", # type: str consume_transid=True # type: bool ): if html.request.get_ascii_input( "filled_in") == formname and html.transaction_valid(): if not preview and consume_transid: html.check_transaction() messages = [] # type: List[Text] new_value = {} # type: Dict[str, Dict[str, Any]] for keyname, vs_dict in dictionaries: dict_varprefix = varprefix + keyname new_value[keyname] = {} try: edited_value = vs_dict.from_html_vars(dict_varprefix) vs_dict.validate_value(edited_value, dict_varprefix) new_value[keyname].update(edited_value) except MKUserError as e: messages.append("%s: %s" % (vs_dict.title() or _("Properties"), e)) html.add_user_error(e.varname, e) except Exception as e: messages.append("%s: %s" % (vs_dict.title() or _("Properties"), e)) html.add_user_error(None, e) if validate and not html.has_user_errors(): try: validate(new_value[keyname]) except MKUserError as e: messages.append("%s" % e) html.add_user_error(e.varname, e) if messages: messages_joined = "".join(["%s<br>\n" % m for m in messages]) if not preview: html.show_error(messages_joined) else: raise MKUserError(None, messages_joined) else: return new_value html.begin_form(formname, method=method) for keyname, vs_dict in dictionaries: dict_varprefix = varprefix + keyname subvalue = value.get(keyname, {}) vs_dict.render_input_as_form(dict_varprefix, subvalue) end() if buttons: for name, button_title, _icon in buttons: html.button(name, button_title) else: if buttontext is None: buttontext = _("Save") html.button("save", buttontext) # Should be ignored be hidden_fields, but I do not dare to change it there html.request.del_var("filled_in") html.hidden_fields() html.end_form()
def render(self, what): html.write_text(_('Downtime Comment') + ": ") html.text_input("_down_comment", "", size=60, submit="") html.hr() html.button("_down_from_now", _("From now for")) html.nbsp() html.number_input("_down_minutes", 60, size=4, submit="_down_from_now") html.write_text(" " + _("minutes")) html.hr() for time_range in config.user_downtime_timeranges: html.button("_downrange__%s" % time_range['end'], _u(time_range['title'])) if what != "aggr" and config.user.may("action.remove_all_downtimes"): html.write_text(" - ") html.button("_down_remove", _("Remove all")) html.hr() if config.adhoc_downtime and config.adhoc_downtime.get("duration"): adhoc_duration = config.adhoc_downtime.get("duration") adhoc_comment = config.adhoc_downtime.get("comment", "") html.button("_down_adhoc", _("Adhoc for %d minutes") % adhoc_duration) html.nbsp() html.write_text(_('with comment') + ": ") html.write(adhoc_comment) html.hr() html.button("_down_custom", _("Custom time range")) html.datetime_input("_down_from", time.time(), submit="_down_custom") html.write_text(" " + _('to') + " ") html.datetime_input("_down_to", time.time() + 7200, submit="_down_custom") html.hr() html.checkbox("_down_flexible", False, label="%s " % _('flexible with max. duration')) html.time_input("_down_duration", 2, 0) html.write_text(" " + _('(HH:MM)')) if what == "host": html.hr() html.checkbox("_include_childs", False, label=_('Also set downtime on child hosts')) html.write_text(" ") html.checkbox("_include_childs_recurse", False, label=_('Do this recursively')) elif what == "service": html.hr() html.checkbox("_on_hosts", False, label=_('Schedule downtimes on the affected ' '<b>hosts</b> instead of on the individual ' 'services')) if self._has_recurring_downtimes(): html.hr() html.checkbox( "_down_do_recur", False, label=_("Repeat this downtime on a regular basis every")) html.write_text(" ") from cmk.gui.cee.plugins.wato.cmc import recurring_downtimes_types recurring_selections = [ (str(k), v) for (k, v) in sorted(recurring_downtimes_types().items()) ] html.dropdown("_down_recurring", recurring_selections, deflt="3") html.write_text(_("(This only works when using CMC)"))
def render(self, what): html.write_text(_('Comment') + ": ") html.text_input("_comment", size=33, submit="_add_comment") html.write_text(" ") html.button("_add_comment", _("Add comment"))
def render(self, what): html.button("_star", _("Add to Favorites")) html.button("_unstar", _("Remove from Favorites"))
def edit_annotation(): site_id = html.request.var("anno_site") or "" hostname = html.request.get_str_input_mandatory("anno_host") service = html.request.var("anno_service") or None fromtime = html.request.get_float_input_mandatory("anno_from") untiltime = html.request.get_float_input_mandatory("anno_until") site_host_svc = (site_id, hostname, service) # Find existing annotation with this specification annotations = availability.load_annotations() annotation = availability.find_annotation(annotations, site_host_svc, fromtime, untiltime) if annotation: value = annotation.copy() else: value = { "from": fromtime, "until": untiltime, "text": "", } value["host"] = hostname value["service"] = service value["site"] = site_id if html.check_transaction(): try: vs = _vs_annotation() value = vs.from_html_vars("_editanno") vs.validate_value(value, "_editanno") site_host_svc = (value["site"], value["host"], value["service"]) del value["site"] del value["host"] value["date"] = time.time() value["author"] = config.user.id availability.update_annotations(site_host_svc, value, replace_existing=annotation) html.request.del_var("filled_in") return False except MKUserError as e: html.user_error(e) title = _("Edit annotation of ") + hostname if service: title += "/" + service html.body_start(title) html.top_heading(title) html.begin_context_buttons() html.context_button(_("Abort"), html.makeuri([("anno_host", "")]), "abort") html.end_context_buttons() html.begin_form("editanno", method="GET") _vs_annotation().render_input_as_form("_editanno", value) html.button("save", _("Save")) html.hidden_fields() html.end_form() html.bottom_footer() html.body_end() return True
def _show_login_page(self) -> None: html.set_render_headfoot(False) html.add_body_css_class("login") html.header(config.get_page_heading(), Breadcrumb(), javascripts=[]) default_origtarget = ("index.py" if html.myfile in ["login", "logout"] else makeuri(global_request, [])) origtarget = html.get_url_input("_origtarget", default_origtarget) # Never allow the login page to be opened in the iframe. Redirect top page to login page. # This will result in a full screen login page. html.javascript('''if(top != self) { window.top.location.href = location; }''') # When someone calls the login page directly and is already authed redirect to main page if html.myfile == 'login' and _check_auth(html.request): raise HTTPRedirect(origtarget) html.open_div(id_="login") html.open_div(id_="login_window") html.div("" if "hide_version" in config.login_screen else cmk_version.__version__, id_="version") html.begin_form("login", method='POST', add_transid=False, action='login.py') html.hidden_field('_login', '1') html.hidden_field('_origtarget', origtarget) html.label("%s:" % _('Username'), id_="label_user", class_=["legend"], for_="_username") html.br() html.text_input("_username", id_="input_user") html.label("%s:" % _('Password'), id_="label_pass", class_=["legend"], for_="_password") html.br() html.password_input("_password", id_="input_pass", size=None) if html.has_user_errors(): html.open_div(id_="login_error") html.show_user_errors() html.close_div() html.open_div(id_="button_text") html.button("_login", _('Login')) html.close_div() html.close_div() html.open_div(id_="foot") if config.login_screen.get("login_message"): html.open_div(id_="login_message") html.show_message(config.login_screen["login_message"]) html.close_div() footer: List[Union[HTML, str]] = [] for title, url, target in config.login_screen.get("footer_links", []): footer.append(html.render_a(title, href=url, target=target)) if "hide_version" not in config.login_screen: footer.append("Version: %s" % cmk_version.__version__) footer.append("© %s" % html.render_a( "tribe29 GmbH", href="https://checkmk.com", target="_blank")) html.write(HTML(" - ").join(footer)) if cmk_version.is_raw_edition(): html.br() html.br() html.write( _('You can use, modify and distribute Check_MK under the terms of the <a href="%s" target="_blank">' 'GNU GPL Version 2</a>.') % "https://checkmk.com/gpl.html") html.close_div() html.set_focus('_username') html.hidden_fields() html.end_form() html.close_div() html.footer()
def render(self, what): html.button("_enable_passive_checks", _("Enable")) html.button("_disable_passive_checks", _("Disable"))
def _write_table(self, rows: TableRows, num_rows_unlimited: int, actions_enabled: bool, actions_visible: bool, search_term: Optional[str]) -> None: headinfo = _("1 row") if len( rows) == 1 else _("%d rows") % num_rows_unlimited html.javascript("cmk.utils.update_header_info(%s);" % json.dumps(headinfo)) table_id = self.id num_cols = self._get_num_cols(rows) empty_columns = self._get_empty_columns(rows, num_cols) if self.options["omit_empty_columns"]: num_cols -= len([v for v in empty_columns if v]) html.open_table(class_=["data", "oddeven", self.css]) # If we have no group headers then paint the headers now if self.rows and not isinstance(self.rows[0], GroupHeader): self._render_headers( actions_enabled, actions_visible, empty_columns, ) if actions_enabled and actions_visible: html.open_tr(class_=["data", "even0", "actions"]) html.open_td(colspan=num_cols) if not html.in_form(): html.begin_form("%s_actions" % table_id) if self.options["searchable"]: html.open_div(class_="search") html.text_input("_%s_search" % table_id) html.button("_%s_submit" % table_id, _("Search")) html.button("_%s_reset" % table_id, _("Reset search")) html.set_focus("_%s_search" % table_id) html.close_div() if html.request.has_var('_%s_sort' % table_id): html.open_div(class_=["sort"]) html.button("_%s_reset_sorting" % table_id, _("Reset sorting")) html.close_div() if not html.in_form(): html.begin_form("%s_actions" % table_id) html.hidden_fields() html.end_form() html.close_tr() for nr, row in enumerate(rows): # Intermediate header if isinstance(row, GroupHeader): # Show the header only, if at least one (non-header) row follows if nr < len(rows) - 1 and not isinstance( rows[nr + 1], GroupHeader): html.open_tr(class_="groupheader") html.open_td(colspan=num_cols) html.open_h3() html.write(row.title) html.close_h3() html.close_td() html.close_tr() self._render_headers(actions_enabled, actions_visible, empty_columns) continue oddeven_name = "even" if (nr - 1) % 2 == 0 else "odd" class_ = ["data", "%s%d" % (oddeven_name, row.state)] if row.css: class_.append(row.css) else: for k in ["class_", "class"]: if k in row.row_attributes: cls_spec = cast(CSSSpec, row.row_attributes.pop(k)) if isinstance(cls_spec, list): class_.extend( [c for c in cls_spec if c is not None]) elif cls_spec is not None: class_.append(cls_spec) html.open_tr(class_=class_, **row.row_attributes) for col_index, cell in enumerate(row.cells): if self.options["omit_empty_columns"] and empty_columns[ col_index]: continue html.open_td(class_=cell.css, colspan=cell.colspan) html.write(cell.content) html.close_td() html.close_tr() if not rows and search_term: html.open_tr(class_=["data", "odd0", "no_match"]) html.td( _('Found no matching rows. Please try another search term.'), colspan=num_cols) html.close_tr() html.close_table()
def render(self, what): html.button("_clear_modattr", _('Clear modified attributes'))
def page(self): html.begin_form("bulk_rename_host", method="POST") self._vs_renaming_config().render_input("", {}) html.button("_start", _("Bulk Rename")) html.hidden_fields() html.end_form()
def render(self, what): html.open_table() html.open_tr() html.open_td() html.write_text("%s: " % _("Plugin output")) html.close_td() html.open_td() html.text_input("_fake_output", "", size=50) html.close_td() html.close_tr() html.open_tr() html.open_td() html.write_text("%s: " % _("Performance data")) html.close_td() html.open_td() html.text_input("_fake_perfdata", "", size=50) html.close_td() html.close_tr() html.open_tr() html.open_td() html.write_text(_("Result:")) html.close_td() html.open_td() if what == "host": html.button("_fake_0", _("Up")) html.button("_fake_1", _("Down")) else: html.button("_fake_0", _("OK")) html.button("_fake_1", _("Warning")) html.button("_fake_2", _("Critical")) html.button("_fake_3", _("Unknown")) html.close_td() html.close_tr() html.close_table()