From 3a62e9a3227d2899613f2873469b82a0dd488bed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristi=20V=C3=AEjdea?= Date: Mon, 4 Mar 2019 03:24:45 +0200 Subject: [PATCH 01/17] Resolve drf-yasg `ref_name` conflicts This solves the problem of distinct serializers being confused because they have the same class name (e.g. `InterfaceSerializer`) Fixes #2065. --- netbox/utilities/custom_inspectors.py | 22 +++++++++++++++++++++- requirements.txt | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/netbox/utilities/custom_inspectors.py b/netbox/utilities/custom_inspectors.py index 5975788bc..577e3c202 100644 --- a/netbox/utilities/custom_inspectors.py +++ b/netbox/utilities/custom_inspectors.py @@ -1,14 +1,24 @@ from drf_yasg import openapi from drf_yasg.inspectors import FieldInspector, NotHandled, PaginatorInspector, FilterInspector, SwaggerAutoSchema +from drf_yasg.utils import get_serializer_ref_name from rest_framework.fields import ChoiceField from rest_framework.relations import ManyRelatedField from taggit_serializer.serializers import TagListSerializerField +from dcim.api.serializers import InterfaceSerializer as DCIMInterfaceSerializer +from virtualization.api.serializers import InterfaceSerializer as VirtualMachineInterfaceSerializer from extras.api.customfields import CustomFieldsSerializer from utilities.api import ChoiceField, SerializedPKRelatedField, WritableNestedSerializer +# this might be ugly, but it limits drf_yasg-specific code to this file +DCIMInterfaceSerializer.Meta.ref_name = 'DCIMInterface' +VirtualMachineInterfaceSerializer.Meta.ref_name = 'VirtualMachineInterface' + + class NetBoxSwaggerAutoSchema(SwaggerAutoSchema): + writable_serializers = {} + def get_request_serializer(self): serializer = super().get_request_serializer() @@ -21,7 +31,17 @@ class NetBoxSwaggerAutoSchema(SwaggerAutoSchema): properties[child_name] = None if properties: - writable_class = type('Writable' + type(serializer).__name__, (type(serializer),), properties) + if type(serializer) not in self.writable_serializers: + writable_name = 'Writable' + type(serializer).__name__ + meta_class = getattr(type(serializer), 'Meta', None) + if meta_class: + ref_name = 'Writable' + get_serializer_ref_name(serializer) + writable_meta = type('Meta', (meta_class,), {'ref_name': ref_name}) + properties['Meta'] = writable_meta + + self.writable_serializers[type(serializer)] = type(writable_name, (type(serializer),), properties) + + writable_class = self.writable_serializers[type(serializer)] serializer = writable_class() return serializer diff --git a/requirements.txt b/requirements.txt index e313e9a69..49e7cf39e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,7 +8,7 @@ django-taggit==0.23.0 django-taggit-serializer==0.1.7 django-timezone-field==3.0 djangorestframework==3.9.0 -drf-yasg[validation]==1.11.1 +drf-yasg[validation]==1.14.0 graphviz==0.10.1 Markdown==2.6.11 netaddr==0.7.19 From c208d8fc2e43b811ea7ffb8068ff8298bb1230b0 Mon Sep 17 00:00:00 2001 From: dansheps Date: Tue, 5 Mar 2019 15:42:47 -0600 Subject: [PATCH 02/17] * Added CSS to: * Hide URLs * Hide elements with "noprint" class * Added noprint to: * Header Panel * Search Panel, Tags Panel * Buttons * Various list elements * Related elements --- netbox/circuits/tables.py | 2 +- netbox/dcim/tables.py | 16 +++++----- netbox/extras/tables.py | 2 +- netbox/ipam/tables.py | 8 ++--- netbox/project-static/css/base.css | 17 +++++++++++ netbox/secrets/tables.py | 2 +- netbox/templates/_base.html | 2 +- netbox/templates/circuits/circuit.html | 4 +-- netbox/templates/circuits/circuit_list.html | 4 +-- .../templates/circuits/circuittype_list.html | 2 +- netbox/templates/circuits/provider.html | 6 ++-- netbox/templates/circuits/provider_list.html | 4 +-- netbox/templates/dcim/cable.html | 4 +-- netbox/templates/dcim/cable_list.html | 4 +-- .../dcim/console_connections_list.html | 4 +-- netbox/templates/dcim/device.html | 30 +++++++++---------- netbox/templates/dcim/device_inventory.html | 2 +- netbox/templates/dcim/device_list.html | 4 +-- netbox/templates/dcim/devicerole_list.html | 2 +- netbox/templates/dcim/devicetype.html | 4 +-- netbox/templates/dcim/devicetype_list.html | 4 +-- netbox/templates/dcim/inc/consoleport.html | 2 +- .../templates/dcim/inc/consoleserverport.html | 2 +- netbox/templates/dcim/inc/devicebay.html | 2 +- .../dcim/inc/devicetype_component_table.html | 2 +- netbox/templates/dcim/inc/frontport.html | 2 +- netbox/templates/dcim/inc/interface.html | 4 +-- netbox/templates/dcim/inc/inventoryitem.html | 2 +- netbox/templates/dcim/inc/poweroutlet.html | 2 +- netbox/templates/dcim/inc/powerport.html | 2 +- netbox/templates/dcim/inc/rearport.html | 2 +- netbox/templates/dcim/interface.html | 4 +-- .../dcim/interface_connections_list.html | 4 +-- netbox/templates/dcim/inventoryitem_list.html | 4 +-- netbox/templates/dcim/manufacturer_list.html | 2 +- netbox/templates/dcim/platform_list.html | 2 +- .../dcim/power_connections_list.html | 4 +-- netbox/templates/dcim/rack.html | 12 ++++---- .../templates/dcim/rack_elevation_list.html | 4 +-- netbox/templates/dcim/rack_list.html | 4 +-- netbox/templates/dcim/rackgroup_list.html | 4 +-- .../templates/dcim/rackreservation_list.html | 2 +- netbox/templates/dcim/rackrole_list.html | 2 +- netbox/templates/dcim/region_list.html | 4 +-- netbox/templates/dcim/site.html | 12 ++++---- netbox/templates/dcim/site_list.html | 4 +-- .../templates/dcim/virtualchassis_list.html | 4 +-- netbox/templates/extras/configcontext.html | 4 +-- .../templates/extras/configcontext_list.html | 4 +-- netbox/templates/extras/objectchange.html | 4 +-- .../templates/extras/objectchange_list.html | 4 +-- netbox/templates/extras/report.html | 4 +-- netbox/templates/inc/image_attachments.html | 2 +- netbox/templates/inc/search_panel.html | 2 +- netbox/templates/ipam/aggregate.html | 4 +-- netbox/templates/ipam/aggregate_list.html | 4 +-- netbox/templates/ipam/inc/service.html | 2 +- netbox/templates/ipam/ipaddress.html | 6 ++-- netbox/templates/ipam/ipaddress_list.html | 4 +-- netbox/templates/ipam/prefix.html | 4 +-- netbox/templates/ipam/prefix_list.html | 4 +-- netbox/templates/ipam/rir_list.html | 4 +-- netbox/templates/ipam/role_list.html | 2 +- netbox/templates/ipam/service.html | 2 +- netbox/templates/ipam/service_list.html | 4 +-- netbox/templates/ipam/vlan.html | 6 ++-- netbox/templates/ipam/vlan_list.html | 4 +-- netbox/templates/ipam/vlangroup_list.html | 4 +-- netbox/templates/ipam/vlangroup_vlans.html | 2 +- netbox/templates/ipam/vrf.html | 4 +-- netbox/templates/ipam/vrf_list.html | 4 +-- .../secrets/inc/private_key_modal.html | 2 +- netbox/templates/secrets/inc/secret_tr.html | 2 +- netbox/templates/secrets/secret.html | 6 ++-- netbox/templates/secrets/secret_list.html | 4 +-- netbox/templates/secrets/secretrole_list.html | 2 +- netbox/templates/tenancy/tenant.html | 4 +-- netbox/templates/tenancy/tenant_list.html | 4 +-- .../templates/tenancy/tenantgroup_list.html | 2 +- netbox/templates/users/api_tokens.html | 2 +- netbox/templates/users/userkey.html | 4 +-- netbox/templates/utilities/obj_table.html | 4 +-- netbox/templates/virtualization/cluster.html | 6 ++-- .../virtualization/cluster_add_devices.html | 2 +- .../virtualization/cluster_list.html | 4 +-- .../virtualization/clustergroup_list.html | 2 +- .../virtualization/clustertype_list.html | 2 +- .../virtualization/virtualmachine.html | 8 ++--- .../virtualization/virtualmachine_list.html | 4 +-- netbox/tenancy/tables.py | 2 +- netbox/virtualization/tables.py | 4 +-- 91 files changed, 198 insertions(+), 181 deletions(-) diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py index c6a215db8..1cddeffb2 100644 --- a/netbox/circuits/tables.py +++ b/netbox/circuits/tables.py @@ -59,7 +59,7 @@ class CircuitTypeTable(BaseTable): name = tables.LinkColumn() circuit_count = tables.Column(verbose_name='Circuits') actions = tables.TemplateColumn( - template_code=CIRCUITTYPE_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='' + template_code=CIRCUITTYPE_ACTIONS, attrs={'td': {'class': 'text-right noprint'}}, verbose_name='' ) class Meta(BaseTable.Meta): diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index 5649c10ef..436b9053d 100644 --- a/netbox/dcim/tables.py +++ b/netbox/dcim/tables.py @@ -196,7 +196,7 @@ class RegionTable(BaseTable): slug = tables.Column(verbose_name='Slug') actions = tables.TemplateColumn( template_code=REGION_ACTIONS, - attrs={'td': {'class': 'text-right'}}, + attrs={'td': {'class': 'text-right noprint'}}, verbose_name='' ) @@ -239,7 +239,7 @@ class RackGroupTable(BaseTable): slug = tables.Column() actions = tables.TemplateColumn( template_code=RACKGROUP_ACTIONS, - attrs={'td': {'class': 'text-right'}}, + attrs={'td': {'class': 'text-right noprint'}}, verbose_name='' ) @@ -258,7 +258,7 @@ class RackRoleTable(BaseTable): rack_count = tables.Column(verbose_name='Racks') color = tables.TemplateColumn(COLOR_LABEL, verbose_name='Color') slug = tables.Column(verbose_name='Slug') - actions = tables.TemplateColumn(template_code=RACKROLE_ACTIONS, attrs={'td': {'class': 'text-right'}}, + actions = tables.TemplateColumn(template_code=RACKROLE_ACTIONS, attrs={'td': {'class': 'text-right noprint'}}, verbose_name='') class Meta(BaseTable.Meta): @@ -309,7 +309,7 @@ class RackReservationTable(BaseTable): rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')]) unit_list = tables.Column(orderable=False, verbose_name='Units') actions = tables.TemplateColumn( - template_code=RACKRESERVATION_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='' + template_code=RACKRESERVATION_ACTIONS, attrs={'td': {'class': 'text-right noprint'}}, verbose_name='' ) class Meta(BaseTable.Meta): @@ -327,7 +327,7 @@ class ManufacturerTable(BaseTable): devicetype_count = tables.Column(verbose_name='Device Types') platform_count = tables.Column(verbose_name='Platforms') slug = tables.Column(verbose_name='Slug') - actions = tables.TemplateColumn(template_code=MANUFACTURER_ACTIONS, attrs={'td': {'class': 'text-right'}}, + actions = tables.TemplateColumn(template_code=MANUFACTURER_ACTIONS, attrs={'td': {'class': 'text-right noprint'}}, verbose_name='') class Meta(BaseTable.Meta): @@ -463,7 +463,7 @@ class DeviceRoleTable(BaseTable): slug = tables.Column(verbose_name='Slug') actions = tables.TemplateColumn( template_code=DEVICEROLE_ACTIONS, - attrs={'td': {'class': 'text-right'}}, + attrs={'td': {'class': 'text-right noprint'}}, verbose_name='' ) @@ -492,7 +492,7 @@ class PlatformTable(BaseTable): ) actions = tables.TemplateColumn( template_code=PLATFORM_ACTIONS, - attrs={'td': {'class': 'text-right'}}, + attrs={'td': {'class': 'text-right noprint'}}, verbose_name='' ) @@ -779,7 +779,7 @@ class VirtualChassisTable(BaseTable): member_count = tables.Column(verbose_name='Members') actions = tables.TemplateColumn( template_code=VIRTUALCHASSIS_ACTIONS, - attrs={'td': {'class': 'text-right'}}, + attrs={'td': {'class': 'text-right noprint'}}, verbose_name='' ) diff --git a/netbox/extras/tables.py b/netbox/extras/tables.py index 5fab8910f..f6933bf48 100644 --- a/netbox/extras/tables.py +++ b/netbox/extras/tables.py @@ -68,7 +68,7 @@ class TagTable(BaseTable): ) actions = tables.TemplateColumn( template_code=TAG_ACTIONS, - attrs={'td': {'class': 'text-right'}}, + attrs={'td': {'class': 'text-right noprint'}}, verbose_name='' ) diff --git a/netbox/ipam/tables.py b/netbox/ipam/tables.py index 026cbc980..3d46452b2 100644 --- a/netbox/ipam/tables.py +++ b/netbox/ipam/tables.py @@ -203,7 +203,7 @@ class RIRTable(BaseTable): name = tables.LinkColumn(verbose_name='Name') is_private = BooleanColumn(verbose_name='Private') aggregate_count = tables.Column(verbose_name='Aggregates') - actions = tables.TemplateColumn(template_code=RIR_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='') + actions = tables.TemplateColumn(template_code=RIR_ACTIONS, attrs={'td': {'class': 'text-right noprint'}}, verbose_name='') class Meta(BaseTable.Meta): model = RIR @@ -288,7 +288,7 @@ class RoleTable(BaseTable): orderable=False, verbose_name='VLANs' ) - actions = tables.TemplateColumn(template_code=ROLE_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='') + actions = tables.TemplateColumn(template_code=ROLE_ACTIONS, attrs={'td': {'class': 'text-right noprint'}}, verbose_name='') class Meta(BaseTable.Meta): model = Role @@ -392,7 +392,7 @@ class VLANGroupTable(BaseTable): site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site') vlan_count = tables.Column(verbose_name='VLANs') slug = tables.Column(verbose_name='Slug') - actions = tables.TemplateColumn(template_code=VLANGROUP_ACTIONS, attrs={'td': {'class': 'text-right'}}, + actions = tables.TemplateColumn(template_code=VLANGROUP_ACTIONS, attrs={'td': {'class': 'text-right noprint'}}, verbose_name='') class Meta(BaseTable.Meta): @@ -437,7 +437,7 @@ class VLANMemberTable(BaseTable): ) actions = tables.TemplateColumn( template_code=VLAN_MEMBER_ACTIONS, - attrs={'td': {'class': 'text-right'}}, + attrs={'td': {'class': 'text-right noprint'}}, verbose_name='' ) diff --git a/netbox/project-static/css/base.css b/netbox/project-static/css/base.css index ad618b5d1..0b18251fd 100644 --- a/netbox/project-static/css/base.css +++ b/netbox/project-static/css/base.css @@ -49,6 +49,23 @@ footer p { } } +.noprint { + +} + +@media print { + body { + padding-top: 0px; + } + .noprint { + display: none !important; + } + + a[href]:after { + content: none !important; + } +} + /* Collapse the nav menu on displays less than 960px wide */ @media (max-width: 959px) { .navbar-header { diff --git a/netbox/secrets/tables.py b/netbox/secrets/tables.py index 39d260a6d..a547ef4f8 100644 --- a/netbox/secrets/tables.py +++ b/netbox/secrets/tables.py @@ -23,7 +23,7 @@ class SecretRoleTable(BaseTable): secret_count = tables.Column(verbose_name='Secrets') slug = tables.Column(verbose_name='Slug') actions = tables.TemplateColumn( - template_code=SECRETROLE_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='' + template_code=SECRETROLE_ACTIONS, attrs={'td': {'class': 'text-right noprint'}}, verbose_name='' ) class Meta(BaseTable.Meta): diff --git a/netbox/templates/_base.html b/netbox/templates/_base.html index 9101e08f7..02b6bb32c 100644 --- a/netbox/templates/_base.html +++ b/netbox/templates/_base.html @@ -54,7 +54,7 @@

