Просмотр исходного кода

feat(core): Update plugin title rendering with default icon

Replaces inline plugin title HTML with a reusable template in
`template_code.py`. Adds a default icon for plugins without custom icons
and updates the table logic to use this template.
Removes redundant logic from the `render_title_long` method to improve
maintainability.
Changes the `order_by` field in `plugins.py` from `name` to
`title_long`.

Fixes #20264
Martin Hauser 5 месяцев назад
Родитель
Сommit
b24f8fb340

+ 2 - 16
netbox/core/tables/plugins.py

@@ -1,10 +1,8 @@
 import django_tables2 as tables
-from django.urls import reverse
-from django.utils.safestring import mark_safe
 from django.utils.translation import gettext_lazy as _
 
 from netbox.tables import BaseTable, columns
-from .template_code import PLUGIN_IS_INSTALLED
+from .template_code import PLUGIN_IS_INSTALLED, PLUGIN_NAME_TEMPLATE
 
 __all__ = (
     'CatalogPluginTable',
@@ -12,12 +10,6 @@ __all__ = (
 )
 
 
-PLUGIN_NAME_TEMPLATE = """
-<img class="plugin-icon" src="{{ record.icon_url }}">
-<a href="{% url 'core:plugin' record.config_name %}">{{ record.title_long }}</a>
-"""
-
-
 class PluginVersionTable(BaseTable):
     version = tables.Column(
         verbose_name=_('Version')
@@ -93,10 +85,4 @@ class CatalogPluginTable(BaseTable):
         )
         # List installed plugins first, then certified plugins, then
         # everything else (with each tranche ordered alphabetically)
-        order_by = ('-is_installed', '-is_certified', 'name')
-
-    def render_title_long(self, value, record):
-        if record.static:
-            return value
-        url = reverse('core:plugin', args=[record.config_name])
-        return mark_safe(f"<a href='{url}'>{value}</a>")
+        order_by = ('-is_installed', '-is_certified', 'title_long')

+ 10 - 0
netbox/core/tables/template_code.py

@@ -27,6 +27,16 @@ PLUGIN_IS_INSTALLED = """
 {% endif %}
 """
 
+PLUGIN_NAME_TEMPLATE = """
+{% load static %}
+{% if record.icon_url %}
+    <img class="plugin-icon" src="{{ record.icon_url }}">
+{% else %}
+    <img class="plugin-icon" src="{% static 'plugin-default.svg' %}">
+{% endif %}
+<a href="{% url 'core:plugin' record.config_name %}">{{ record.title_long }}</a>
+"""
+
 DATA_SOURCE_SYNC_BUTTON = """
 {% load helpers %}
 {% load i18n %}

+ 1 - 0
netbox/project-static/img/plugin-default.svg

@@ -0,0 +1 @@
+<svg  xmlns="http://www.w3.org/2000/svg"  width="24"  height="24"  viewBox="0 0 24 24"  fill="none"  stroke="currentColor"  stroke-width="2"  stroke-linecap="round"  stroke-linejoin="round"  class="icon icon-tabler icons-tabler-outline icon-tabler-box"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3l8 4.5l0 9l-8 4.5l-8 -4.5l0 -9l8 -4.5" /><path d="M12 12l8 -4.5" /><path d="M12 12l0 9" /><path d="M12 12l-8 -4.5" /></svg>