Clean up and document object, object list templates

This commit is contained in:
jeremystretch 2022-02-07 16:50:17 -05:00
parent 26db326483
commit 624eda297f
11 changed files with 67 additions and 72 deletions

View File

@ -803,7 +803,6 @@ class DeviceTypeView(generic.ObjectView):
return { return {
'instance_count': instance_count, 'instance_count': instance_count,
'active_tab': 'devicetype',
} }
@ -953,11 +952,10 @@ class ModuleTypeView(generic.ObjectView):
queryset = ModuleType.objects.prefetch_related('manufacturer') queryset = ModuleType.objects.prefetch_related('manufacturer')
def get_extra_context(self, request, instance): def get_extra_context(self, request, instance):
# instance_count = Module.objects.restrict(request.user).filter(device_type=instance).count() instance_count = Module.objects.restrict(request.user).filter(module_type=instance).count()
return { return {
# 'instance_count': instance_count, 'instance_count': instance_count,
'active_tab': 'moduletype',
} }
@ -1570,7 +1568,6 @@ class DeviceView(generic.ObjectView):
return { return {
'services': services, 'services': services,
'vc_members': vc_members, 'vc_members': vc_members,
'active_tab': 'device',
} }

View File

@ -7,7 +7,7 @@ from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import FieldDoesNotExist, ValidationError from django.core.exceptions import FieldDoesNotExist, ValidationError
from django.db import transaction, IntegrityError from django.db import transaction, IntegrityError
from django.db.models import ManyToManyField, ProtectedError from django.db.models import ManyToManyField, ProtectedError
from django.forms import Form, ModelMultipleChoiceField, MultipleHiddenInput, Textarea from django.forms import Form, ModelMultipleChoiceField, MultipleHiddenInput
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
from django_tables2.export import TableExport from django_tables2.export import TableExport
@ -178,7 +178,7 @@ class ObjectListView(BaseMultiObjectView):
}) })
context = { context = {
'content_type': content_type, 'model': model,
'table': table, 'table': table,
'permissions': permissions, 'permissions': permissions,
'action_buttons': self.action_buttons, 'action_buttons': self.action_buttons,

View File

@ -95,13 +95,7 @@
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block tab_items %} {% block extra_tabs %}
<li role="presentation" class="nav-item">
<a href="{% url 'dcim:device' pk=object.pk %}" class="nav-link{% if active_tab == 'device' %} active{% endif %}">
Device
</a>
</li>
{% with tab_name='device-bays' devicebay_count=object.devicebays.count %} {% with tab_name='device-bays' devicebay_count=object.devicebays.count %}
{% if active_tab == tab_name or devicebay_count %} {% if active_tab == tab_name or devicebay_count %}
<li role="presentation" class="nav-item"> <li role="presentation" class="nav-item">

View File

@ -52,13 +52,7 @@
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block tab_items %} {% block extra_tabs %}
<li role="presentation" class="nav-item">
<a href="{% url 'dcim:devicetype' pk=object.pk %}" class="nav-link{% if active_tab == 'devicetype' %} active{% endif %}">
Device Type
</a>
</li>
{% with tab_name='device-bay-templates' devicebay_count=object.devicebaytemplates.count %} {% with tab_name='device-bay-templates' devicebay_count=object.devicebaytemplates.count %}
{% if active_tab == tab_name or devicebay_count %} {% if active_tab == tab_name or devicebay_count %}
<li role="presentation" class="nav-item"> <li role="presentation" class="nav-item">

View File

@ -22,12 +22,10 @@
<td>Part Number</td> <td>Part Number</td>
<td>{{ object.part_number|placeholder }}</td> <td>{{ object.part_number|placeholder }}</td>
</tr> </tr>
{% comment %}
<tr> <tr>
<td>Instances</td> <td>Instances</td>
<td><a href="{% url 'dcim:module_list' %}?module_type_id={{ object.pk }}">{{ instance_count }}</a></td> <td><a href="{% url 'dcim:module_list' %}?module_type_id={{ object.pk }}">{{ instance_count }}</a></td>
</tr> </tr>
{% endcomment %}
</table> </table>
</div> </div>
</div> </div>

View File

@ -43,13 +43,7 @@
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block tab_items %} {% block extra_tabs %}
<li role="presentation" class="nav-item">
<a href="{% url 'dcim:moduletype' pk=object.pk %}" class="nav-link{% if active_tab == 'moduletype' %} active{% endif %}">
Module Type
</a>
</li>
{% with interface_count=object.interfacetemplates.count %} {% with interface_count=object.interfacetemplates.count %}
{% if interface_count %} {% if interface_count %}
<li role="presentation" class="nav-item"> <li role="presentation" class="nav-item">

View File