{% now 'Y-m-d H:i:s T' %}

-
+

Docs · API · diff --git a/netbox/templates/circuits/circuit.html b/netbox/templates/circuits/circuit.html index edbab3ed4..890b2a880 100644 --- a/netbox/templates/circuits/circuit.html +++ b/netbox/templates/circuits/circuit.html @@ -4,7 +4,7 @@ {% block title %}{{ circuit }}{% endblock %} {% block header %} -

+
-
+
{% if perms.circuits.change_circuit %} diff --git a/netbox/templates/circuits/circuit_list.html b/netbox/templates/circuits/circuit_list.html index 81e09c32b..d686bdf7a 100644 --- a/netbox/templates/circuits/circuit_list.html +++ b/netbox/templates/circuits/circuit_list.html @@ -2,7 +2,7 @@ {% load buttons %} {% block content %} -
+
{% if perms.circuits.add_circuit %} {% add_button 'circuits:circuit_add' %} {% import_button 'circuits:circuit_import' %} @@ -14,7 +14,7 @@
{% include 'utilities/obj_table.html' with bulk_edit_url='circuits:circuit_bulk_edit' bulk_delete_url='circuits:circuit_bulk_delete' %}
-
+
{% include 'inc/search_panel.html' %} {% include 'inc/tags_panel.html' %}
diff --git a/netbox/templates/circuits/circuittype_list.html b/netbox/templates/circuits/circuittype_list.html index 2b9469042..654d4ab09 100644 --- a/netbox/templates/circuits/circuittype_list.html +++ b/netbox/templates/circuits/circuittype_list.html @@ -2,7 +2,7 @@ {% load buttons %} {% block content %} -
+
{% if perms.circuits.add_circuittype %} {% add_button 'circuits:circuittype_add' %} {% import_button 'circuits:circuittype_import' %} diff --git a/netbox/templates/circuits/provider.html b/netbox/templates/circuits/provider.html index a31f093c9..3dd5d973f 100644 --- a/netbox/templates/circuits/provider.html +++ b/netbox/templates/circuits/provider.html @@ -5,7 +5,7 @@ {% block title %}{{ provider }}{% endblock %} {% block header %} -
+ -
+
{% if show_graphs %} @@ -521,7 +521,7 @@ {% endfor %} -