Преглед изворни кода

Fix VLAN group assignment for VLANs

Jeremy Stretch пре 5 година
родитељ
комит
fadf15dbc0
4 измењених фајлова са 91 додато и 52 уклоњено
  1. 32 51
      netbox/ipam/forms.py
  2. 1 1
      netbox/ipam/tables.py
  3. 1 0
      netbox/ipam/views.py
  4. 57 0
      netbox/templates/ipam/vlan_edit.html

+ 32 - 51
netbox/ipam/forms.py

@@ -1240,19 +1240,45 @@ class VLANGroupFilterForm(BootstrapMixin, forms.Form):
 #
 #
 
 
 class VLANForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
 class VLANForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+    # VLANGroup assignment fields
+    scope_type = forms.ChoiceField(
+        choices=(
+            ('', ''),
+            ('dcim.region', 'Region'),
+            ('dcim.sitegroup', 'Site group'),
+            ('dcim.site', 'Site'),
+            ('dcim.location', 'Location'),
+            ('dcim.rack', 'Rack'),
+        ),
+        required=False,
+        widget=StaticSelect2,
+        label='Group scope'
+    )
+    group = DynamicModelChoiceField(
+        queryset=VLANGroup.objects.all(),
+        required=False,
+        query_params={
+            'scope_type': '$scope_type',
+        },
+        label='VLAN Group'
+    )
+
+    # Site assignment fields
     region = DynamicModelChoiceField(
     region = DynamicModelChoiceField(
         queryset=Region.objects.all(),
         queryset=Region.objects.all(),
         required=False,
         required=False,
         initial_params={
         initial_params={
             'sites': '$site'
             'sites': '$site'
-        }
+        },
+        label='Region'
     )
     )
-    site_group = DynamicModelChoiceField(
+    sitegroup = DynamicModelChoiceField(
         queryset=SiteGroup.objects.all(),
         queryset=SiteGroup.objects.all(),
         required=False,
         required=False,
         initial_params={
         initial_params={
             'sites': '$site'
             'sites': '$site'
-        }
+        },
+        label='Site group'
     )
     )
     site = DynamicModelChoiceField(
     site = DynamicModelChoiceField(
         queryset=Site.objects.all(),
         queryset=Site.objects.all(),
@@ -1260,51 +1286,11 @@ class VLANForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         null_option='None',
         null_option='None',
         query_params={
         query_params={
             'region_id': '$region',
             'region_id': '$region',
-            'group_id': '$site_group',
-        }
-    )
-    location = DynamicModelChoiceField(
-        queryset=Location.objects.all(),
-        required=False,
-        null_option='None',
-        query_params={
-            'site_id': '$site',
-        }
-    )
-    rack = DynamicModelChoiceField(
-        queryset=Rack.objects.all(),
-        required=False,
-        null_option='None',
-        query_params={
-            'site_id': '$site',
-            'location_id': '$location',
-        }
-    )
-    group_scope = forms.ChoiceField(
-        choices=(
-            ('', ''),
-            ('dcim.region', 'Region'),
-            ('dcim.sitegroup', 'Site group'),
-            ('dcim.site', 'Site'),
-            ('dcim.location', 'Location'),
-            ('dcim.rack', 'Rack'),
-        ),
-        required=False,
-        widget=StaticSelect2,
-        label='Group scope'
-    )
-    group = DynamicModelChoiceField(
-        queryset=VLANGroup.objects.all(),
-        required=False,
-        query_params={
-            'scope_type': '$group_scope',
-            'region': '$region',
-            'sitegroup': '$site_group',
-            'site': '$site',
-            'location': '$location',
-            'rack': '$rack',
+            'group_id': '$sitegroup',
         }
         }
     )
     )
