def get_view_menu_items() -> List[TopicMenuTopic]: # The page types that are implementing the PageRenderer API should also be # part of the menu. Bring them into a visual like structure to make it easy to # integrate them. page_type_items: List[Tuple[str, Tuple[str, Visual]]] = [] for page_type in pagetypes.all_page_types().values(): if not issubclass(page_type, pagetypes.PageRenderer): continue for page in page_type.pages(): if page._show_in_sidebar(): visual = page.internal_representation().copy() visual["hidden"] = False # Is currently to configurable for pagetypes visual["icon"] = None # Is currently to configurable for pagetypes page_type_items.append((page_type.type_name(), (page.name(), visual))) # Apply some view specific filters views_to_show = [(name, view) for name, view in views.get_permitted_views().items() if (not config.visible_views or name in config.visible_views) and (not config.hidden_views or name not in config.hidden_views)] visuals_to_show = [("views", e) for e in views_to_show] visuals_to_show += [("dashboards", e) for e in dashboard.get_permitted_dashboards().items()] visuals_to_show += page_type_items return make_topic_menu(visuals_to_show)
def page_index(): title = _("Check_MK Mobile") mobile_html_head(title) jqm_page_header(title, right_button=("javascript:document.location.reload();", _("Reload"), "refresh"), id_="data") items = [] for view_name, view_spec in views.get_permitted_views().items(): if view_spec.get("mobile") and not view_spec.get("hidden"): view = views.View(view_name, view_spec) view.row_limit = views.get_limit() view.only_sites = views.get_only_sites() view.user_sorters = views.get_user_sorters() url = "mobile_view.py?view_name=%s" % view_name count = "" if not view_spec.get("mustsearch"): painter_options = PainterOptions.get_instance() painter_options.load(view_name) view_renderer = MobileViewRenderer(view) count = views.show_view(view, view_renderer, only_count=True) count = '<span class="ui-li-count">%d</span>' % count items.append( (view_spec.get("topic"), url, '%s %s' % (view_spec.get("linktitle", view_spec["title"]), count))) jqm_page_index(_("Check_MK Mobile"), items) # Link to non-mobile GUI html.hr() html.open_ul(**{ "data-role": "listview", "data-theme": "b", "data-inset": "true" }) html.open_li() html.a(_("Classical web GUI"), href="index.py?mobile=", **{ "data-ajax": "false", "data-transition": "fade" }) html.close_li() html.close_ul() html.open_ul(**{ "data-role": "listview", "data-theme": "f", "data-inset": "true" }) html.open_li() html.a(_("Logout"), href="logout.py", **{ "data-ajax": "false", "data-transition": "fade" }) html.close_li() html.close_ul() mobile_html_foot()
def page_view(): view_name = html.request.var("view_name") if not view_name: return page_index() view_spec = views.get_permitted_views().get(view_name) if not view_spec: raise MKUserError("view_name", "No view defined with the name '%s'." % view_name) view = views.View(view_name, view_spec) view.row_limit = views.get_limit() view.only_sites = views.get_only_sites() view.user_sorters = views.get_user_sorters() title = views.view_title(view_spec) mobile_html_head(title) painter_options = PainterOptions.get_instance() painter_options.load(view_name) try: view_renderer = MobileViewRenderer(view) views.show_view(view, view_renderer) except Exception as e: logger.exception() if config.debug: raise html.write("ERROR showing view: %s" % html.attrencode(e)) mobile_html_foot()
def _get_view_spec(self): view_name = self._dashlet_spec["name"] view_spec = views.get_permitted_views().get(view_name) if not view_spec: raise MKUserError("name", _("No view defined with the name '%s'.") % view_name) return view_spec
def page_index(): # type: () -> None title = _("Check_MK Mobile") mobile_html_head(title) jqm_page_header(title, right_button=("javascript:document.location.reload();", _("Reload"), "refresh"), id_="data") items = [] for view_name, view_spec in views.get_permitted_views().items(): if view_spec.get("mobile") and not view_spec.get("hidden"): datasource = data_source_registry[view_spec["datasource"]]() context = visuals.get_merged_context( visuals.get_context_from_uri_vars(datasource.infos), view_spec["context"], ) view = views.View(view_name, view_spec, context) view.row_limit = views.get_limit() view.only_sites = views.get_only_sites() view.user_sorters = views.get_user_sorters() url = "mobile_view.py?view_name=%s" % view_name count = "" if not view_spec.get("mustsearch"): painter_options = PainterOptions.get_instance() painter_options.load(view_name) view_renderer = MobileViewRenderer(view) # TODO: Horrible API ahead! count_num = views.show_view(view, view_renderer, only_count=True) count = '<span class="ui-li-count">%d</span>' % count_num topic = view_spec.get("topic") if topic is None: topic = "" this_title = '%s %s' % (view_spec.get("linktitle", view_spec["title"]), count) items.append((topic, url, this_title)) jqm_page_index(_("Check_MK Mobile"), items) # Link to non-mobile GUI html.hr() html.open_ul(**{"data-role": "listview", "data-theme": "b", "data-inset": "true"}) html.open_li() html.a(_("Classical web GUI"), href="index.py?mobile=", **{ "data-ajax": "false", "data-transition": "fade" }) html.close_li() html.close_ul() html.open_ul(**{"data-role": "listview", "data-theme": "f", "data-inset": "true"}) html.open_li() html.a(_("Logout"), href="logout.py", **{"data-ajax": "false", "data-transition": "fade"}) html.close_li() html.close_ul() mobile_html_foot()
def page_index() -> None: title = _("Checkmk Mobile") mobile_html_head(title) jqm_page_header( title, right_button=("javascript:document.location.reload();", _("Reload"), "refresh"), id_="data", ) items = [] for view_name, view_spec in views.get_permitted_views().items(): if view_spec.get("mobile") and not view_spec.get("hidden"): datasource = data_source_registry[view_spec["datasource"]]() context = visuals.get_merged_context( visuals.get_context_from_uri_vars(datasource.infos), view_spec["context"], ) view = views.View(view_name, view_spec, context) view.row_limit = views.get_limit() view.only_sites = visuals.get_only_sites_from_context(context) view.user_sorters = views.get_user_sorters() view.want_checkboxes = views.get_want_checkboxes() url = "mobile_view.py?view_name=%s" % view_name count = "" if not view_spec.get("mustsearch"): painter_options = PainterOptions.get_instance() painter_options.load(view_name) count = '<span class="ui-li-count">%d</span>' % views.get_row_count(view) topic = PagetypeTopics.get_topic(view_spec.get("topic", "")) items.append((topic.title(), url, "%s %s" % (view_spec["title"], count))) jqm_page_index(_("Checkmk Mobile"), items) # Link to non-mobile GUI html.hr() html.open_ul(**{"data-role": "listview", "data-theme": "b", "data-inset": "true"}) html.open_li() html.a( _("Classical web GUI"), href="index.py?mobile=", **{"data-ajax": "false", "data-transition": "fade"}, ) html.close_li() html.close_ul() html.open_ul(**{"data-role": "listview", "data-theme": "f", "data-inset": "true"}) html.open_li() html.a(_("Logout"), href="logout.py", **{"data-ajax": "false", "data-transition": "fade"}) html.close_li() html.close_ul() mobile_html_foot()
def _get_view_spec(self) -> ViewSpec: view_name = self._dashlet_spec["name"] view_spec = views.get_permitted_views().get(view_name) if not view_spec: raise MKUserError("name", _("No view defined with the name '%s'.") % view_name) # Override some view dashlet specific options view_spec = view_spec.copy() view_spec["user_sortable"] = False return view_spec
def page_view() -> None: view_name = html.request.var("view_name") if not view_name: return page_index() view_spec = views.get_permitted_views().get(view_name) if not view_spec: raise MKUserError("view_name", "No view defined with the name '%s'." % view_name) datasource = data_source_registry[view_spec["datasource"]]() context = visuals.get_merged_context( visuals.get_context_from_uri_vars( datasource.infos, single_infos=view_spec["single_infos"]), view_spec["context"], ) view = views.View(view_name, view_spec, context) view.row_limit = views.get_limit() view.only_sites = visuals.get_only_sites_from_context(context) view.user_sorters = views.get_user_sorters() view.want_checkboxes = views.get_want_checkboxes() title = views.view_title(view.spec, view.context) mobile_html_head(title) # Need to be loaded before processing the painter_options below. # TODO: Make this dependency explicit display_options.load_from_html(html) painter_options = PainterOptions.get_instance() painter_options.load(view_name) try: views.process_view(MobileViewRenderer(view)) except Exception as e: logger.exception("error showing mobile view") if config.debug: raise html.write("ERROR showing view: %s" % escaping.escape_attribute(str(e))) mobile_html_foot()
def page_view() -> None: view_name = html.request.var("view_name") if not view_name: return page_index() view_spec = views.get_permitted_views().get(view_name) if not view_spec: raise MKUserError("view_name", "No view defined with the name '%s'." % view_name) datasource = data_source_registry[view_spec["datasource"]]() context = visuals.get_merged_context( visuals.get_context_from_uri_vars( datasource.infos, single_infos=view_spec["single_infos"]), view_spec["context"], ) view = views.View(view_name, view_spec, context) view.row_limit = views.get_limit() view.only_sites = views.get_only_sites() view.user_sorters = views.get_user_sorters() title = views.view_title(view_spec) mobile_html_head(title) painter_options = PainterOptions.get_instance() painter_options.load(view_name) try: view_renderer = MobileViewRenderer(view) views.show_view(view, view_renderer) except Exception as e: logger.exception("error showing mobile view") if config.debug: raise html.write("ERROR showing view: %s" % escaping.escape_attribute(str(e))) mobile_html_foot()
def get_view_menu_items(): # type: () -> Dict[Text, List[ViewMenuItem]] # TODO: One bright day drop this whole visuals stuff and only use page_types page_type_topics = { } # type: Dict[Text, List[Tuple[Text, Text, str, bool]]] for page_type in pagetypes.all_page_types().values(): if issubclass(page_type, pagetypes.PageRenderer): for t, title, url in page_type.sidebar_links(): page_type_topics.setdefault(t, []).append( (t, title, url, False)) visuals_topics_with_entries = visuals_by_topic( list(views.get_permitted_views().items()) + list(dashboard.get_permitted_dashboards().items())) all_topics_with_entries = [] for topic, entries in visuals_topics_with_entries: if topic in page_type_topics: entries = entries + page_type_topics[topic] del page_type_topics[topic] all_topics_with_entries.append((topic, entries)) all_topics_with_entries += page_type_topics.items() # Filter hidden / not permitted entries by_topic = OrderedDict() # type: Dict[Text, List[ViewMenuItem]] for topic, entries in all_topics_with_entries: for t, title, name, is_view in entries: if is_view and config.visible_views and name not in config.visible_views: continue if is_view and config.hidden_views and name in config.hidden_views: continue if t != topic: continue url = view_menu_url(name, is_view) by_topic.setdefault(topic, []).append( ViewMenuItem(title=title, name=name, is_view=is_view, url=url)) return by_topic
def show(self): if not watolib.is_wato_slave_site(): if not config.wato_enabled: html.write_text(_("Setup is disabled.")) return False user_folders = compute_foldertree() # # Render link target selection # selected_topic, selected_target = user.load_file( "foldertree", (_("Hosts"), "allhosts")) # Apply some view specific filters views_to_show = [ (name, view) for name, view in views.get_permitted_views().items() if (not config.visible_views or name in config.visible_views) and ( not config.hidden_views or name not in config.hidden_views) ] visuals_to_show = [("views", e) for e in views_to_show] visuals_to_show += [ ("dashboards", e) for e in dashboard.get_permitted_dashboards().items() ] topics = make_topic_menu(visuals_to_show) topic_choices: Choices = [(topic.title, topic.title) for topic in topics] html.open_table() html.open_tr() html.open_td() html.dropdown( "topic", topic_choices, deflt=selected_topic, onchange="cmk.sidebar.wato_tree_topic_changed(this)", ) html.close_td() html.close_tr() html.open_tr() html.open_td() for topic in topics: targets: Choices = [] for item in topic.items: if item.url and item.url.startswith("dashboard.py"): name = "dashboard|" + item.name else: name = item.name targets.append((name, item.title)) if topic.title != selected_topic: default = "" style: Optional[str] = "display:none" else: default = selected_target style = None html.dropdown( "target_%s" % topic.title, targets, deflt=default, onchange="cmk.sidebar.wato_tree_target_changed(this)", style=style, ) html.close_td() html.close_tr() html.close_table() # Now render the whole tree if user_folders: render_tree_folder("wato-hosts", list(user_folders.values())[0], "cmk.sidebar.wato_tree_click")
def show(self): if not watolib.is_wato_slave_site(): if not config.wato_enabled: html.write_text(_("WATO is disabled.")) return False user_folders = compute_foldertree() # # Render link target selection # selected_topic, selected_target = config.user.load_file( "foldertree", (_('Hosts'), 'allhosts')) topic_views = visuals_by_topic( views.get_permitted_views().items() + dashboard.get_permitted_dashboards().items()) topics = [(t, t) for t, _s in topic_views] html.open_table() html.open_tr() html.td(_('Topic:'), class_="label") html.open_td() html.dropdown("topic", topics, deflt=selected_topic, onchange='cmk.sidebar.wato_tree_topic_changed(this)') html.close_td() html.close_tr() html.open_tr() html.td(_("View:"), class_="label") html.open_td() for topic, view_list in topic_views: targets = [] for t, title, name, is_view in view_list: if config.visible_views and name not in config.visible_views: continue if config.hidden_views and name in config.hidden_views: continue if t == topic: if not is_view: name = 'dashboard|' + name targets.append((name, title)) if topic != selected_topic: default, style = '', 'display:none' else: default, style = selected_target, None html.dropdown( "target_%s" % topic, targets, deflt=default, onchange='cmk.sidebar.wato_tree_target_changed(this)', style=style) html.close_td() html.close_tr() html.close_table() # Now render the whole tree if user_folders: render_tree_folder("wato-hosts", list(user_folders.values())[0], 'cmk.sidebar.wato_tree_click')
def show(self): dashboard.load_dashboards() def render_topic(topic, entries): first = True for t, title, name, is_view in entries: if is_view and config.visible_views and name not in config.visible_views: continue if is_view and config.hidden_views and name in config.hidden_views: continue if t == topic: if first: html.begin_foldable_container("views", topic, False, topic, indent=True) first = False if is_view: bulletlink( title, "view.py?view_name=%s" % name, onclick= "return cmk.sidebar.wato_views_clicked(this)") elif "?name=" in name: bulletlink(title, name) else: bulletlink( title, 'dashboard.py?name=%s' % name, onclick= "return cmk.sidebar.wato_views_clicked(this)") # TODO: One day pagestypes should handle the complete snapin. # for page_type in pagetypes.all_page_types().values(): # if issubclass(page_type, pagetypes.PageRenderer): # for t, title, url in page_type.sidebar_links(): # if t == topic: # bulletlink(title, url) if not first: # at least one item rendered html.end_foldable_container() # TODO: One bright day drop this whole visuals stuff and only use page_types page_type_topics = {} for page_type in pagetypes.all_page_types().values(): if issubclass(page_type, pagetypes.PageRenderer): for t, title, url in page_type.sidebar_links(): page_type_topics.setdefault(t, []).append( (t, title, url, False)) visuals_topics_with_entries = visuals_by_topic( views.get_permitted_views().items() + dashboard.permitted_dashboards().items()) all_topics_with_entries = [] for topic, entries in visuals_topics_with_entries: if topic in page_type_topics: entries = entries + page_type_topics[topic] del page_type_topics[topic] all_topics_with_entries.append((topic, entries)) all_topics_with_entries += sorted(page_type_topics.items()) for topic, entries in all_topics_with_entries: render_topic(topic, entries) links = [] if config.user.may("general.edit_views"): if config.debug: links.append((_("Export"), "export_views.py")) links.append((_("Edit"), "edit_views.py")) footnotelinks(links)