def _show_tree(self): td_style = None if self._wrap_texts == "wrap" else "white-space: nowrap;" tree = self._get_tree() depth = status_tree_depth(tree) leaves = self._gen_table(tree, depth, len(self._row["aggr_hosts"]) > 1) html.open_table(class_=["aggrtree", "ltr"]) odd = "odd" for code, colspan, parents in leaves: html.open_tr() leaf_td = HTMLWriter.render_td(code, class_=["leaf", odd], style=td_style, colspan=colspan) odd = "even" if odd == "odd" else "odd" tds = [leaf_td] for rowspan, c in parents: tds.append( HTMLWriter.render_td(c, class_=["node"], style=td_style, rowspan=rowspan)) if self._mirror: tds.reverse() html.write_html(HTML("").join(tds)) html.close_tr() html.close_table()
def _show_output_box(title: str, content: bytes) -> None: html.h3(title, class_="table") html.open_div(class_="log_output") html.write_html( HTML( escaping.escape_attribute( content.decode(errors="surrogateescape")).replace( "\n", "<br>").replace(" ", " "))) html.close_div()
def robotmk_report_page() -> cmk.gui.pages.PageResult: """Renders the content of the RobotMK html log file""" site_id, host_name, service_description = _get_mandatory_request_vars() report_type: str = request.get_str_input_mandatory("report_type") content = _get_html_from_livestatus(report_type, site_id, host_name, service_description) html_content = _get_cleaned_html_content(content[0].decode("utf-8")) html.write_html(html_content)
def _show_row_cells(self, table: Table, name: GroupName, group: GroupSpec) -> None: super()._show_row_cells(table, name, group) table.cell(_("Members")) html.write_html( HTML(", ").join([ HTMLWriter.render_a( alias, href=folder_preserving_link([("mode", "edit_user"), ("edit", userid)]), ) for userid, alias in self._members.get(name, []) ]))
def _show_subtree(self, tree, path, show_host): if self._is_leaf(tree): self._show_leaf(tree, show_host) return html.open_span(class_="title") is_empty = len(tree[3]) == 0 if is_empty: mc = None else: mc = self._get_mousecode(path) css_class = "open" if self._is_open(path) else "closed" with self._show_node(tree, show_host, mousecode=mc, img_class=css_class): if tree[2].get("icon"): html.write_html(html.render_icon(tree[2]["icon"])) html.write_text(" ") if tree[2].get("docu_url"): html.icon_button( tree[2]["docu_url"], _("Context information about this rule"), "url", target="_blank", ) html.write_text(" ") html.write_text(tree[2]["title"]) if not is_empty: html.open_ul( id_="%d:%s" % (self._expansion_level or 0, self._path_id(path)), class_=["subtree", css_class], ) if not self._omit_content(path): for node in tree[3]: if not node[2].get("hidden"): new_path = path + [node[2]["title"]] html.open_li() self._show_subtree(node, new_path, show_host) html.close_li() html.close_ul() html.close_span()
def jqm_page_index_topic_renderer(topic: str, items: Items) -> None: has_items_for_topic = any(i for i in items if i[0] == topic) if not has_items_for_topic: return html.p(topic) html.open_ul(**{"data-role": "listview", "data-inset": "true"}) for top, href, title in items: if top == topic: html.open_li() html.open_a(href=href, **{"data-ajax": "false", "data-transition": "flip"}) html.write_html(HTML(title)) html.close_a() html.close_li() html.close_ul()
def display(self, value: FilterHTTPVariables) -> None: actual_value = value.get(self._filter_range_config.column, self._filter_range_config.default) html.add_form_var(self._filter_range_config.column) html.write_html( HTML(f""" <input id={self._filter_range_config.column} name={self._filter_range_config.column} style="pointer-events: all; width: 80%%;" oninput="{self._update_label()}" type="range" step="{self._filter_range_config.step}" min="{self._filter_range_config.min}" max="{self._filter_range_config.max}" value="{actual_value}"> <label id={self._filter_range_config.column}_label>{actual_value}</> """))
def _change_table(self): with table_element( "changes", title=_("Pending changes (%s)") % self._get_amount_changes(), sortable=False, searchable=False, css="changes", limit=None, empty_text=_("Currently there are no changes to activate."), foldable=Foldable.FOLDABLE_STATELESS, ) as table: for _change_id, change in reversed(self._changes): css = [] if self._is_foreign(change): css.append("foreign") if not user.may("wato.activateforeign"): css.append("not_permitted") table.row(css=[" ".join(css)]) table.cell("", css=["buttons"]) rendered = render_object_ref_as_icon(change["object"]) if rendered: html.write_html(rendered) table.cell(_("Time"), render.date_and_time(change["time"]), css=["narrow nobr"]) table.cell(_("User"), css=["narrow nobr"]) html.write_text(change["user_id"] if change["user_id"] else "") if self._is_foreign(change): html.icon("foreign_changes", _("This change has been made by another user")) # Text is already escaped (see ActivateChangesWriter._add_change_to_site). We have # to handle this in a special way because of the SiteChanges file format. Would be # cleaner to transport the text type (like AuditLogStore is doing it). table.cell(_("Change"), HTML(change["text"])) table.cell(_("Affected sites"), css=["affected_sites"]) if self._affects_all_sites(change): html.write_text("<i>%s</i>" % _("All sites")) else: html.write_text(", ".join(sorted( change["affected_sites"])))
def _show_labels(self, labels, object_type, label_sources): forms.section(_("Effective labels")) html.open_table(class_="setting") html.open_tr() html.open_td(class_="reason") html.i(_("Explicit, ruleset, discovered")) html.close_td() html.open_td(class_=["settingvalue", "used"]) html.write_html( cmk.gui.view_utils.render_labels(labels, object_type, with_links=False, label_sources=label_sources)) html.close_td() html.close_tr() html.close_table()
def ajax_render_tree(): aggr_group = request.get_str_input("group") aggr_title = request.get_str_input("title") omit_root = bool(request.var("omit_root")) only_problems = bool(request.var("only_problems")) rows = [] bi_manager = BIManager() bi_manager.status_fetcher.set_assumed_states(user.bi_assumptions) aggregation_id = request.get_str_input_mandatory("aggregation_id") bi_aggregation_filter = BIAggregationFilter( [], [], [aggregation_id], [aggr_title] if aggr_title is not None else [], [aggr_group] if aggr_group is not None else [], [], ) rows = bi_manager.computer.compute_legacy_result_for_filter( bi_aggregation_filter) # TODO: Cleanup the renderer to use a class registry for lookup renderer_class_name = request.var("renderer") if renderer_class_name == "FoldableTreeRendererTree": renderer_cls: Type[ABCFoldableTreeRenderer] = FoldableTreeRendererTree elif renderer_class_name == "FoldableTreeRendererBoxes": renderer_cls = FoldableTreeRendererBoxes elif renderer_class_name == "FoldableTreeRendererBottomUp": renderer_cls = FoldableTreeRendererBottomUp elif renderer_class_name == "FoldableTreeRendererTopDown": renderer_cls = FoldableTreeRendererTopDown else: raise NotImplementedError() renderer = renderer_cls( rows[0], omit_root=omit_root, expansion_level=user.bi_expansion_level, only_problems=only_problems, lazy=False, ) html.write_html(renderer.render())
def _show_popup(self, entry: PageMenuEntry) -> None: assert isinstance(entry.item, PageMenuPopup) if entry.name is None: raise ValueError('Missing "name" attribute on entry "%s"' % entry.title) classes = ["page_menu_popup"] classes += [c for c in entry.item.css_classes if c is not None] if isinstance(entry.item, PageMenuSidePopup): classes.append("side_popup") popup_id = "popup_%s" % entry.name html.open_div(id_=popup_id, class_=classes) html.open_div(class_="head") html.h3(entry.title) html.a( html.render_icon("close"), class_="close_popup", href="javascript:void(0)", onclick="cmk.page_menu.close_popup(this)", ) html.close_div() if ( isinstance(entry.item, PageMenuSidePopup) and entry.item.content and "side_popup_content" not in entry.item.content ): raise RuntimeError( 'Add a div container with the class "side_popup_content" to the popup content' ) html.open_div(class_="content") html.write_html(entry.item.content) html.close_div() html.close_div() if isinstance(entry.item, PageMenuSidePopup): html.final_javascript( "cmk.page_menu.side_popup_add_simplebar_scrollbar(%s);" % json.dumps(popup_id) )
def mobile_html_head(title: str) -> None: html.write_html( HTML( """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">""" ) ) html.open_html() html.open_head() html.default_html_headers() html.meta(name="viewport", content="initial-scale=1.0") html.meta(name="apple-mobile-web-app-capable", content="yes") html.meta(name="apple-mobile-web-app-title", content="Check_MK") html.title(title) html.stylesheet(href="jquery/jquery.mobile-1.4.5.min.css") html.stylesheet(href="themes/facelift/theme.css") html.link(rel="apple-touch-icon", href="themes/facelift/images/ios_logo.png") html.javascript_file(src="js/mobile_min.js") html.close_head() html.open_body(class_="mobile")
def _render_tag_tree_level(self, tree_spec, path, cwd, title, tree) -> None: if not self._is_tag_subdir( path=path, cwd=cwd) and not self._is_tag_subdir(path=cwd, cwd=path): return container: ContextManager[bool] = nullcontext(False) if path != cwd and self._is_tag_subdir(path, cwd): bullet = self._tag_tree_bullet(self._tag_tree_worst_state(tree), path, False) if self._tag_tree_has_svc_problems(tree): bullet += html.render_icon_button( self._tag_tree_url(tree_spec, path, "svcproblems"), _("Show the service problems contained in this branch"), "svc_problems", target="main", ) if path: container = foldable_container( treename="tag-tree", id_=".".join(map(str, path)), isopen=False, title=bullet + title, icon="foldable_sidebar", ) with container: for (node_title, node_value), subtree in sorted( tree.get("_children", {}).items()): subpath = path + [node_value or ""] url = self._tag_tree_url(tree_spec, subpath, "allhosts") if "_num_hosts" in subtree: node_title += " (%d)" % subtree["_num_hosts"] node_title = HTMLWriter.render_a(node_title, href=url, target="main") if "_children" not in subtree: if self._is_tag_subdir(path, cwd): html.write_html( self._tag_tree_bullet(subtree.get("_state", 0), subpath, True)) if subtree.get("_svc_problems"): url = self._tag_tree_url(tree_spec, subpath, "svcproblems") html.icon_button( url, _("Show the service problems contained in this branch" ), "svc_problems", target="main", ) html.write_html(node_title) html.br() else: self._render_tag_tree_level(tree_spec, subpath, cwd, node_title, subtree)
def link(text: Union[str, HTML], url: str, target: str = "main", onclick: Optional[str] = None) -> None: html.write_html(render_link(text, url, target=target, onclick=onclick))
def _show_page_content(self, content: Optional["HTML"]): html.open_div(id_="content_area") if content is not None: html.write_html(content) html.close_div()