diff --git a/inv_cisco_support.mkp b/inv_cisco_support.mkp index a178dac34af72c6dccc74ca2387d1524d322a8c1..91f4ee02be3d3a24f475279e91bd0096c5d66807 100644 Binary files a/inv_cisco_support.mkp and b/inv_cisco_support.mkp differ diff --git a/packages/inv_cisco_support b/packages/inv_cisco_support index 1a5965abda52a4282c87cfaf98c440d01eb9e38a..9ecfc021efa704dfd4005c9219b44fbea1908daa 100644 --- a/packages/inv_cisco_support +++ b/packages/inv_cisco_support @@ -30,4 +30,4 @@ 'title': u'Inventory for Cisco Bug, EoX, contract status, PSIRT advisories and suggested software', 'version': '20190830.v0.0.11', 'version.min_required': '1.4.0p1', - 'version.packaged': '1.4.0p35'} \ No newline at end of file + 'version.packaged': '1.6.0p8'} \ No newline at end of file diff --git a/web/plugins/views/inv_cisco_support.py b/web/plugins/views/inv_cisco_support.py index 84161991c3dfd13ddcebefa0be9190050ba9177a..e07824647d167c0f2eb4857b10d46c8279cb4816 100644 --- a/web/plugins/views/inv_cisco_support.py +++ b/web/plugins/views/inv_cisco_support.py @@ -10,367 +10,49 @@ # (https://bst.cloudapps.cisco.com/bugsearch/bug/CSCuh91645) # -import random - - -def inv_paint_date_status(date_string): - - warn_days = -90 - crit_days = -30 - - # check if date_sting not None, if so return no CSS Class and None - if date_string is None: - return '', '' - - try: - days = int((time.time() - time.mktime(time.strptime(date_string, '%Y-%m-%d'))) / 86400) - except ValueError: - return '', date_string - - if days > crit_days: - css_class = 'date_crit' - elif days > warn_days: - css_class = 'date_warn' - else: - css_class = 'date_default' - - return css_class, '%s' % date_string - - -def inv_paint_last_checked_status(date_string): - - warn_days = 32 - crit_days = 40 - - # check if date_sting not None, if so return no CSS Class and None - if date_string is None: - return '', '' - - # check if _date_string in the right format, if not return CSS Class and date_string - try: - days = int((time.time() - time.mktime(time.strptime(date_string, '%Y-%m-%d'))) / 86400) - except ValueError: - return '', date_string - - # last_checked is ok - if days <= warn_days: - css_class = '' - # no refresh for far to long - elif days >= crit_days: - css_class = 'date_crit' - # no refresh for to long - else: - css_class = 'date_warn' - # css_class = '' - return css_class, ' %s' % date_string - - -def inv_paint_psirt_advisoryId(advisoryId): - psirt_url = '<a class="href_blue" target="_blank" href="https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/%s">%s</a>' % (advisoryId, advisoryId) - return '', psirt_url - - -def inv_paint_eox_eolid(eolid): - if eolid is not None: - search_eolid_url = '<a class="href_blue" target="_blank" href="https://search.cisco.com/search?query=%s">%s</a>' % (eolid, eolid) - else: - search_eolid_url = '' - return '', search_eolid_url - - -def render_inv_dicttable_suggestion_noqf(hostname, tree_id, invpath, node): - # In delta mode node is a pair of (old_items, new_items) - if type(node) == tuple: - html.write(_("Removed entries") + ":") - html.write("<span class=invold>") - render_inv_dicttable_suggestion_noqf(hostname, tree_id, invpath, node[0]) - html.write("</span>") - - html.write(_("New entries") + ":") - html.write("<span class=invnew>") - render_inv_dicttable_suggestion_noqf(hostname, tree_id, invpath, node[1]) - html.write("</span>") - return - - hint = inv_display_hint(invpath) - keyorder = hint.get("keyorder", []) # well known keys - - # Add titles for those keys - titles = [] - for key in keyorder: - invpath_sub = invpath + "0." + key - icon, title = inv_titleinfo(invpath_sub, None) - sub_hint = inv_display_hint(invpath_sub) - short_title = sub_hint.get("short", title) - titles.append((short_title, key)) - - # Determine *all* keys, in order to find unknown ones - keys = set([]) - for entry in node: - keys.update(entry.keys()) - - # Order not well-known keys alphabetically - extratitles = [] - for key in keys: - if key not in keyorder: - icon, title = inv_titleinfo(invpath + "0." + key, None) - extratitles.append((title, key)) - extratitles.sort() - titles += extratitles - - # Link to Multisite view with exactly this table - if "view" in hint: - url = html.makeuri_contextless([ - ("view_name", hint["view"] ), - ("host", hostname)], - filename="view.py") - html.write('<div class=invtablelink><a href="%s">%s</a></div>' % - (url, _("Open this table for filtering / sorting"))) - - # We cannot use table here, since html.plug() does not work recursively - html.write('<table class=data>') - html.write('<tr>') - for title, key in titles: - html.write('<th>%s</th>' % title) - html.write('</tr>') - - for nr, entry in enumerate(node): - html.write('<tr class=even0>') - for title, key in titles: - value = entry.get(key) - invpath_sub = invpath + "%d.%s" % (nr, key) - if type(value) == dict: - invpath_sub += "." - elif type(value) == list or (type(value) == tuple and type(value[0]) == list): - invpath_sub += ":" - - hint = inv_display_hint(invpath_sub) - if "paint_function" in hint: - td_class, text = hint["paint_function"](value) - classtext = ' class="%s"' % td_class - else: - classtext = "" - - html.write('<td%s>' % classtext) -# render_inv_subtree(hostname, tree_id, invpath_sub, value) - # render suggestions as not foldable - if key == 'suggestion' and type(value) == list: - render_inv_subtree_container(hostname, tree_id, invpath_sub, value) - else: - render_inv_subtree(hostname, tree_id, invpath_sub, value) - html.write('</td>') - html.write('</tr>') - html.write('</table>') - - -def render_inv_dicttable_suggestion(hostname, tree_id, invpath, node): - # In delta mode node is a pair of (old_items, new_items) - if type(node) == tuple: - html.write(_("Removed entries") + ":") - html.write("<span class=invold>") - render_inv_dicttable_suggestion(hostname, tree_id, invpath, node[0]) - html.write("</span>") - - html.write(_("New entries") + ":") - html.write("<span class=invnew>") - render_inv_dicttable_suggestion(hostname, tree_id, invpath, node[1]) - html.write("</span>") - return - - hint = inv_display_hint(invpath) - keyorder = hint.get("keyorder", []) # well known keys - - # Add titles for those keys - titles = [] - for key in keyorder: - invpath_sub = invpath + "0." + key - icon, title = inv_titleinfo(invpath_sub, None) - sub_hint = inv_display_hint(invpath_sub) - short_title = sub_hint.get("short", title) - titles.append((short_title, key)) - - # Determine *all* keys, in order to find unknown ones - keys = set([]) - for entry in node: - keys.update(entry.keys()) - - # Order not well-known keys alphabetically - extratitles = [] - for key in keys: - if key not in keyorder: - icon, title = inv_titleinfo(invpath + "0." + key, None) - extratitles.append((title, key)) - extratitles.sort() - titles += extratitles - - # Link to Multisite view with exactly this table - if "view" in hint: - url = html.makeuri_contextless([ - ("view_name", hint["view"] ), - ("host", hostname)], - filename="view.py") - html.write('<div class=invtablelink><a href="%s">%s</a></div>' % - (url, _("Open this table for filtering / sorting"))) - - # - # Th.L.: insert jscript for quickfilter - # - qfurl = html.makeuri([],filename="TableFilter/tablefilter.js", delvars=["host","selection","site","view_name"]) - html.write('<script language="javascript" type="text/javascript" src="%s"></script>' % qfurl) - - # Th.L.: create random table id - qf_table_id = "qf_id_" + "".join(random.SystemRandom().choice('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') for _ in range(10)) - - # We cannot use table here, since html.plug() does not work recursively - # html.write('<table class=data>') - html.write('<table id=%s class=data>' % qf_table_id) - # html.write('<tr>') - html.write('<thead><tr>') # Th.L.: added thead for quickfilter (sort) - for title, key in titles: - html.write('<th>%s</th>' % title) - #html.write('</tr>') - html.write('</tr></thead><tbody>') # Th.L.: added thead and tbody for quickfilter (sort) - - for nr, entry in enumerate(node): - html.write('<tr class=even0>') - for title, key in titles: - value = entry.get(key) - invpath_sub = invpath + "%d.%s" % (nr, key) - if type(value) == dict: - invpath_sub += "." - elif type(value) == list or (type(value) == tuple and type(value[0]) == list): - invpath_sub += ":" - - hint = inv_display_hint(invpath_sub) - if "paint_function" in hint: - td_class, text = hint["paint_function"](value) - classtext = ' class="%s"' % td_class - else: - classtext = "" - - html.write('<td%s>' % classtext) -# render_inv_subtree(hostname, tree_id, invpath_sub, value) - # render suggestions as not foldable - if key == 'suggestion' and type(value) == list: - render_inv_subtree_container(hostname, tree_id, invpath_sub, value) - else: - render_inv_subtree(hostname, tree_id, invpath_sub, value) - html.write('</td>') - html.write('</tr>') - #html.write('</table>') - html.write('</tbody></table>') # Th.L.: added tbody for quickfilter (sort) - - # - # Th.L.: add jscript for quickfilter - # - html.write('<script data-config>\n') - html.write(' var filtersConfig = {\n') - html.write(' base_path: "TableFilter/",\n') - html.write(' alternate_rows: true,\n') - html.write(' rows_counter: true,\n') - html.write(' btn_reset: true,\n') - html.write(' bnt_reset_text: "Clear all",\n') - html.write(' loader: true,\n') - html.write(' status_bar: true,\n') - html.write(' status_bar_text : "status:",\n') - html.write(' loader : true,\n') - html.write(' mark_active_columns: true,\n') - html.write(' highlight_keywords: true,\n') - html.write(' auto_filter: true,\n') - html.write(' auto_filter_delay: 100,\n') - html.write(' paging: true,\n') - html.write(' mark_active_columns: true,\n') - html.write(' results_per_page: [" Results per page",[10,25,50,100,250,500,1000]],\n') - html.write(' no_results_message: true,\n') - html.write(' extensions:[{ name: "sort"},\n') - html.write(' { name: "colsVisibility",\n') - html.write(' tick_to_hide: false,\n') - html.write(' at_start: [11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65],\n') - html.write(' text: "Displayed columns: ",\n') - html.write(' enable_tick_all: true,\n') - html.write(' btn_html: "<button>Columns manager ▼</button>",\n') - html.write(' btn_close_html: "<button>Close</button>",\n') - html.write(' enable_hover: false,\n') - html.write(' },\n') -# html.write(' {name: "filtersVisibility"} - html.write(' ]\n') - html.write(' };\n') - html.write('\n') - html.write(' var tf = new TableFilter("%s", filtersConfig);\n' % qf_table_id) - html.write(' tf.init();\n') - html.write('\n') - html.write('</script>\n') - - -def inv_paint_bug_status(bug_status): - _bug_status = { - 'F': 'Fixed', - 'O': 'Open', - 'T': 'Terminated' - } - return '', _bug_status.get(bug_status, bug_status) - - -def inv_paint_bug_behavior_changed(behavior_changed): - _behavior_changed = { - 'Y': 'yes', - 'N': 'no', - } - return '', _behavior_changed.get(behavior_changed, behavior_changed) - - -def inv_paint_bug_bugid(bugid): - if bugid is not None: - search_bugid_url = '<a class="href_blue" target="_blank" href="https://bst.cloudapps.cisco.com/bugsearch/bug/%s">%s</a>' % (bugid, bugid) - else: - search_eolid_url = '' - return '', search_bugid_url - inventory_displayhints.update({ # EoX display hints '.hardware.system.support.cisco_eox:': {'title': _('Cisco EoX status'), - 'render': render_inv_dicttable, 'keyorder': ['pid', 'serial_number', 'ProductIDDescription', 'Last_checked', 'EOXExternalAnnouncementDate', 'EndOfSaleDate', 'LastDateOfSupport', 'EndOfSvcAttachDate', 'UpdatedTimeStamp', 'ProductBulletinNumber', ], - 'view': 'invciscoeox_of_host', +# 'view': 'invciscoeox_of_host', }, - '.hardware.system.support.cisco_eox:*.pid': {'title': _('PID (EoX)'), }, - '.hardware.system.support.cisco_eox:*.serial_number': {'title': _('Serial number'), }, + '.hardware.system.support.cisco_eox:*.pid': {'title': _('PID (EoX)') }, + '.hardware.system.support.cisco_eox:*.serial_number': {'title': _('Serial number') }, '.hardware.system.support.cisco_eox:*.ProductIDDescription': {'title': _('Description'), }, - '.hardware.system.support.cisco_eox:*.EOXExternalAnnouncementDate': {'title': _('EOL Announcement'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText, }, - '.hardware.system.support.cisco_eox:*.EndOfSaleDate': {'title': _('End of sale'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText, }, - '.hardware.system.support.cisco_eox:*.EndOfSvcAttachDate': {'title': _('End of service attachment'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText, }, - '.hardware.system.support.cisco_eox:*.LastDateOfSupport': {'title': _('End of support'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText, }, - '.hardware.system.support.cisco_eox:*.ProductBulletinNumber': {'title': _('EOL bulletin ID'), 'paint': 'eox_eolid', 'filter': visuals.FilterInvtableText, }, - '.hardware.system.support.cisco_eox:*.LinkToProductBulletinURL': {'title': _('EOL bulletin URL'), }, - '.hardware.system.support.cisco_eox:*.UpdatedTimeStamp': {'title': _('EOL bulletin last update'), }, - '.hardware.system.support.cisco_eox:*.EndOfSecurityVulSupportDate': {'title': _('End of service vulnerability support'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText, }, - '.hardware.system.support.cisco_eox:*.EndOfSWMaintenanceReleases': {'title': _('End of software maintenace releases'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText, }, - '.hardware.system.support.cisco_eox:*.EndOfRoutineFailureAnalysisDate': {'title': _('End of routine failure analysis'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText, }, - '.hardware.system.support.cisco_eox:*.MigrationProductId': {'title': _('Migration PID'), }, - '.hardware.system.support.cisco_eox:*.MigrationInformation': {'title': _('Migration information'), }, - '.hardware.system.support.cisco_eox:*.MigrationProductInfoURL': {'title': _('Migration PID URL'), }, - '.hardware.system.support.cisco_eox:*.MigrationProductName': {'title': _('Migration product name'), }, - '.hardware.system.support.cisco_eox:*.Last_checked': {'title': _('Last checked'), 'paint': 'last_checked_status', 'filter': visuals.FilterInvtableText, }, + '.hardware.system.support.cisco_eox:*.EOXExternalAnnouncementDate': {'title': _('EOL Announcement') }, + '.hardware.system.support.cisco_eox:*.EndOfSaleDate': {'title': _('End of sale') }, + '.hardware.system.support.cisco_eox:*.EndOfSvcAttachDate': {'title': _('End of service attachment') }, + '.hardware.system.support.cisco_eox:*.LastDateOfSupport': {'title': _('End of support') }, + '.hardware.system.support.cisco_eox:*.ProductBulletinNumber': {'title': _('EOL bulletin ID') }, + '.hardware.system.support.cisco_eox:*.LinkToProductBulletinURL': {'title': _('EOL bulletin URL') }, + '.hardware.system.support.cisco_eox:*.UpdatedTimeStamp': {'title': _('EOL bulletin last update') }, + '.hardware.system.support.cisco_eox:*.EndOfSecurityVulSupportDate': {'title': _('End of service vulnerability support') }, + '.hardware.system.support.cisco_eox:*.EndOfSWMaintenanceReleases': {'title': _('End of software maintenace releases') }, + '.hardware.system.support.cisco_eox:*.EndOfRoutineFailureAnalysisDate': {'title': _('End of routine failure analysis') }, + '.hardware.system.support.cisco_eox:*.MigrationProductId': {'title': _('Migration PID') }, + '.hardware.system.support.cisco_eox:*.MigrationInformation': {'title': _('Migration information') }, + '.hardware.system.support.cisco_eox:*.MigrationProductInfoURL': {'title': _('Migration PID URL') }, + '.hardware.system.support.cisco_eox:*.MigrationProductName': {'title': _('Migration product name') }, + '.hardware.system.support.cisco_eox:*.Last_checked': {'title': _('Last checked') }, # SN2Info (contract) display hints '.hardware.system.support.cisco_contract:': {'title': _('Cisco contract status'), - 'render': render_inv_dicttable, 'keyorder': ['pid', 'serial_number', 'ProductIDDescription', 'Last_checked', 'is_covered', 'service_contract_number', 'covered_product_line_end_date', ], - 'view': 'invciscocontract_of_host', +# 'view': 'invciscocontract_of_host', }, '.hardware.system.support.cisco_contract:*.pid': {'title': _('PID (contract)'), }, '.hardware.system.support.cisco_contract:*.serial_number': {'title': _('Serial number'), }, '.hardware.system.support.cisco_contract:*.ProductIDDescription': {'title': _('Description'), }, - '.hardware.system.support.cisco_contract:*.Last_checked': {'title': _('Last checked'), 'paint': 'last_checked_status', 'filter': visuals.FilterInvtableText,}, + '.hardware.system.support.cisco_contract:*.Last_checked': {'title': _('Last checked'),}, '.hardware.system.support.cisco_contract:*.is_covered': {'title': _('is covered'), }, '.hardware.system.support.cisco_contract:*.contract_site_customer_name': {'title': _('Customer name'), }, '.hardware.system.support.cisco_contract:*.contract_site_address1': {'title': _('Address'), }, @@ -379,7 +61,7 @@ inventory_displayhints.update({ '.hardware.system.support.cisco_contract:*.contract_site_country': {'title': _('Country'), }, '.hardware.system.support.cisco_contract:*.service_line_descr': {'title': _('Service description'), }, '.hardware.system.support.cisco_contract:*.service_contract_number': {'title': _('Contract number'), }, - '.hardware.system.support.cisco_contract:*.covered_product_line_end_date': {'title': _('Contract end date'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText,}, + '.hardware.system.support.cisco_contract:*.covered_product_line_end_date': {'title': _('Contract end date'),}, '.hardware.system.support.cisco_contract:*.parent_sr_no': {'title': _('Parent S/N'), }, '.hardware.system.support.cisco_contract:*.warranty_type': {'title': _('Warranty type'), }, '.hardware.system.support.cisco_contract:*.warranty_type_description': {'title': _('Warranty Description'), }, @@ -393,20 +75,19 @@ inventory_displayhints.update({ '.software.support.cisco_bug.PID': {'title': _('PID'), }, '.software.support.cisco_bug.os_version': {'title': _('OS version'), }, '.software.support.cisco_bug.bugs:': {'title': _('Cisco BUG IDs'), - 'render': render_inv_dicttable, 'keyorder': ['bug_id', 'last_modified_date', 'headline', 'severity', 'status', 'support_case_count', 'behavior_changed', ], - 'view': 'invciscobugs_of_host', +# 'view': 'invciscobugs_of_host', }, - '.software.support.cisco_bug.bugs:*.status': {'title': _('Status'), 'paint': 'bug_status', 'filter': visuals.FilterInvtableText, }, + '.software.support.cisco_bug.bugs:*.status': {'title': _('Status'), }, '.software.support.cisco_bug.bugs:*.product': {'title': _('Product'), }, '.software.support.cisco_bug.bugs:*.description': {'title': _('Description'), }, '.software.support.cisco_bug.bugs:*.headline': {'title': _('Headline'), }, '.software.support.cisco_bug.bugs:*.support_case_count': {'title': _('Support case count'), }, '.software.support.cisco_bug.bugs:*.last_modified_date': {'title': _('Last modified date'), }, - '.software.support.cisco_bug.bugs:*.behavior_changed': {'title': _('Behavior changed'), 'paint': 'bug_behavior_changed', 'filter': visuals.FilterInvtableText, }, - '.software.support.cisco_bug.bugs:*.bug_id': {'title': _('Bug ID'), 'paint': 'bug_bugid', }, + '.software.support.cisco_bug.bugs:*.behavior_changed': {'title': _('Behavior changed'), }, + '.software.support.cisco_bug.bugs:*.bug_id': {'title': _('Bug ID'), }, '.software.support.cisco_bug.bugs:*.base_pid': {'title': _('Base PID'), }, - '.software.support.cisco_bug.bugs:*.known_fixed_releases': {'title': _('Known fixed releases'), 'filter': visuals.FilterInvtableText, }, + '.software.support.cisco_bug.bugs:*.known_fixed_releases': {'title': _('Known fixed releases'), }, '.software.support.cisco_bug.bugs:*.id': {'title': _('ID'), }, '.software.support.cisco_bug.bugs:*.known_affected_releases': {'title': _('known affected releases'), }, '.software.support.cisco_bug.bugs:*.severity': {'title': _('Severity'), }, @@ -417,14 +98,13 @@ inventory_displayhints.update({ '.software.support.cisco_psirt.dont_show_not_updated_since': {'title': _('Don\'t show advisories not updated for X days'), }, '.software.support.cisco_psirt.removed_advisories': {'title': _('Advisories removed'), }, '.software.support.cisco_psirt.advisories:': {'title': _('Cisco PSIRT advisories'), - 'render': render_inv_dicttable, 'keyorder': ['advisoryId', 'sir', 'cvssBaseScore', 'advisoryTitle', ], - 'view': 'invciscopsirt_of_host', +# 'view': 'invciscopsirt_of_host', }, - '.software.support.cisco_psirt.advisories:*.advisoryId': {'title': _('Advisory ID'), 'paint': 'psirt_advisoryId', 'filter': visuals.FilterInvtableText, }, + '.software.support.cisco_psirt.advisories:*.advisoryId': {'title': _('Advisory ID'), }, '.software.support.cisco_psirt.advisories:*.advisoryTitle': {'title': _('Advisory Title'), }, - '.software.support.cisco_psirt.advisories:*.bugIDs': {'title': _('Bug IDs'), }, # 'paint': 'psirt_bugid', 'filter': visuals.FilterInvtableText, + '.software.support.cisco_psirt.advisories:*.bugIDs': {'title': _('Bug IDs'), }, '.software.support.cisco_psirt.advisories:*.cvssBaseScore': {'title': _('CVSS base Score'), }, '.software.support.cisco_psirt.advisories:*.firstFixed': {'title': _('First fixed in'), }, '.software.support.cisco_psirt.advisories:*.firstPublished': {'title': _('First Published'), }, @@ -440,26 +120,25 @@ inventory_displayhints.update({ '.software.support.cisco_psirt.advisories:*.cvrfUrl': {'title': _('CVRF URL'), }, '.software.support.cisco_psirt.advisories:*.ovalUrl': {'title': _('OVAL URL'), }, '.software.support.cisco_psirt.os_version': {'title': _('OS version'), }, - '.software.support.cisco_psirt.Last_checked': {'title': _('Last checked'), 'paint': 'last_checked_status', 'filter': visuals.FilterInvtableText,}, + '.software.support.cisco_psirt.Last_checked': {'title': _('Last checked'), }, '.software.support.cisco_psirt.not_updated_for_x_days': {'title': _('don\'t show advisories not updated for X days'), }, '.software.support.cisco_psirt.dont_show_older_then': {'title': _('don\'t show advisories not updated after'), }, # SUGGESTION display hints '.software.support.cisco_suggestion:': {'title': _('Cisco suggested software'), - 'render': render_inv_dicttable_suggestion, 'keyorder': ['pid', 'ProductIDDescription', 'Last_checked', ], # 'view' : 'invciscosuggestion_of_host', }, '.software.support.cisco_suggestion:*.pid': {'title': _('PID (suggestion)'), }, '.software.support.cisco_suggestion:*.ProductIDDescription': {'title': _('Description'), }, - '.software.support.cisco_suggestion:*.Last_checked': {'title': _('Last checked'), 'paint': 'last_checked_status', 'filter': visuals.FilterInvtableText,}, + '.software.support.cisco_suggestion:*.Last_checked': {'title': _('Last checked'), }, '.software.support.cisco_suggestion:*.suggestion': {'title': _('Suggestion(s)'), }, - '.software.support.cisco_suggestion:*.suggestion:': {'render': render_inv_dicttable_suggestion_noqf, 'keyorder': ['productName', 'softwareType']}, + '.software.support.cisco_suggestion:*.suggestion:': {'keyorder': ['productName', 'softwareType']}, '.software.support.cisco_suggestion:*.suggestion:*.productName': {'title': _('Product name'), }, '.software.support.cisco_suggestion:*.suggestion:*.softwareType': {'title': _('Software type'), }, '.software.support.cisco_suggestion:*.suggestion:*.suggestion': {'title': _('Suggestion(s)'), }, - '.software.support.cisco_suggestion:*.suggestion:*.suggestion:': {'render': render_inv_dicttable_suggestion_noqf, 'keyorder': ['id', 'releaseFormat2', 'releaseDate']}, + '.software.support.cisco_suggestion:*.suggestion:*.suggestion:': {'keyorder': ['id', 'releaseFormat2', 'releaseDate']}, '.software.support.cisco_suggestion:*.suggestion:*.suggestion:*.id': {'title': _('ID'), }, '.software.support.cisco_suggestion:*.suggestion:*.suggestion:*.releaseDate': {'title': _('Release date'), }, '.software.support.cisco_suggestion:*.suggestion:*.suggestion:*.releaseFormat2': {'title': _('Version'), }, @@ -473,8 +152,8 @@ inventory_displayhints.update({ }) -declare_invtable_view('invciscoeox', '.hardware.system.support.cisco_eox:', _('Cisco EoX status'), _('Cisco EoX status')) -declare_invtable_view('invciscocontract', '.hardware.system.support.cisco_contract:', _('Cisco contract status'), _('Cisco contract status')) -declare_invtable_view('invciscopsirt', '.software.support.cisco_psirt.advisories:', _('Cisco PSIRT advisories'), _('Cisco PSIRT advisories')) -declare_invtable_view('invciscobugs', '.software.support.cisco_bug.bugs:', _('Cisco BUG IDs'), _('Cisco Bug IDs')) -#declare_invtable_view('invciscosuggestion', '.software.support.cisco_suggestion:', _('Cisco suggested software'), _('Cisco suggested software')) +# declare_invtable_view('invciscoeox', '.hardware.system.support.cisco_eox:', _('Cisco EoX status'), _('Cisco EoX status')) +# declare_invtable_view('invciscocontract', '.hardware.system.support.cisco_contract:', _('Cisco contract status'), _('Cisco contract status')) +# declare_invtable_view('invciscopsirt', '.software.support.cisco_psirt.advisories:', _('Cisco PSIRT advisories'), _('Cisco PSIRT advisories')) +# declare_invtable_view('invciscobugs', '.software.support.cisco_bug.bugs:', _('Cisco BUG IDs'), _('Cisco Bug IDs')) +# declare_invtable_view('invciscosuggestion', '.software.support.cisco_suggestion:', _('Cisco suggested software'), _('Cisco suggested software'))