Browse Source

Closes #42: Allow VLAN assignment during prefix import

Jeremy Stretch 8 years ago
parent
commit
da10b34738
2 changed files with 42 additions and 2 deletions
  1. 31 1
      netbox/ipam/forms.py
  2. 11 1
      netbox/templates/ipam/prefix_import.html

+ 31 - 1
netbox/ipam/forms.py

@@ -192,13 +192,43 @@ class PrefixFromCSVForm(forms.ModelForm):
                                  error_messages={'invalid_choice': 'VRF not found.'})
                                  error_messages={'invalid_choice': 'VRF not found.'})
     site = forms.ModelChoiceField(queryset=Site.objects.all(), required=False, to_field_name='name',
     site = forms.ModelChoiceField(queryset=Site.objects.all(), required=False, to_field_name='name',
                                   error_messages={'invalid_choice': 'Site not found.'})
                                   error_messages={'invalid_choice': 'Site not found.'})
+    vlan_group_name = forms.CharField(required=False)
+    vlan_vid = forms.IntegerField(required=False)
     status_name = forms.ChoiceField(choices=[(s[1], s[0]) for s in PREFIX_STATUS_CHOICES])
     status_name = forms.ChoiceField(choices=[(s[1], s[0]) for s in PREFIX_STATUS_CHOICES])
     role = forms.ModelChoiceField(queryset=Role.objects.all(), required=False, to_field_name='name',
     role = forms.ModelChoiceField(queryset=Role.objects.all(), required=False, to_field_name='name',
                                   error_messages={'invalid_choice': 'Invalid role.'})
                                   error_messages={'invalid_choice': 'Invalid role.'})
 
 
     class Meta:
     class Meta:
         model = Prefix
         model = Prefix
-        fields = ['prefix', 'vrf', 'site', 'status_name', 'role', 'description']
+        fields = ['prefix', 'vrf', 'site', 'vlan_group_name', 'vlan_vid', 'status_name', 'role', 'description']
+
+    def clean(self):
+
+        super(PrefixFromCSVForm, self).clean()
+
+        site = self.cleaned_data.get('site')
+        vlan_group_name = self.cleaned_data.get('vlan_group_name')
+        vlan_vid = self.cleaned_data.get('vlan_vid')
+
+        # Validate VLAN
+        vlan_group = None
+        if vlan_group_name:
+            try:
+                vlan_group = VLANGroup.objects.get(site=site, name=vlan_group_name)
+            except VLANGroup.DoesNotExist:
+                self.add_error('vlan_group_name', "Invalid VLAN group ({} - {}).".format(site, vlan_group_name))
+        if vlan_vid and vlan_group:
+            try:
+                self.instance.vlan = VLAN.objects.get(group=vlan_group, vid=vlan_vid)
+            except VLAN.DoesNotExist:
+                self.add_error('vlan_vid', "Invalid VLAN ID ({} - {}).".format(vlan_group, vlan_vid))
+        elif vlan_vid and site:
+            try:
+                self.instance.vlan = VLAN.objects.get(site=site, vid=vlan_vid)
+            except VLAN.MultipleObjectsReturned:
+                self.add_error('vlan_vid', "Multiple VLANs found ({} - VID {})".format(site, vlan_vid))
+        elif vlan_vid:
+            self.add_error('vlan_vid', "Must specify site and/or VLAN group when assigning a VLAN.")
 
 
     def save(self, *args, **kwargs):
     def save(self, *args, **kwargs):
         m = super(PrefixFromCSVForm, self).save(commit=False)
         m = super(PrefixFromCSVForm, self).save(commit=False)

+ 11 - 1
netbox/templates/ipam/prefix_import.html

@@ -44,6 +44,16 @@
 					<td>HQ</td>
 					<td>HQ</td>
 				</tr>
 				</tr>
 				<tr>
 				<tr>
+					<td>VLAN Group</td>
+					<td>Name of group for VLAN selection (optional)</td>
+					<td>Customers</td>
+				</tr>
+				<tr>
+					<td>VLAN ID</td>
+					<td>Numeric VLAN ID (optional)</td>
+					<td>801</td>
+				</tr>
+				<tr>
 					<td>Status</td>
 					<td>Status</td>
 					<td>Current status</td>
 					<td>Current status</td>
 					<td>Active</td>
 					<td>Active</td>
@@ -61,7 +71,7 @@
 			</tbody>
 			</tbody>
 		</table>
 		</table>
 		<h4>Example</h4>
 		<h4>Example</h4>
-		<pre>192.168.42.0/24,65000:123,HQ,Active,Customer,7th floor WiFi</pre>
+		<pre>192.168.42.0/24,65000:123,HQ,Customers,801,Active,Customer,7th floor WiFi</pre>
 	</div>
 	</div>
 </div>
 </div>
 {% endblock %}
 {% endblock %}