@ -5,6 +5,18 @@
{% load perms %} {% load perms %}
{% load plugins %} {% load plugins %}
{% comment %}
Blocks:
breadcrumbs: Breadcrumb list items (HTML <li> elements)
object_identifier: Unique identifier for the object
extra_controls: Additional action buttons to display
extra_tabs: Additional tabs to include
content: Page content
Context:
object: The object instance being viewed
{% endcomment %}
{% block header %} {% block header %}
<div class="d-flex justify-content-between align-items-center"> <div class="d-flex justify-content-between align-items-center">
{# Breadcrumbs #} {# Breadcrumbs #}
@ -66,11 +78,15 @@
{% block tabs %} {% block tabs %}
<ul class="nav nav-tabs px-3"> <ul class="nav nav-tabs px-3">
{% block tab_items %} {# Primary tab #}
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<a class="nav-link{% if not active_tab %} active{% endif %}" href="{{ object.get_absolute_url }}">{{ object|meta:"verbose_name"|bettertitle }}</a> <a class="nav-link{% if not active_tab %} active{% endif %}" href="{{ object.get_absolute_url }}">{{ object|meta:"verbose_name"|bettertitle }}</a>
</li> </li>
{% endblock tab_items %}
{# Include any additional tabs #}
{% block extra_tabs %}{% endblock %}
{# Object journal #}
{% if perms.extras.view_journalentry %} {% if perms.extras.view_journalentry %}
{% with journal_viewname=object|viewname:'journal' %} {% with journal_viewname=object|viewname:'journal' %}
{% url journal_viewname pk=object.pk as journal_url %} {% url journal_viewname pk=object.pk as journal_url %}
@ -83,6 +99,8 @@
{% endif %} {% endif %}
{% endwith %} {% endwith %}
{% endif %} {% endif %}
{# Object changelog #}
{% if perms.extras.view_objectchange %} {% if perms.extras.view_objectchange %}
{% with changelog_viewname=object|viewname:'changelog' %} {% with changelog_viewname=object|viewname:'changelog' %}
{% url changelog_viewname pk=object.pk as changelog_url %} {% url changelog_viewname pk=object.pk as changelog_url %}

View File

@ -4,20 +4,37 @@
{% load render_table from django_tables2 %} {% load render_table from django_tables2 %}
{% load static %} {% load static %}
{% block title %}{{ content_type.model_class|meta:"verbose_name_plural"|bettertitle }}{% endblock %} {% comment %}
Blocks:
extra_controls: Additional action buttons
bulk_buttons: Additional bulk action buttons to display beneath the objects
list
Context:
model: The model class being listed
table: The table class used for rendering the list of objects
permissions: A mapping of add/change/delete permissions to boolean indicating
whether the current user possesses each of them. Controls the display of
add/edit/delete buttons.
action_buttons: A list of buttons to display. Options are add, import, export.
filter_form: The bound filterset form for filtering the objects list (optional)
return_url: Return URL to use for bulk actions (optional)
{% endcomment %}
{% block title %}{{ model|meta:"verbose_name_plural"|bettertitle }}{% endblock %}
{% block controls %} {% block controls %}
<div class="controls"> <div class="controls">
<div class="control-group"> <div class="control-group">
{% block extra_controls %}{% endblock %} {% block extra_controls %}{% endblock %}
{% if permissions.add and 'add' in action_buttons %} {% if permissions.add and 'add' in action_buttons %}
{% add_button content_type.model_class|validated_viewname:"add" %} {% add_button model|validated_viewname:"add" %}
{% endif %} {% endif %}
{% if permissions.add and 'import' in action_buttons %} {% if permissions.add and 'import' in action_buttons %}
{% import_button content_type.model_class|validated_viewname:"import" %} {% import_button model|validated_viewname:"import" %}
{% endif %} {% endif %}
{% if 'export' in action_buttons %} {% if 'export' in action_buttons %}
{% export_button content_type %} {% export_button model|content_type %}
{% endif %} {% endif %}
</div> </div>
</div> </div>
@ -25,22 +42,20 @@
{% block tabs %} {% block tabs %}
<ul class="nav nav-tabs px-3"> <ul class="nav nav-tabs px-3">
{% block tab_items %} <li class="nav-item" role="presentation">
<button class="nav-link active" id="object-list-tab" data-bs-toggle="tab" data-bs-target="#object-list" type="button" role="tab" aria-controls="edit-form" aria-selected="true">
Records
{% badge table.page.paginator.count %}
</button>
</li>
{% if filter_form %}
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="nav-link active" id="object-list-tab" data-bs-toggle="tab" data-bs-target="#object-list" type="button" role="tab" aria-controls="edit-form" aria-selected="true"> <button class="nav-link" id="filters-form-tab" data-bs-toggle="tab" data-bs-target="#filters-form" type="button" role="tab" aria-controls="object-list" aria-selected="false">
Records Filters
{% badge table.page.paginator.count %} {% if filter_form %}{% badge filter_form.changed_data|length bg_class="primary" %}{% endif %}
</button> </button>
</li> </li>
{% if filter_form %} {% endif %}
<li class="nav-item" role="presentation">
<button class="nav-link" id="filters-form-tab" data-bs-toggle="tab" data-bs-target="#filters-form" type="button" role="tab" aria-controls="object-list" aria-selected="false">
Filters
{% if filter_form %}{% badge filter_form.changed_data|length bg_class="primary" %}{% endif %}
</button>
</li>
{% endif %}
{% endblock tab_items %}
</ul> </ul>
{% endblock tabs %} {% endblock tabs %}
@ -57,7 +72,7 @@
{# "Select all" form #} {# "Select all" form #}
{% if table.paginator.num_pages > 1 %} {% if table.paginator.num_pages > 1 %}
{% with bulk_edit_url=content_type.model_class|validated_viewname:"bulk_edit" bulk_delete_url=content_type.model_class|validated_viewname:"bulk_delete" %} {% with bulk_edit_url=model|validated_viewname:"bulk_edit" bulk_delete_url=model|validated_viewname:"bulk_delete" %}
<div id="select-all-box" class="d-none card noprint"> <div id="select-all-box" class="d-none card noprint">
<form method="post" class="form col-md-12"> <form method="post" class="form col-md-12">
{% csrf_token %} {% csrf_token %}
@ -102,7 +117,7 @@
{# Form buttons #} {# Form buttons #}
{% if permissions.change or permissions.delete %} {% if permissions.change or permissions.delete %}
{% with bulk_edit_url=content_type.model_class|validated_viewname:"bulk_edit" bulk_delete_url=content_type.model_class|validated_viewname:"bulk_delete" %} {% with bulk_edit_url=model|validated_viewname:"bulk_edit" bulk_delete_url=model|validated_viewname:"bulk_delete" %}
<div class="noprint bulk-buttons"> <div class="noprint bulk-buttons">
<div class="bulk-button-group"> <div class="bulk-button-group">
{% block bulk_buttons %}{% endblock %} {% block bulk_buttons %}{% endblock %}

View File

@ -7,12 +7,7 @@
<li class="breadcrumb-item"><a href="{% url 'ipam:aggregate_list' %}?rir_id={{ object.rir.pk }}">{{ object.rir }}</a></li> <li class="breadcrumb-item"><a href="{% url 'ipam:aggregate_list' %}?rir_id={{ object.rir.pk }}">{{ object.rir }}</a></li>
{% endblock %} {% endblock %}
{% block tab_items %} {% block extra_tabs %}
<li role="presentation" class="nav-item">
<a class="nav-link{% if not active_tab %} active{% endif %}" href="{{ object.get_absolute_url }}">
Aggregate
</a>
</li>
{% if perms.ipam.view_prefix %} {% if perms.ipam.view_prefix %}
<li role="presentation" class="nav-item"> <li role="presentation" class="nav-item">
<a class="nav-link{% if active_tab == 'prefixes' %} active{% endif %}" href="{% url 'ipam:aggregate_prefixes' pk=object.pk %}"> <a class="nav-link{% if active_tab == 'prefixes' %} active{% endif %}" href="{% url 'ipam:aggregate_prefixes' pk=object.pk %}">

View File

@ -9,12 +9,7 @@
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block tab_items %} {% block extra_tabs %}
<li role="presentation" class="nav-item">
<a class="nav-link{% if not active_tab %} active{% endif %}" href="{{ object.get_absolute_url }}">
IP Range
</a>
</li>
{% if perms.ipam.view_ipaddress %} {% if perms.ipam.view_ipaddress %}
<li role="presentation" class="nav-item"> <li role="presentation" class="nav-item">
<a class="nav-link{% if active_tab == 'ip-addresses' %} active{% endif %}" href="{% url 'ipam:iprange_ipaddresses' pk=object.pk %}"> <a class="nav-link{% if active_tab == 'ip-addresses' %} active{% endif %}" href="{% url 'ipam:iprange_ipaddresses' pk=object.pk %}">

View File

@ -9,12 +9,7 @@
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block tab_items %} {% block extra_tabs %}
<li role="presentation" class="nav-item">
<a class="nav-link{% if not active_tab %} active{% endif %}" href="{% url 'ipam:prefix' pk=object.pk %}">
Prefix
</a>
</li>
<li role="presentation" class="nav-item"> <li role="presentation" class="nav-item">
<a class="nav-link{% if active_tab == 'prefixes' %} active{% endif %}" href="{% url 'ipam:prefix_prefixes' pk=object.pk %}"> <a class="nav-link{% if active_tab == 'prefixes' %} active{% endif %}" href="{% url 'ipam:prefix_prefixes' pk=object.pk %}">
Child Prefixes {% badge object.get_child_prefixes.count %} Child Prefixes {% badge object.get_child_prefixes.count %}