diff --git a/netbox/extras/models/tags.py b/netbox/extras/models/tags.py index 4c61f7f88..6268751b2 100644 --- a/netbox/extras/models/tags.py +++ b/netbox/extras/models/tags.py @@ -1,4 +1,5 @@ from django.db import models +from django.urls import reverse from django.utils.text import slugify from taggit.models import TagBase, GenericTaggedItemBase @@ -30,6 +31,9 @@ class Tag(ChangeLoggedModel, TagBase): class Meta: ordering = ['name'] + def get_absolute_url(self): + return reverse('extras:tag', args=[self.pk]) + def slugify(self, tag, i=None): # Allow Unicode in Tag slugs (avoids empty slugs for Tags with all-Unicode names) slug = slugify(tag, allow_unicode=True) diff --git a/netbox/extras/tables.py b/netbox/extras/tables.py index 24648b952..cd0ecbb36 100644 --- a/netbox/extras/tables.py +++ b/netbox/extras/tables.py @@ -38,6 +38,9 @@ OBJECTCHANGE_REQUEST_ID = """ class TagTable(BaseTable): pk = ToggleColumn() + name = tables.Column( + linkify=True + ) color = ColorColumn() actions = ButtonsColumn(Tag) diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index ee435307d..f38a2ecd3 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -13,6 +13,7 @@ urlpatterns = [ path('tags/import/', views.TagBulkImportView.as_view(), name='tag_import'), path('tags/edit/', views.TagBulkEditView.as_view(), name='tag_bulk_edit'), path('tags/delete/', views.TagBulkDeleteView.as_view(), name='tag_bulk_delete'), + path('tags//', views.TagView.as_view(), name='tag'), path('tags//edit/', views.TagEditView.as_view(), name='tag_edit'), path('tags//delete/', views.TagDeleteView.as_view(), name='tag_delete'), path('tags//changelog/', views.ObjectChangeLogView.as_view(), name='tag_changelog', kwargs={'model': Tag}), diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 841510dd3..64a28c7ac 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -34,6 +34,17 @@ class TagListView(generic.ObjectListView): table = tables.TagTable +class TagView(generic.ObjectView): + queryset = Tag.objects.all() + + def get_extra_context(self, request, instance): + tagged_items = TaggedItem.objects.filter(tag=instance) + + return { + 'tagged_item_count': tagged_items.count(), + } + + class TagEditView(generic.ObjectEditView): queryset = Tag.objects.all() model_form = forms.TagForm diff --git a/netbox/templates/extras/tag.html b/netbox/templates/extras/tag.html index 2cee8f882..cd6d09c29 100644 --- a/netbox/templates/extras/tag.html +++ b/netbox/templates/extras/tag.html @@ -1,98 +1,51 @@ -{% extends 'base.html' %} +{% extends 'generic/object.html' %} {% load helpers %} +{% load plugins %} -{% block header %} -
-
- -
-
-
-
- - - - -
-
-
-
-
- {% if perms.taggit.change_tag %} - - - Edit this tag - - {% endif %} - {% if perms.taggit.delete_tag %} - - - Delete this tag - - {% endif %} -
-

{% block title %}Tag: {{ object }}{% endblock %}

- {% include 'inc/created_updated.html' %} - +{% block breadcrumbs %} +
  • Tags
  • +
  • {{ object }}
  • {% endblock %} {% block content %} -
    -
    -
    -
    - Tag -
    - - - - - - - - - - - - - - - - - - - - -
    Name - {{ object.name }} -
    Slug - {{ object.slug }} -
    Tagged Items - {{ items_count }} -
    Color -   -
    Description - {{ object.description|placeholder }} -
    -
    -
    -
    - {% include 'panel_table.html' with table=items_table heading='Tagged Objects' %} - {% include 'inc/paginator.html' with paginator=items_table.paginator page=items_table.page %} -
    +
    +
    +
    +
    + Tag +
    + + + + + + + + + + + + + + + + + +
    Name{{ object.name }}
    Description{{ object.description|placeholder }}
    Color +   +
    Tagged Items + {{ tagged_item_count }} +
    + {% plugin_left_page object %} +
    +
    + {% plugin_right_page object %} +
    +
    +
    +
    + {% plugin_full_width_page object %} +
    +
    {% endblock %}