class ComponentForm(forms.Form): """ Subclass this form when facilitating the creation of one or more device component or component templates based on a name pattern. """ name_pattern = ExpandableNameField(label='Name') label_pattern = ExpandableNameField( label='Label', required=False, help_text= 'Alphanumeric ranges are supported. (Must match the number of names being created.)' ) def clean(self): super().clean() # Validate that the number of components being created from both the name_pattern and label_pattern are equal if self.cleaned_data['label_pattern']: name_pattern_count = len(self.cleaned_data['name_pattern']) label_pattern_count = len(self.cleaned_data['label_pattern']) if name_pattern_count != label_pattern_count: raise forms.ValidationError( { 'label_pattern': f'The provided name pattern will create {name_pattern_count} components, however ' f'{label_pattern_count} labels will be generated. These counts must match.' }, code='label_pattern_mismatch')
class VirtualMachineBulkAddComponentForm(BootstrapMixin, forms.Form): pk = forms.ModelMultipleChoiceField( queryset=VirtualMachine.objects.all(), widget=forms.MultipleHiddenInput() ) name_pattern = ExpandableNameField( label='Name' )
class VirtualMachineBulkAddComponentForm(BootstrapMixin, forms.Form): pk = forms.ModelMultipleChoiceField(queryset=VirtualMachine.objects.all(), widget=forms.MultipleHiddenInput()) name_pattern = ExpandableNameField(label='Name') def clean_tags(self): # Because we're feeding TagField data (on the bulk edit form) to another TagField (on the model form), we # must first convert the list of tags to a string. return ','.join(self.cleaned_data.get('tags'))
class VMInterfaceCreateForm(BootstrapMixin, CustomFieldsMixin, InterfaceCommonForm): model = VMInterface virtual_machine = DynamicModelChoiceField( queryset=VirtualMachine.objects.all() ) name_pattern = ExpandableNameField( label='Name' ) enabled = forms.BooleanField( required=False, initial=True ) parent = DynamicModelChoiceField( queryset=VMInterface.objects.all(), required=False, query_params={ 'virtual_machine_id': '$virtual_machine', } ) mac_address = forms.CharField( required=False, label='MAC Address' ) description = forms.CharField( max_length=200, required=False ) mode = forms.ChoiceField( choices=add_blank_choice(InterfaceModeChoices), required=False, widget=StaticSelect(), ) untagged_vlan = DynamicModelChoiceField( queryset=VLAN.objects.all(), required=False ) tagged_vlans = DynamicModelMultipleChoiceField( queryset=VLAN.objects.all(), required=False ) tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False ) field_order = ( 'virtual_machine', 'name_pattern', 'enabled', 'parent', 'mtu', 'mac_address', 'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'tags' ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) vm_id = self.initial.get('virtual_machine') or self.data.get('virtual_machine') # Limit VLAN choices by virtual machine self.fields['untagged_vlan'].widget.add_query_param('available_on_virtualmachine', vm_id) self.fields['tagged_vlans'].widget.add_query_param('available_on_virtualmachine', vm_id)
class InterfaceCreateForm(BootstrapMixin, forms.Form): virtual_machine = forms.ModelChoiceField( queryset=VirtualMachine.objects.all(), widget=forms.HiddenInput()) name_pattern = ExpandableNameField(label='Name') type = forms.ChoiceField(choices=VMInterfaceTypeChoices, initial=VMInterfaceTypeChoices.TYPE_VIRTUAL, widget=forms.HiddenInput()) enabled = forms.BooleanField(required=False, initial=True) mtu = forms.IntegerField(required=False, min_value=INTERFACE_MTU_MIN, max_value=INTERFACE_MTU_MAX, label='MTU') mac_address = forms.CharField(required=False, label='MAC Address') description = forms.CharField(max_length=100, required=False) mode = forms.ChoiceField( choices=add_blank_choice(InterfaceModeChoices), required=False, widget=StaticSelect2(), ) untagged_vlan = DynamicModelChoiceField(queryset=VLAN.objects.all(), required=False, widget=APISelect( api_url="/api/ipam/vlans/", display_field='display_name', full=True, additional_query_params={ 'site_id': 'null', }, )) tagged_vlans = DynamicModelMultipleChoiceField( queryset=VLAN.objects.all(), required=False, widget=APISelectMultiple( api_url="/api/ipam/vlans/", display_field='display_name', full=True, additional_query_params={ 'site_id': 'null', }, )) tags = TagField(required=False) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) virtual_machine = VirtualMachine.objects.get( pk=self.initial.get('virtual_machine') or self.data.get('virtual_machine')) site = getattr(virtual_machine.cluster, 'site', None) if site is not None: # Add current site to VLANs query params self.fields['untagged_vlan'].widget.add_additional_query_param( 'site_id', site.pk) self.fields['tagged_vlans'].widget.add_additional_query_param( 'site_id', site.pk)
class InterfaceCreateForm(ComponentForm): name_pattern = ExpandableNameField(label='Name') form_factor = forms.ChoiceField(choices=VIFACE_FF_CHOICES, initial=IFACE_FF_VIRTUAL, widget=forms.HiddenInput()) enabled = forms.BooleanField(required=False) mtu = forms.IntegerField(required=False, min_value=1, max_value=32767, label='MTU') mac_address = MACAddressFormField(required=False, label='MAC Address') description = forms.CharField(max_length=100, required=False) def __init__(self, *args, **kwargs): # Set interfaces enabled by default kwargs['initial'] = kwargs.get('initial', {}).copy() kwargs['initial'].update({'enabled': True}) super(InterfaceCreateForm, self).__init__(*args, **kwargs)
class VMInterfaceCreateForm(BootstrapMixin, forms.Form): virtual_machine = DynamicModelChoiceField( queryset=VirtualMachine.objects.all()) name_pattern = ExpandableNameField(label='Name') enabled = forms.BooleanField(required=False, initial=True) mtu = forms.IntegerField(required=False, min_value=INTERFACE_MTU_MIN, max_value=INTERFACE_MTU_MAX, label='MTU') mac_address = forms.CharField(required=False, label='MAC Address') description = forms.CharField(max_length=100, required=False) mode = forms.ChoiceField( choices=add_blank_choice(InterfaceModeChoices), required=False, widget=StaticSelect2(), ) untagged_vlan = DynamicModelChoiceField(queryset=VLAN.objects.all(), required=False, display_field='display_name', brief_mode=False, query_params={ 'site_id': 'null', }) tagged_vlans = DynamicModelMultipleChoiceField( queryset=VLAN.objects.all(), required=False, display_field='display_name', brief_mode=False, query_params={ 'site_id': 'null', }) tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(), required=False) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) virtual_machine = VirtualMachine.objects.get( pk=self.initial.get('virtual_machine') or self.data.get('virtual_machine')) # Add current site to VLANs query params site = virtual_machine.site if site: self.fields['untagged_vlan'].widget.add_query_param( 'site_id', site.pk) self.fields['tagged_vlans'].widget.add_query_param( 'site_id', site.pk)
class InterfaceCreateForm(ComponentForm): name_pattern = ExpandableNameField( label='Name' ) type = forms.ChoiceField( choices=VMInterfaceTypeChoices, initial=VMInterfaceTypeChoices.TYPE_VIRTUAL, widget=forms.HiddenInput() ) enabled = forms.BooleanField( required=False ) mtu = forms.IntegerField( required=False, min_value=INTERFACE_MTU_MIN, max_value=INTERFACE_MTU_MAX, label='MTU' ) mac_address = forms.CharField( required=False, label='MAC Address' ) description = forms.CharField( max_length=100, required=False ) mode = forms.ChoiceField( choices=add_blank_choice(InterfaceModeChoices), required=False, widget=StaticSelect2(), ) untagged_vlan = forms.ModelChoiceField( queryset=VLAN.objects.all(), required=False, widget=APISelect( api_url="/api/ipam/vlans/", display_field='display_name', full=True ) ) tagged_vlans = forms.ModelMultipleChoiceField( queryset=VLAN.objects.all(), required=False, widget=APISelectMultiple( api_url="/api/ipam/vlans/", display_field='display_name', full=True ) ) tags = TagField( required=False ) def __init__(self, *args, **kwargs): # Set interfaces enabled by default kwargs['initial'] = kwargs.get('initial', {}).copy() kwargs['initial'].update({'enabled': True}) super().__init__(*args, **kwargs) # Limit VLan choices to those in: global vlans, global groups, the current site's group, the current site vlan_choices = [] global_vlans = VLAN.objects.filter(site=None, group=None) vlan_choices.append( ('Global', [(vlan.pk, vlan) for vlan in global_vlans]) ) for group in VLANGroup.objects.filter(site=None): global_group_vlans = VLAN.objects.filter(group=group) vlan_choices.append( (group.name, [(vlan.pk, vlan) for vlan in global_group_vlans]) ) site = getattr(self.parent.cluster, 'site', None) if site is not None: # Add non-grouped site VLANs site_vlans = VLAN.objects.filter(site=site, group=None) vlan_choices.append((site.name, [(vlan.pk, vlan) for vlan in site_vlans])) # Add grouped site VLANs for group in VLANGroup.objects.filter(site=site): site_group_vlans = VLAN.objects.filter(group=group) vlan_choices.append(( '{} / {}'.format(group.site.name, group.name), [(vlan.pk, vlan) for vlan in site_group_vlans] )) self.fields['untagged_vlan'].choices = [(None, '---------')] + vlan_choices self.fields['tagged_vlans'].choices = vlan_choices
class PowerPortCreateForm(forms.Form, BootstrapMixin): name_pattern = ExpandableNameField(label='Name')
class InterfaceTemplateForm(forms.ModelForm, BootstrapMixin): name_pattern = ExpandableNameField(label='Name') class Meta: model = InterfaceTemplate fields = ['name_pattern', 'form_factor', 'mgmt_only']
class PowerOutletTemplateForm(forms.ModelForm, BootstrapMixin): name_pattern = ExpandableNameField(label='Name') class Meta: model = PowerOutletTemplate fields = ['name_pattern']
class ConsoleServerPortTemplateForm(forms.ModelForm, BootstrapMixin): name_pattern = ExpandableNameField(label='Name') class Meta: model = ConsoleServerPortTemplate fields = ['name_pattern']