diff --git a/netbox/dcim/forms/object_create.py b/netbox/dcim/forms/object_create.py index 9589ab533..eeca5c237 100644 --- a/netbox/dcim/forms/object_create.py +++ b/netbox/dcim/forms/object_create.py @@ -1,5 +1,5 @@ from django import forms -from django.utils.translation import gettext as _ +from django.utils.translation import gettext_lazy as _ from dcim.models import * from netbox.forms import NetBoxModelForm @@ -38,8 +38,11 @@ class ComponentCreateForm(forms.Form): Subclass this form when facilitating the creation of one or more component or component template objects based on a name pattern. """ - name = ExpandableNameField() + name = ExpandableNameField( + label=_('Name'), + ) label = ExpandableNameField( + label=_('Label'), required=False, help_text=_('Alphanumeric ranges are supported. (Must match the number of objects being created.)') ) @@ -57,8 +60,8 @@ class ComponentCreateForm(forms.Form): value_count = len(self.cleaned_data[field_name]) if self.cleaned_data[field_name] and value_count != pattern_count: raise forms.ValidationError({ - field_name: f'The provided pattern specifies {value_count} values, but {pattern_count} are ' - f'expected.' + field_name: _('The provided pattern specifies {value_count} values, but {pattern_count} are ' + 'expected.').format(value_count=value_count, pattern_count=pattern_count) }, code='label_pattern_mismatch') @@ -222,12 +225,13 @@ class InterfaceCreateForm(ComponentCreateForm, model_forms.InterfaceForm): super().__init__(*args, **kwargs) if 'module' in self.fields: - self.fields['name'].help_text += ' The string {module} will be replaced with the position ' \ - 'of the assigned module, if any' + self.fields['name'].help_text += _(' The string {module} will be replaced with the position ' + 'of the assigned module, if any').format(module=module) class FrontPortCreateForm(ComponentCreateForm, model_forms.FrontPortForm): device = DynamicModelChoiceField( + label=_('Device'), queryset=Device.objects.all(), selector=True, widget=APISelect( @@ -329,6 +333,7 @@ class InventoryItemCreateForm(ComponentCreateForm, model_forms.InventoryItemForm class VirtualChassisCreateForm(NetBoxModelForm): region = DynamicModelChoiceField( + label=_('Region'), queryset=Region.objects.all(), required=False, initial_params={ @@ -336,6 +341,7 @@ class VirtualChassisCreateForm(NetBoxModelForm): } ) site_group = DynamicModelChoiceField( + label=_('Site group'), queryset=SiteGroup.objects.all(), required=False, initial_params={ @@ -343,6 +349,7 @@ class VirtualChassisCreateForm(NetBoxModelForm): } ) site = DynamicModelChoiceField( + label=_('Site'), queryset=Site.objects.all(), required=False, query_params={ @@ -351,6 +358,7 @@ class VirtualChassisCreateForm(NetBoxModelForm): } ) rack = DynamicModelChoiceField( + label=_('Rack'), queryset=Rack.objects.all(), required=False, null_option='None', @@ -359,6 +367,7 @@ class VirtualChassisCreateForm(NetBoxModelForm): } ) members = DynamicModelMultipleChoiceField( + label=_('Members'), queryset=Device.objects.all(), required=False, query_params={ @@ -367,6 +376,7 @@ class VirtualChassisCreateForm(NetBoxModelForm): } ) initial_position = forms.IntegerField( + label=_('Initial position'), initial=1, required=False, help_text=_('Position of the first member device. Increases by one for each additional member.') @@ -383,7 +393,7 @@ class VirtualChassisCreateForm(NetBoxModelForm): if self.cleaned_data['members'] and self.cleaned_data['initial_position'] is None: raise forms.ValidationError({ - 'initial_position': "A position must be specified for the first VC member." + 'initial_position': _("A position must be specified for the first VC member.") }) def save(self, *args, **kwargs): diff --git a/netbox/dcim/forms/object_import.py b/netbox/dcim/forms/object_import.py index 01efbe123..bab8876da 100644 --- a/netbox/dcim/forms/object_import.py +++ b/netbox/dcim/forms/object_import.py @@ -1,5 +1,5 @@ from django import forms -from django.utils.translation import gettext as _ +from django.utils.translation import gettext_lazy as _ from dcim.choices import InterfacePoEModeChoices, InterfacePoETypeChoices, InterfaceTypeChoices, PortTypeChoices from dcim.models import * @@ -57,6 +57,7 @@ class PowerPortTemplateImportForm(ComponentTemplateImportForm): class PowerOutletTemplateImportForm(ComponentTemplateImportForm): power_port = forms.ModelChoiceField( + label=_('Power port'), queryset=PowerPortTemplate.objects.all(), to_field_name='name', required=False @@ -85,6 +86,7 @@ class PowerOutletTemplateImportForm(ComponentTemplateImportForm): class InterfaceTemplateImportForm(ComponentTemplateImportForm): type = forms.ChoiceField( + label=_('Type'), choices=InterfaceTypeChoices.CHOICES ) poe_mode = forms.ChoiceField( @@ -113,9 +115,11 @@ class InterfaceTemplateImportForm(ComponentTemplateImportForm): class FrontPortTemplateImportForm(ComponentTemplateImportForm): type = forms.ChoiceField( + label=_('Type'), choices=PortTypeChoices.CHOICES ) rear_port = forms.ModelChoiceField( + label=_('Rear port'), queryset=RearPortTemplate.objects.all(), to_field_name='name' ) @@ -143,6 +147,7 @@ class FrontPortTemplateImportForm(ComponentTemplateImportForm): class RearPortTemplateImportForm(ComponentTemplateImportForm): type = forms.ChoiceField( + label=_('Type'), choices=PortTypeChoices.CHOICES ) @@ -173,15 +178,18 @@ class DeviceBayTemplateImportForm(ComponentTemplateImportForm): class InventoryItemTemplateImportForm(ComponentTemplateImportForm): parent = forms.ModelChoiceField( + label=_('Parent'), queryset=InventoryItemTemplate.objects.all(), required=False ) role = forms.ModelChoiceField( + label=_('Role'), queryset=InventoryItemRole.objects.all(), to_field_name='name', required=False ) manufacturer = forms.ModelChoiceField( + label=_('Manufacturer'), queryset=Manufacturer.objects.all(), to_field_name='name', required=False