mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-25 01:48:38 -06:00
Add dedicated view for tags
This commit is contained in:
parent
981e7017bb
commit
36c903da04
@ -1,4 +1,5 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.urls import reverse
|
||||||
from django.utils.text import slugify
|
from django.utils.text import slugify
|
||||||
from taggit.models import TagBase, GenericTaggedItemBase
|
from taggit.models import TagBase, GenericTaggedItemBase
|
||||||
|
|
||||||
@ -30,6 +31,9 @@ class Tag(ChangeLoggedModel, TagBase):
|
|||||||
class Meta:
|
class Meta:
|
||||||
ordering = ['name']
|
ordering = ['name']
|
||||||
|
|
||||||
|
def get_absolute_url(self):
|
||||||
|
return reverse('extras:tag', args=[self.pk])
|
||||||
|
|
||||||
def slugify(self, tag, i=None):
|
def slugify(self, tag, i=None):
|
||||||
# Allow Unicode in Tag slugs (avoids empty slugs for Tags with all-Unicode names)
|
# Allow Unicode in Tag slugs (avoids empty slugs for Tags with all-Unicode names)
|
||||||
slug = slugify(tag, allow_unicode=True)
|
slug = slugify(tag, allow_unicode=True)
|
||||||
|
@ -38,6 +38,9 @@ OBJECTCHANGE_REQUEST_ID = """
|
|||||||
|
|
||||||
class TagTable(BaseTable):
|
class TagTable(BaseTable):
|
||||||
pk = ToggleColumn()
|
pk = ToggleColumn()
|
||||||
|
name = tables.Column(
|
||||||
|
linkify=True
|
||||||
|
)
|
||||||
color = ColorColumn()
|
color = ColorColumn()
|
||||||
actions = ButtonsColumn(Tag)
|
actions = ButtonsColumn(Tag)
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@ urlpatterns = [
|
|||||||
path('tags/import/', views.TagBulkImportView.as_view(), name='tag_import'),
|
path('tags/import/', views.TagBulkImportView.as_view(), name='tag_import'),
|
||||||
path('tags/edit/', views.TagBulkEditView.as_view(), name='tag_bulk_edit'),
|
path('tags/edit/', views.TagBulkEditView.as_view(), name='tag_bulk_edit'),
|
||||||
path('tags/delete/', views.TagBulkDeleteView.as_view(), name='tag_bulk_delete'),
|
path('tags/delete/', views.TagBulkDeleteView.as_view(), name='tag_bulk_delete'),
|
||||||
|
path('tags/<int:pk>/', views.TagView.as_view(), name='tag'),
|
||||||
path('tags/<int:pk>/edit/', views.TagEditView.as_view(), name='tag_edit'),
|
path('tags/<int:pk>/edit/', views.TagEditView.as_view(), name='tag_edit'),
|
||||||
path('tags/<int:pk>/delete/', views.TagDeleteView.as_view(), name='tag_delete'),
|
path('tags/<int:pk>/delete/', views.TagDeleteView.as_view(), name='tag_delete'),
|
||||||
path('tags/<int:pk>/changelog/', views.ObjectChangeLogView.as_view(), name='tag_changelog', kwargs={'model': Tag}),
|
path('tags/<int:pk>/changelog/', views.ObjectChangeLogView.as_view(), name='tag_changelog', kwargs={'model': Tag}),
|
||||||
|
@ -34,6 +34,17 @@ class TagListView(generic.ObjectListView):
|
|||||||
table = tables.TagTable
|
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):
|
class TagEditView(generic.ObjectEditView):
|
||||||
queryset = Tag.objects.all()
|
queryset = Tag.objects.all()
|
||||||
model_form = forms.TagForm
|
model_form = forms.TagForm
|
||||||
|
@ -1,98 +1,51 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'generic/object.html' %}
|
||||||
{% load helpers %}
|
{% load helpers %}
|
||||||
|
{% load plugins %}
|
||||||
|
|
||||||
{% block header %}
|
{% block breadcrumbs %}
|
||||||
<div class="row">
|
<li><a href="{% url 'extras:tag_list' %}">Tags</a></li>
|
||||||
<div class="col-sm-8 col-md-9">
|
<li>{{ object }}</li>
|
||||||
<ol class="breadcrumb">
|
|
||||||
<li><a href="{% url 'extras:tag_list' %}">Tags</a></li>
|
|
||||||
<li>{{ object }}</li>
|
|
||||||
</ol>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-4 col-md-3">
|
|
||||||
<form action="{% url 'extras:tag_list' %}" method="get">
|
|
||||||
<div class="input-group">
|
|
||||||
<input type="text" name="q" class="form-control" />
|
|
||||||
<span class="input-group-btn">
|
|
||||||
<button type="submit" class="btn btn-primary">
|
|
||||||
<span class="mdi mdi-magnify" aria-hidden="true"></span>
|
|
||||||
</button>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="pull-right">
|
|
||||||
{% if perms.taggit.change_tag %}
|
|
||||||
<a href="{% url 'extras:tag_edit' slug=object.slug %}" class="btn btn-warning">
|
|
||||||
<span class="mdi mdi-pencil" aria-hidden="true"></span>
|
|
||||||
Edit this tag
|
|
||||||
</a>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.taggit.delete_tag %}
|
|
||||||
<a href="{% url 'extras:tag_delete' slug=object.slug %}" class="btn btn-danger">
|
|
||||||
<span class="mdi mdi-trash-can-outline" aria-hidden="true"></span>
|
|
||||||
Delete this tag
|
|
||||||
</a>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
<h1>{% block title %}Tag: {{ object }}{% endblock %}</h1>
|
|
||||||
{% include 'inc/created_updated.html' %}
|
|
||||||
<ul class="nav nav-tabs">
|
|
||||||
<li role="presentation"{% if not active_tab %} class="active"{% endif %}>
|
|
||||||
<a href="{{ object.get_absolute_url }}">Tag</a>
|
|
||||||
</li>
|
|
||||||
{% if perms.extras.view_objectchange %}
|
|
||||||
<li role="presentation"{% if active_tab == 'changelog' %} class="active"{% endif %}>
|
|
||||||
<a href="{% url 'extras:tag_changelog' pk=object.pk %}">Change Log</a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
</ul>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<strong>Tag</strong>
|
<strong>Tag</strong>
|
||||||
</div>
|
</div>
|
||||||
<table class="table table-hover panel-body attr-table">
|
<table class="table table-hover panel-body attr-table">
|
||||||
<tr>
|
<tr>
|
||||||
<td>Name</td>
|
<td>Name</td>
|
||||||
<td>
|
<td>{{ object.name }}</td>
|
||||||
{{ object.name }}
|
</tr>
|
||||||
</td>
|
<tr>
|
||||||
</tr>
|
<td>Description</td>
|
||||||
<tr>
|
<td>{{ object.description|placeholder }}</td>
|
||||||
<td>Slug</td>
|
</tr>
|
||||||
<td>
|
<tr>
|
||||||
{{ object.slug }}
|
<td>Color</td>
|
||||||
</td>
|
<td>
|
||||||
</tr>
|
<span class="label color-block" style="background-color: #{{ object.color }}"> </span>
|
||||||
<tr>
|
</td>
|
||||||
<td>Tagged Items</td>
|
</tr>
|
||||||
<td>
|
<tr>
|
||||||
{{ items_count }}
|
<td>Tagged Items</td>
|
||||||
</td>
|
<td>
|
||||||
</tr>
|
{{ tagged_item_count }}
|
||||||
<tr>
|
</td>
|
||||||
<td>Color</td>
|
</tr>
|
||||||
<td>
|
</table>
|
||||||
<span class="label color-block" style="background-color: #{{ object.color }}"> </span>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Description</td>
|
|
||||||
<td>
|
|
||||||
{{ object.description|placeholder }}
|
|
||||||
</td>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
{% include 'panel_table.html' with table=items_table heading='Tagged Objects' %}
|
|
||||||
{% include 'inc/paginator.html' with paginator=items_table.paginator page=items_table.page %}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
{% plugin_left_page object %}
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
{% plugin_right_page object %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
{% plugin_full_width_page object %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
Loading…
Reference in New Issue
Block a user