+
+    # Other fields
     role = DynamicModelChoiceField(
     role = DynamicModelChoiceField(
         queryset=Role.objects.all(),
         queryset=Role.objects.all(),
         required=False
         required=False
@@ -1319,11 +1305,6 @@ class VLANForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         fields = [
         fields = [
             'site', 'group', 'vid', 'name', 'status', 'role', 'description', 'tenant_group', 'tenant', 'tags',
             'site', 'group', 'vid', 'name', 'status', 'role', 'description', 'tenant_group', 'tenant', 'tags',
         ]
         ]
-        fieldsets = (
-            ('VLAN', ('vid', 'name', 'status', 'role', 'description', 'tags')),
-            ('Assignment', ('region', 'site_group', 'site', 'location', 'rack', 'group_scope', 'group')),
-            ('Tenancy', ('tenant_group', 'tenant')),
-        )
         help_texts = {
         help_texts = {
             'site': "Leave blank if this VLAN spans multiple sites",
             'site': "Leave blank if this VLAN spans multiple sites",
             'group': "VLAN group (optional)",
             'group': "VLAN group (optional)",

+ 1 - 1
netbox/ipam/tables.py

@@ -90,7 +90,7 @@ VLAN_ROLE_LINK = """
 VLANGROUP_ADD_VLAN = """
 VLANGROUP_ADD_VLAN = """
 {% with next_vid=record.get_next_available_vid %}
 {% with next_vid=record.get_next_available_vid %}
     {% if next_vid and perms.ipam.add_vlan %}
     {% if next_vid and perms.ipam.add_vlan %}
-        <a href="{% url 'ipam:vlan_add' %}?site={{ record.site_id }}&group={{ record.pk }}&vid={{ next_vid }}" title="Add VLAN" class="btn btn-xs btn-success">
+        <a href="{% url 'ipam:vlan_add' %}?group={{ record.pk }}&vid={{ next_vid }}" title="Add VLAN" class="btn btn-xs btn-success">
             <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
             <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
         </a>
         </a>
     {% endif %}
     {% endif %}

+ 1 - 0
netbox/ipam/views.py

@@ -768,6 +768,7 @@ class VLANVMInterfacesView(generic.ObjectView):
 class VLANEditView(generic.ObjectEditView):
 class VLANEditView(generic.ObjectEditView):
     queryset = VLAN.objects.all()
     queryset = VLAN.objects.all()
     model_form = forms.VLANForm
     model_form = forms.VLANForm
+    template_name = 'ipam/vlan_edit.html'
 
 
 
 
 class VLANDeleteView(generic.ObjectDeleteView):
 class VLANDeleteView(generic.ObjectDeleteView):

+ 57 - 0
netbox/templates/ipam/vlan_edit.html

@@ -0,0 +1,57 @@
+{% extends 'generic/object_edit.html' %}
+{% load static %}
+{% load form_helpers %}
+{% load helpers %}
+
+{% block form %}
+    <div class="panel panel-default">
+        <div class="panel-heading"><strong>VLAN</strong></div>
+        <div class="panel-body">
+            {% render_field form.vid %}
+            {% render_field form.name %}
+            {% render_field form.status %}
+            {% render_field form.role %}
+            {% render_field form.description %}
+            {% render_field form.tags %}
+        </div>
+    </div>
+    <div class="panel panel-default">
+        <div class="panel-heading"><strong>Tenancy</strong></div>
+        <div class="panel-body">
+            {% render_field form.tenant_group %}
+            {% render_field form.tenant %}
+        </div>
+    </div>
+    <div class="panel panel-default">
+        <div class="panel-heading">
+            <strong>Assignment</strong>
+        </div>
+        <div class="panel-body">
+            {% with site_tab_active=form.initial.site %}
+                <ul class="nav nav-tabs" role="tablist">
+                    <li role="presentation"{% if not site_tab_active %} class="active"{% endif %}><a href="#group" role="tab" data-toggle="tab">VLAN Group</a></li>
+                    <li role="presentation"{% if site_tab_active %} class="active"{% endif %}><a href="#site" role="tab" data-toggle="tab">Site</a></li>
+                </ul>
+                <div class="tab-content">
+                    <div class="tab-pane{% if not vm_tab_active %} active{% endif %}" id="group">
+                        {% render_field form.scope_type %}
+                        {% render_field form.group %}
+                    </div>
+                    <div class="tab-pane{% if vm_tab_active %} active{% endif %}" id="site">
+                        {% render_field form.region %}
+                        {% render_field form.sitegroup %}
+                        {% render_field form.site %}
+                    </div>
+                </div>
+            {% endwith %}
+        </div>
+    </div>
+    {% if form.custom_fields %}
+        <div class="panel panel-default">
+            <div class="panel-heading"><strong>Custom Fields</strong></div>
+            <div class="panel-body">
+                {% render_custom_fields form %}
+            </div>
+        </div>
+    {% endif %}
+{% endblock %}