diff --git a/netbox/dcim/forms/connections.py b/netbox/dcim/forms/connections.py index 8e3dcdc68..854c5ebed 100644 --- a/netbox/dcim/forms/connections.py +++ b/netbox/dcim/forms/connections.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 circuits.models import Circuit, CircuitTermination from dcim.models import * diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 06d38627d..97767427c 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -1,6 +1,6 @@ from django import forms from django.contrib.auth import get_user_model -from django.utils.translation import gettext as _ +from django.utils.translation import gettext_lazy as _ from dcim.choices import * from dcim.constants import * @@ -56,9 +56,11 @@ __all__ = ( class DeviceComponentFilterForm(NetBoxModelFilterSetForm): name = forms.CharField( + label=_('Name'), required=False ) label = forms.CharField( + label=_('Label'), required=False ) region_id = DynamicModelMultipleChoiceField( @@ -130,7 +132,7 @@ class RegionFilterForm(ContactModelFilterForm, NetBoxModelFilterSetForm): model = Region fieldsets = ( (None, ('q', 'filter_id', 'tag', 'parent_id')), - ('Contacts', ('contact', 'contact_role', 'contact_group')) + (_('Contacts'), ('contact', 'contact_role', 'contact_group')) ) parent_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), @@ -144,7 +146,7 @@ class SiteGroupFilterForm(ContactModelFilterForm, NetBoxModelFilterSetForm): model = SiteGroup fieldsets = ( (None, ('q', 'filter_id', 'tag', 'parent_id')), - ('Contacts', ('contact', 'contact_role', 'contact_group')) + (_('Contacts'), ('contact', 'contact_role', 'contact_group')) ) parent_id = DynamicModelMultipleChoiceField( queryset=SiteGroup.objects.all(), @@ -158,11 +160,12 @@ class SiteFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilte model = Site fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Attributes', ('status', 'region_id', 'group_id', 'asn_id')), - ('Tenant', ('tenant_group_id', 'tenant_id')), - ('Contacts', ('contact', 'contact_role', 'contact_group')), + (_('Attributes'), ('status', 'region_id', 'group_id', 'asn_id')), + (_('Tenant'), ('tenant_group_id', 'tenant_id')), + (_('Contacts'), ('contact', 'contact_role', 'contact_group')), ) status = forms.MultipleChoiceField( + label=_('Status'), choices=SiteStatusChoices, required=False ) @@ -188,9 +191,9 @@ class LocationFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelF model = Location fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Attributes', ('region_id', 'site_group_id', 'site_id', 'parent_id', 'status')), - ('Tenant', ('tenant_group_id', 'tenant_id')), - ('Contacts', ('contact', 'contact_role', 'contact_group')), + (_('Attributes'), ('region_id', 'site_group_id', 'site_id', 'parent_id', 'status')), + (_('Tenant'), ('tenant_group_id', 'tenant_id')), + (_('Contacts'), ('contact', 'contact_role', 'contact_group')), ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), @@ -221,6 +224,7 @@ class LocationFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelF label=_('Parent') ) status = forms.MultipleChoiceField( + label=_('Status'), choices=LocationStatusChoices, required=False ) @@ -236,12 +240,12 @@ class RackFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilte model = Rack fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id')), - ('Function', ('status', 'role_id')), - ('Hardware', ('type', 'width', 'serial', 'asset_tag')), - ('Tenant', ('tenant_group_id', 'tenant_id')), - ('Contacts', ('contact', 'contact_role', 'contact_group')), - ('Weight', ('weight', 'max_weight', 'weight_unit')), + (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id')), + (_('Function'), ('status', 'role_id')), + (_('Hardware'), ('type', 'width', 'serial', 'asset_tag')), + (_('Tenant'), ('tenant_group_id', 'tenant_id')), + (_('Contacts'), ('contact', 'contact_role', 'contact_group')), + (_('Weight'), ('weight', 'max_weight', 'weight_unit')), ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), @@ -271,14 +275,17 @@ class RackFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilte label=_('Location') ) status = forms.MultipleChoiceField( + label=_('Status'), choices=RackStatusChoices, required=False ) type = forms.MultipleChoiceField( + label=_('Type'), choices=RackTypeChoices, required=False ) width = forms.MultipleChoiceField( + label=_('Width'), choices=RackWidthChoices, required=False ) @@ -289,21 +296,26 @@ class RackFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilte label=_('Role') ) serial = forms.CharField( + label=_('Serial'), required=False ) asset_tag = forms.CharField( + label=_('Asset tag'), required=False ) tag = TagFilterField(model) weight = forms.DecimalField( + label=_('Weight'), required=False, min_value=1 ) max_weight = forms.IntegerField( + label=_('Max weight'), required=False, min_value=1 ) weight_unit = forms.ChoiceField( + label=_('Weight unit'), choices=add_blank_choice(WeightUnitChoices), required=False ) @@ -312,12 +324,12 @@ class RackFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilte class RackElevationFilterForm(RackFilterForm): fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id', 'id')), - ('Function', ('status', 'role_id')), - ('Hardware', ('type', 'width', 'serial', 'asset_tag')), - ('Tenant', ('tenant_group_id', 'tenant_id')), - ('Contacts', ('contact', 'contact_role', 'contact_group')), - ('Weight', ('weight', 'max_weight', 'weight_unit')), + (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'id')), + (_('Function'), ('status', 'role_id')), + (_('Hardware'), ('type', 'width', 'serial', 'asset_tag')), + (_('Tenant'), ('tenant_group_id', 'tenant_id')), + (_('Contacts'), ('contact', 'contact_role', 'contact_group')), + (_('Weight'), ('weight', 'max_weight', 'weight_unit')), ) id = DynamicModelMultipleChoiceField( queryset=Rack.objects.all(), @@ -334,9 +346,9 @@ class RackReservationFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = RackReservation fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('User', ('user_id',)), - ('Rack', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - ('Tenant', ('tenant_group_id', 'tenant_id')), + (_('User'), ('user_id',)), + (_('Rack'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), + (_('Tenant'), ('tenant_group_id', 'tenant_id')), ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), @@ -390,7 +402,7 @@ class ManufacturerFilterForm(ContactModelFilterForm, NetBoxModelFilterSetForm): model = Manufacturer fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Contacts', ('contact', 'contact_role', 'contact_group')) + (_('Contacts'), ('contact', 'contact_role', 'contact_group')) ) tag = TagFilterField(model) @@ -399,13 +411,13 @@ class DeviceTypeFilterForm(NetBoxModelFilterSetForm): model = DeviceType fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Hardware', ('manufacturer_id', 'default_platform_id', 'part_number', 'subdevice_role', 'airflow')), - ('Images', ('has_front_image', 'has_rear_image')), - ('Components', ( + (_('Hardware'), ('manufacturer_id', 'default_platform_id', 'part_number', 'subdevice_role', 'airflow')), + (_('Images'), ('has_front_image', 'has_rear_image')), + (_('Components'), ( 'console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', 'pass_through_ports', 'device_bays', 'module_bays', 'inventory_items', )), - ('Weight', ('weight', 'weight_unit')), + (_('Weight'), ('weight', 'weight_unit')), ) manufacturer_id = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), @@ -418,98 +430,103 @@ class DeviceTypeFilterForm(NetBoxModelFilterSetForm): label=_('Default platform') ) part_number = forms.CharField( + label=_('Part number'), required=False ) subdevice_role = forms.MultipleChoiceField( + label=_('Subdevice role'), choices=add_blank_choice(SubdeviceRoleChoices), required=False ) airflow = forms.MultipleChoiceField( + label=_('Airflow'), choices=add_blank_choice(DeviceAirflowChoices), required=False ) has_front_image = forms.NullBooleanField( required=False, - label='Has a front image', + label=_('Has a front image'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) has_rear_image = forms.NullBooleanField( required=False, - label='Has a rear image', + label=_('Has a rear image'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) console_ports = forms.NullBooleanField( required=False, - label='Has console ports', + label=_('Has console ports'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) console_server_ports = forms.NullBooleanField( required=False, - label='Has console server ports', + label=_('Has console server ports'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) power_ports = forms.NullBooleanField( required=False, - label='Has power ports', + label=_('Has power ports'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) power_outlets = forms.NullBooleanField( required=False, - label='Has power outlets', + label=_('Has power outlets'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) interfaces = forms.NullBooleanField( required=False, - label='Has interfaces', + label=_('Has interfaces'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) pass_through_ports = forms.NullBooleanField( required=False, - label='Has pass-through ports', + label=_('Has pass-through ports'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) device_bays = forms.NullBooleanField( required=False, - label='Has device bays', + label=_('Has device bays'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) module_bays = forms.NullBooleanField( required=False, - label='Has module bays', + label=_('Has module bays'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) inventory_items = forms.NullBooleanField( required=False, - label='Has inventory items', + label=_('Has inventory items'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) tag = TagFilterField(model) weight = forms.DecimalField( + label=_('Weight'), required=False ) weight_unit = forms.ChoiceField( + label=_('Weight unit'), choices=add_blank_choice(WeightUnitChoices), required=False ) @@ -519,12 +536,12 @@ class ModuleTypeFilterForm(NetBoxModelFilterSetForm): model = ModuleType fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Hardware', ('manufacturer_id', 'part_number')), - ('Components', ( + (_('Hardware'), ('manufacturer_id', 'part_number')), + (_('Components'), ( 'console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', 'pass_through_ports', )), - ('Weight', ('weight', 'weight_unit')), + (_('Weight'), ('weight', 'weight_unit')), ) manufacturer_id = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), @@ -533,55 +550,58 @@ class ModuleTypeFilterForm(NetBoxModelFilterSetForm): fetch_trigger='open' ) part_number = forms.CharField( + label=_('Part number'), required=False ) console_ports = forms.NullBooleanField( required=False, - label='Has console ports', + label=_('Has console ports'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) console_server_ports = forms.NullBooleanField( required=False, - label='Has console server ports', + label=_('Has console server ports'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) power_ports = forms.NullBooleanField( required=False, - label='Has power ports', + label=_('Has power ports'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) power_outlets = forms.NullBooleanField( required=False, - label='Has power outlets', + label=_('Has power outlets'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) interfaces = forms.NullBooleanField( required=False, - label='Has interfaces', + label=_('Has interfaces'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) pass_through_ports = forms.NullBooleanField( required=False, - label='Has pass-through ports', + label=_('Has pass-through ports'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) tag = TagFilterField(model) weight = forms.DecimalField( + label=_('Weight'), required=False ) weight_unit = forms.ChoiceField( + label=_('Weight unit'), choices=add_blank_choice(WeightUnitChoices), required=False ) @@ -621,15 +641,17 @@ class DeviceFilterForm( model = Device fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - ('Operation', ('status', 'role_id', 'airflow', 'serial', 'asset_tag', 'mac_address')), - ('Hardware', ('manufacturer_id', 'device_type_id', 'platform_id')), - ('Tenant', ('tenant_group_id', 'tenant_id')), - ('Contacts', ('contact', 'contact_role', 'contact_group')), - ('Components', ( + (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), + (_('Operation'), ('status', 'role_id', 'airflow', 'serial', 'asset_tag', 'mac_address')), + (_('Hardware'), ('manufacturer_id', 'device_type_id', 'platform_id')), + (_('Tenant'), ('tenant_group_id', 'tenant_id')), + (_('Contacts'), ('contact', 'contact_role', 'contact_group')), + (_('Components'), ( 'console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', 'pass_through_ports', )), - ('Miscellaneous', ('has_primary_ip', 'has_oob_ip', 'virtual_chassis_member', 'config_template_id', 'local_context_data')) + (_('Miscellaneous'), ( + 'has_primary_ip', 'has_oob_ip', 'virtual_chassis_member', 'config_template_id', 'local_context_data', + )) ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), @@ -694,22 +716,26 @@ class DeviceFilterForm( label=_('Platform') ) status = forms.MultipleChoiceField( + label=_('Status'), choices=DeviceStatusChoices, required=False ) airflow = forms.MultipleChoiceField( + label=_('Airflow'), choices=add_blank_choice(DeviceAirflowChoices), required=False ) serial = forms.CharField( + label=_('Serial'), required=False ) asset_tag = forms.CharField( + label=_('Asset tag'), required=False ) mac_address = forms.CharField( required=False, - label='MAC address' + label=_('MAC address') ) config_template_id = DynamicModelMultipleChoiceField( queryset=ConfigTemplate.objects.all(), @@ -718,7 +744,7 @@ class DeviceFilterForm( ) has_primary_ip = forms.NullBooleanField( required=False, - label='Has a primary IP', + label=_('Has a primary IP'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) @@ -732,49 +758,49 @@ class DeviceFilterForm( ) virtual_chassis_member = forms.NullBooleanField( required=False, - label='Virtual chassis member', + label=_('Virtual chassis member'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) console_ports = forms.NullBooleanField( required=False, - label='Has console ports', + label=_('Has console ports'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) console_server_ports = forms.NullBooleanField( required=False, - label='Has console server ports', + label=_('Has console server ports'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) power_ports = forms.NullBooleanField( required=False, - label='Has power ports', + label=_('Has power ports'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) power_outlets = forms.NullBooleanField( required=False, - label='Has power outlets', + label=_('Has power outlets'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) interfaces = forms.NullBooleanField( required=False, - label='Has interfaces', + label=_('Has interfaces'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) pass_through_ports = forms.NullBooleanField( required=False, - label='Has pass-through ports', + label=_('Has pass-through ports'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) @@ -789,8 +815,8 @@ class VirtualDeviceContextFilterForm( model = VirtualDeviceContext fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Attributes', ('device', 'status', 'has_primary_ip')), - ('Tenant', ('tenant_group_id', 'tenant_id')), + (_('Attributes'), ('device', 'status', 'has_primary_ip')), + (_('Tenant'), ('tenant_group_id', 'tenant_id')), ) device = DynamicModelMultipleChoiceField( queryset=Device.objects.all(), @@ -799,12 +825,13 @@ class VirtualDeviceContextFilterForm( fetch_trigger='open' ) status = forms.MultipleChoiceField( + label=_('Status'), required=False, choices=add_blank_choice(VirtualDeviceContextStatusChoices) ) has_primary_ip = forms.NullBooleanField( required=False, - label='Has a primary IP', + label=_('Has a primary IP'), widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) @@ -816,7 +843,7 @@ class ModuleFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, NetBoxMo model = Module fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Hardware', ('manufacturer_id', 'module_type_id', 'status', 'serial', 'asset_tag')), + (_('Hardware'), ('manufacturer_id', 'module_type_id', 'status', 'serial', 'asset_tag')), ) manufacturer_id = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), @@ -834,13 +861,16 @@ class ModuleFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, NetBoxMo fetch_trigger='open' ) status = forms.MultipleChoiceField( + label=_('Status'), choices=ModuleStatusChoices, required=False ) serial = forms.CharField( + label=_('Serial'), required=False ) asset_tag = forms.CharField( + label=_('Asset tag'), required=False ) tag = TagFilterField(model) @@ -850,8 +880,8 @@ class VirtualChassisFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = VirtualChassis fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Location', ('region_id', 'site_group_id', 'site_id')), - ('Tenant', ('tenant_group_id', 'tenant_id')), + (_('Location'), ('region_id', 'site_group_id', 'site_id')), + (_('Tenant'), ('tenant_group_id', 'tenant_id')), ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), @@ -879,9 +909,9 @@ class CableFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Cable fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Location', ('site_id', 'location_id', 'rack_id', 'device_id')), - ('Attributes', ('type', 'status', 'color', 'length', 'length_unit')), - ('Tenant', ('tenant_group_id', 'tenant_id')), + (_('Location'), ('site_id', 'location_id', 'rack_id', 'device_id')), + (_('Attributes'), ('type', 'status', 'color', 'length', 'length_unit')), + (_('Tenant'), ('tenant_group_id', 'tenant_id')), ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), @@ -927,20 +957,25 @@ class CableFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): label=_('Device') ) type = forms.MultipleChoiceField( + label=_('Type'), choices=add_blank_choice(CableTypeChoices), required=False ) status = forms.MultipleChoiceField( + label=_('Status'), required=False, choices=add_blank_choice(LinkStatusChoices) ) color = ColorField( + label=_('Color'), required=False ) length = forms.IntegerField( + label=_('Length'), required=False ) length_unit = forms.ChoiceField( + label=_('Length unit'), choices=add_blank_choice(CableLengthUnitChoices), required=False ) @@ -951,8 +986,8 @@ class PowerPanelFilterForm(ContactModelFilterForm, NetBoxModelFilterSetForm): model = PowerPanel fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id')), - ('Contacts', ('contact', 'contact_role', 'contact_group')), + (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id')), + (_('Contacts'), ('contact', 'contact_role', 'contact_group')), ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), @@ -989,8 +1024,8 @@ class PowerFeedFilterForm(NetBoxModelFilterSetForm): model = PowerFeed fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Location', ('region_id', 'site_group_id', 'site_id', 'power_panel_id', 'rack_id')), - ('Attributes', ('status', 'type', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization')), + (_('Location'), ('region_id', 'site_group_id', 'site_id', 'power_panel_id', 'rack_id')), + (_('Attributes'), ('status', 'type', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization')), ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), @@ -1029,28 +1064,35 @@ class PowerFeedFilterForm(NetBoxModelFilterSetForm): label=_('Rack') ) status = forms.MultipleChoiceField( + label=_('Status'), choices=PowerFeedStatusChoices, required=False ) type = forms.ChoiceField( + label=_('Type'), choices=add_blank_choice(PowerFeedTypeChoices), required=False ) supply = forms.ChoiceField( + label=_('Supply'), choices=add_blank_choice(PowerFeedSupplyChoices), required=False ) phase = forms.ChoiceField( + label=_('Phase'), choices=add_blank_choice(PowerFeedPhaseChoices), required=False ) voltage = forms.IntegerField( + label=_('Voltage'), required=False ) amperage = forms.IntegerField( + label=_('Amperage'), required=False ) max_utilization = forms.IntegerField( + label=_('Max utilization'), required=False ) tag = TagFilterField(model) @@ -1062,12 +1104,14 @@ class PowerFeedFilterForm(NetBoxModelFilterSetForm): class CabledFilterForm(forms.Form): cabled = forms.NullBooleanField( + label=_('Cabled'), required=False, widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) occupied = forms.NullBooleanField( + label=_('Occupied'), required=False, widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES @@ -1077,6 +1121,7 @@ class CabledFilterForm(forms.Form): class PathEndpointFilterForm(CabledFilterForm): connected = forms.NullBooleanField( + label=_('Connected'), required=False, widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES @@ -1088,16 +1133,18 @@ class ConsolePortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): model = ConsolePort fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Attributes', ('name', 'label', 'type', 'speed')), - ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - ('Device', ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), - ('Connection', ('cabled', 'connected', 'occupied')), + (_('Attributes'), ('name', 'label', 'type', 'speed')), + (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), + (_('Connection'), ('cabled', 'connected', 'occupied')), ) type = forms.MultipleChoiceField( + label=_('Type'), choices=ConsolePortTypeChoices, required=False ) speed = forms.MultipleChoiceField( + label=_('Speed'), choices=ConsolePortSpeedChoices, required=False ) @@ -1108,16 +1155,18 @@ class ConsoleServerPortFilterForm(PathEndpointFilterForm, DeviceComponentFilterF model = ConsoleServerPort fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Attributes', ('name', 'label', 'type', 'speed')), - ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - ('Device', ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), - ('Connection', ('cabled', 'connected', 'occupied')), + (_('Attributes'), ('name', 'label', 'type', 'speed')), + (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), + (_('Connection'), ('cabled', 'connected', 'occupied')), ) type = forms.MultipleChoiceField( + label=_('Type'), choices=ConsolePortTypeChoices, required=False ) speed = forms.MultipleChoiceField( + label=_('Speed'), choices=ConsolePortSpeedChoices, required=False ) @@ -1128,12 +1177,13 @@ class PowerPortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): model = PowerPort fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Attributes', ('name', 'label', 'type')), - ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - ('Device', ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), - ('Connection', ('cabled', 'connected', 'occupied')), + (_('Attributes'), ('name', 'label', 'type')), + (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), + (_('Connection'), ('cabled', 'connected', 'occupied')), ) type = forms.MultipleChoiceField( + label=_('Type'), choices=PowerPortTypeChoices, required=False ) @@ -1144,12 +1194,13 @@ class PowerOutletFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): model = PowerOutlet fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Attributes', ('name', 'label', 'type')), - ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - ('Device', ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), - ('Connection', ('cabled', 'connected', 'occupied')), + (_('Attributes'), ('name', 'label', 'type')), + (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), + (_('Connection'), ('cabled', 'connected', 'occupied')), ) type = forms.MultipleChoiceField( + label=_('Type'), choices=PowerOutletTypeChoices, required=False ) @@ -1160,13 +1211,13 @@ class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): model = Interface fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Attributes', ('name', 'label', 'kind', 'type', 'speed', 'duplex', 'enabled', 'mgmt_only')), - ('Addressing', ('vrf_id', 'l2vpn_id', 'mac_address', 'wwn')), - ('PoE', ('poe_mode', 'poe_type')), - ('Wireless', ('rf_role', 'rf_channel', 'rf_channel_width', 'tx_power')), - ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - ('Device', ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id', 'vdc_id')), - ('Connection', ('cabled', 'connected', 'occupied')), + (_('Attributes'), ('name', 'label', 'kind', 'type', 'speed', 'duplex', 'enabled', 'mgmt_only')), + (_('Addressing'), ('vrf_id', 'l2vpn_id', 'mac_address', 'wwn')), + (_('PoE'), ('poe_mode', 'poe_type')), + (_('Wireless'), ('rf_role', 'rf_channel', 'rf_channel_width', 'tx_power')), + (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id', 'vdc_id')), + (_('Connection'), ('cabled', 'connected', 'occupied')), ) vdc_id = DynamicModelMultipleChoiceField( queryset=VirtualDeviceContext.objects.all(), @@ -1177,30 +1228,36 @@ class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): label=_('Virtual Device Context') ) kind = forms.MultipleChoiceField( + label=_('Kind'), choices=InterfaceKindChoices, required=False ) type = forms.MultipleChoiceField( + label=_('Type'), choices=InterfaceTypeChoices, required=False ) speed = forms.IntegerField( + label=_('Speed'), required=False, widget=NumberWithOptions( options=InterfaceSpeedChoices ) ) duplex = forms.MultipleChoiceField( + label=_('Duplex'), choices=InterfaceDuplexChoices, required=False ) enabled = forms.NullBooleanField( + label=_('Enabled'), required=False, widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) mgmt_only = forms.NullBooleanField( + label=_('Mgmt only'), required=False, widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES @@ -1208,50 +1265,50 @@ class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): ) mac_address = forms.CharField( required=False, - label='MAC address' + label=_('MAC address') ) wwn = forms.CharField( required=False, - label='WWN' + label=_('WWN') ) poe_mode = forms.MultipleChoiceField( choices=InterfacePoEModeChoices, required=False, - label='PoE mode' + label=_('PoE mode') ) poe_type = forms.MultipleChoiceField( choices=InterfacePoETypeChoices, required=False, - label='PoE type' + label=_('PoE type') ) rf_role = forms.MultipleChoiceField( choices=WirelessRoleChoices, required=False, - label='Wireless role' + label=_('Wireless role') ) rf_channel = forms.MultipleChoiceField( choices=WirelessChannelChoices, required=False, - label='Wireless channel' + label=_('Wireless channel') ) rf_channel_frequency = forms.IntegerField( required=False, - label='Channel frequency (MHz)' + label=_('Channel frequency (MHz)') ) rf_channel_width = forms.IntegerField( required=False, - label='Channel width (MHz)' + label=_('Channel width (MHz)') ) tx_power = forms.IntegerField( required=False, - label='Transmit power (dBm)', + label=_('Transmit power (dBm)'), min_value=0, max_value=127 ) vrf_id = DynamicModelMultipleChoiceField( queryset=VRF.objects.all(), required=False, - label='VRF' + label=_('VRF') ) l2vpn_id = DynamicModelMultipleChoiceField( queryset=L2VPN.objects.all(), @@ -1264,17 +1321,19 @@ class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): class FrontPortFilterForm(CabledFilterForm, DeviceComponentFilterForm): fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Attributes', ('name', 'label', 'type', 'color')), - ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - ('Device', ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), - ('Cable', ('cabled', 'occupied')), + (_('Attributes'), ('name', 'label', 'type', 'color')), + (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), + (_('Cable'), ('cabled', 'occupied')), ) model = FrontPort type = forms.MultipleChoiceField( + label=_('Type'), choices=PortTypeChoices, required=False ) color = ColorField( + label=_('Color'), required=False ) tag = TagFilterField(model) @@ -1284,16 +1343,18 @@ class RearPortFilterForm(CabledFilterForm, DeviceComponentFilterForm): model = RearPort fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Attributes', ('name', 'label', 'type', 'color')), - ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - ('Device', ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), - ('Cable', ('cabled', 'occupied')), + (_('Attributes'), ('name', 'label', 'type', 'color')), + (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), + (_('Cable'), ('cabled', 'occupied')), ) type = forms.MultipleChoiceField( + label=_('Type'), choices=PortTypeChoices, required=False ) color = ColorField( + label=_('Color'), required=False ) tag = TagFilterField(model) @@ -1303,12 +1364,13 @@ class ModuleBayFilterForm(DeviceComponentFilterForm): model = ModuleBay fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Attributes', ('name', 'label', 'position')), - ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - ('Device', ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), + (_('Attributes'), ('name', 'label', 'position')), + (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), ) tag = TagFilterField(model) position = forms.CharField( + label=_('Position'), required=False ) @@ -1317,9 +1379,9 @@ class DeviceBayFilterForm(DeviceComponentFilterForm): model = DeviceBay fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Attributes', ('name', 'label')), - ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - ('Device', ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), + (_('Attributes'), ('name', 'label')), + (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), ) tag = TagFilterField(model) @@ -1328,9 +1390,9 @@ class InventoryItemFilterForm(DeviceComponentFilterForm): model = InventoryItem fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Attributes', ('name', 'label', 'role_id', 'manufacturer_id', 'serial', 'asset_tag', 'discovered')), - ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - ('Device', ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), + (_('Attributes'), ('name', 'label', 'role_id', 'manufacturer_id', 'serial', 'asset_tag', 'discovered')), + (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), ) role_id = DynamicModelMultipleChoiceField( queryset=InventoryItemRole.objects.all(), @@ -1344,12 +1406,15 @@ class InventoryItemFilterForm(DeviceComponentFilterForm): label=_('Manufacturer') ) serial = forms.CharField( + label=_('Serial'), required=False ) asset_tag = forms.CharField( + label=_('Asset tag'), required=False ) discovered = forms.NullBooleanField( + label=_('Discovered'), required=False, widget=forms.Select( choices=BOOLEAN_WITH_BLANK_CHOICES diff --git a/netbox/dcim/forms/formsets.py b/netbox/dcim/forms/formsets.py index 6109a1575..37e3be0b7 100644 --- a/netbox/dcim/forms/formsets.py +++ b/netbox/dcim/forms/formsets.py @@ -1,4 +1,5 @@ from django import forms +from django.utils.translation import gettext_lazy as _ __all__ = ( 'BaseVCMemberFormSet', @@ -16,6 +17,6 @@ class BaseVCMemberFormSet(forms.BaseModelFormSet): vc_position = form.cleaned_data.get('vc_position') if vc_position: if vc_position in vc_position_list: - error_msg = f"A virtual chassis member already exists in position {vc_position}." + error_msg = _("A virtual chassis member already exists in position {vc_position}.").format(vc_position=vc_position) form.add_error('vc_position', error_msg) vc_position_list.append(vc_position) diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index 632dabb81..f67e7398c 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -1,7 +1,7 @@ from django import forms from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType -from django.utils.translation import gettext as _ +from django.utils.translation import gettext_lazy as _ from timezone_field import TimeZoneFormField from dcim.choices import * @@ -70,13 +70,16 @@ __all__ = ( class RegionForm(NetBoxModelForm): parent = DynamicModelChoiceField( + label=_('Parent'), queryset=Region.objects.all(), required=False ) - slug = SlugField() + slug = SlugField( + label=_('Slug'), + ) fieldsets = ( - ('Region', ( + (_('Region'), ( 'parent', 'name', 'slug', 'description', 'tags', )), ) @@ -90,13 +93,16 @@ class RegionForm(NetBoxModelForm): class SiteGroupForm(NetBoxModelForm): parent = DynamicModelChoiceField( + label=_('Parent'), queryset=SiteGroup.objects.all(), required=False ) - slug = SlugField() + slug = SlugField( + label=_('Slug'), + ) fieldsets = ( - ('Site Group', ( + (_('Site Group'), ( 'parent', 'name', 'slug', 'description', 'tags', )), ) @@ -110,10 +116,12 @@ class SiteGroupForm(NetBoxModelForm): class SiteForm(TenancyForm, NetBoxModelForm): region = DynamicModelChoiceField( + label=_('Region'), queryset=Region.objects.all(), required=False ) group = DynamicModelChoiceField( + label=_('Group'), queryset=SiteGroup.objects.all(), required=False ) @@ -122,19 +130,24 @@ class SiteForm(TenancyForm, NetBoxModelForm): label=_('ASNs'), required=False ) - slug = SlugField() + slug = SlugField( + label=_('Slug'), + ) time_zone = TimeZoneFormField( + label=_('Time zone'), choices=add_blank_choice(TimeZoneFormField().choices), required=False ) - comments = CommentField() + comments = CommentField( + label=_('Comments'), + ) fieldsets = ( - ('Site', ( + (_('Site'), ( 'name', 'slug', 'status', 'region', 'group', 'facility', 'asns', 'time_zone', 'description', 'tags', )), - ('Tenancy', ('tenant_group', 'tenant')), - ('Contact Info', ('physical_address', 'shipping_address', 'latitude', 'longitude')), + (_('Tenancy'), ('tenant_group', 'tenant')), + (_('Contact Info'), ('physical_address', 'shipping_address', 'latitude', 'longitude')), ) class Meta: @@ -159,10 +172,12 @@ class SiteForm(TenancyForm, NetBoxModelForm): class LocationForm(TenancyForm, NetBoxModelForm): site = DynamicModelChoiceField( + label=_('Site'), queryset=Site.objects.all(), selector=True ) parent = DynamicModelChoiceField( + label=_('Parent'), queryset=Location.objects.all(), required=False, query_params={ @@ -172,8 +187,8 @@ class LocationForm(TenancyForm, NetBoxModelForm): slug = SlugField() fieldsets = ( - ('Location', ('site', 'parent', 'name', 'slug', 'status', 'description', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')), + (_('Location'), ('site', 'parent', 'name', 'slug', 'status', 'description', 'tags')), + (_('Tenancy'), ('tenant_group', 'tenant')), ) class Meta: @@ -184,10 +199,12 @@ class LocationForm(TenancyForm, NetBoxModelForm): class RackRoleForm(NetBoxModelForm): - slug = SlugField() + slug = SlugField( + label=_('Slug'), + ) fieldsets = ( - ('Rack Role', ( + (_('Rack Role'), ( 'name', 'slug', 'color', 'description', 'tags', )), ) @@ -201,10 +218,12 @@ class RackRoleForm(NetBoxModelForm): class RackForm(TenancyForm, NetBoxModelForm): site = DynamicModelChoiceField( + label=_('Site'), queryset=Site.objects.all(), selector=True ) location = DynamicModelChoiceField( + label=_('Location'), queryset=Location.objects.all(), required=False, query_params={ @@ -212,10 +231,13 @@ class RackForm(TenancyForm, NetBoxModelForm): } ) role = DynamicModelChoiceField( + label=_('Role'), queryset=RackRole.objects.all(), required=False ) - comments = CommentField() + comments = CommentField( + label=_('Comments'), + ) class Meta: model = Rack @@ -228,14 +250,17 @@ class RackForm(TenancyForm, NetBoxModelForm): class RackReservationForm(TenancyForm, NetBoxModelForm): rack = DynamicModelChoiceField( + label=_('Rack'), queryset=Rack.objects.all(), selector=True ) units = NumericArrayField( + label=_('Units'), base_field=forms.IntegerField(), help_text=_("Comma-separated list of numeric unit IDs. A range may be specified using a hyphen.") ) user = forms.ModelChoiceField( + label=_('User'), queryset=get_user_model().objects.order_by( 'username' ) @@ -243,8 +268,8 @@ class RackReservationForm(TenancyForm, NetBoxModelForm): comments = CommentField() fieldsets = ( - ('Reservation', ('rack', 'units', 'user', 'description', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')), + (_('Reservation'), ('rack', 'units', 'user', 'description', 'tags')), + (_('Tenancy'), ('tenant_group', 'tenant')), ) class Meta: @@ -255,10 +280,12 @@ class RackReservationForm(TenancyForm, NetBoxModelForm): class ManufacturerForm(NetBoxModelForm): - slug = SlugField() + slug = SlugField( + label=_('Slug'), + ) fieldsets = ( - ('Manufacturer', ( + (_('Manufacturer'), ( 'name', 'slug', 'description', 'tags', )), ) @@ -272,23 +299,28 @@ class ManufacturerForm(NetBoxModelForm): class DeviceTypeForm(NetBoxModelForm): manufacturer = DynamicModelChoiceField( + label=_('Manufacturer'), queryset=Manufacturer.objects.all() ) default_platform = DynamicModelChoiceField( + label=_('Default platform'), queryset=Platform.objects.all(), required=False ) slug = SlugField( + label=_('Slug'), slug_source='model' ) - comments = CommentField() + comments = CommentField( + label=_('Comments'), + ) fieldsets = ( - ('Device Type', ('manufacturer', 'model', 'slug', 'default_platform', 'description', 'tags')), - ('Chassis', ( + (_('Device Type'), ('manufacturer', 'model', 'slug', 'default_platform', 'description', 'tags')), + (_('Chassis'), ( 'u_height', 'is_full_depth', 'part_number', 'subdevice_role', 'airflow', 'weight', 'weight_unit', )), - ('Images', ('front_image', 'rear_image')), + (_('Images'), ('front_image', 'rear_image')), ) class Meta: @@ -310,13 +342,16 @@ class DeviceTypeForm(NetBoxModelForm): class ModuleTypeForm(NetBoxModelForm): manufacturer = DynamicModelChoiceField( + label=_('Manufacturer'), queryset=Manufacturer.objects.all() ) - comments = CommentField() + comments = CommentField( + label=_('Comments'), + ) fieldsets = ( - ('Module Type', ('manufacturer', 'model', 'part_number', 'description', 'tags')), - ('Weight', ('weight', 'weight_unit')) + (_('Module Type'), ('manufacturer', 'model', 'part_number', 'description', 'tags')), + (_('Weight'), ('weight', 'weight_unit')) ) class Meta: @@ -328,13 +363,16 @@ class ModuleTypeForm(NetBoxModelForm): class DeviceRoleForm(NetBoxModelForm): config_template = DynamicModelChoiceField( + label=_('Config template'), queryset=ConfigTemplate.objects.all(), required=False ) - slug = SlugField() + slug = SlugField( + label=_('Slug'), + ) fieldsets = ( - ('Device Role', ( + (_('Device Role'), ( 'name', 'slug', 'color', 'vm_role', 'config_template', 'description', 'tags', )), ) @@ -348,19 +386,22 @@ class DeviceRoleForm(NetBoxModelForm): class PlatformForm(NetBoxModelForm): manufacturer = DynamicModelChoiceField( + label=_('Manufacturer'), queryset=Manufacturer.objects.all(), required=False ) config_template = DynamicModelChoiceField( + label=_('Config template'), queryset=ConfigTemplate.objects.all(), required=False ) slug = SlugField( + label=_('Slug'), max_length=64 ) fieldsets = ( - ('Platform', ('name', 'slug', 'manufacturer', 'config_template', 'description', 'tags')), + (_('Platform'), ('name', 'slug', 'manufacturer', 'config_template', 'description', 'tags')), ) class Meta: @@ -372,10 +413,12 @@ class PlatformForm(NetBoxModelForm): class DeviceForm(TenancyForm, NetBoxModelForm): site = DynamicModelChoiceField( + label=_('Site'), queryset=Site.objects.all(), selector=True ) location = DynamicModelChoiceField( + label=_('Location'), queryset=Location.objects.all(), required=False, query_params={ @@ -386,6 +429,7 @@ class DeviceForm(TenancyForm, NetBoxModelForm): } ) rack = DynamicModelChoiceField( + label=_('Rack'), queryset=Rack.objects.all(), required=False, query_params={ @@ -394,6 +438,7 @@ class DeviceForm(TenancyForm, NetBoxModelForm): } ) position = forms.DecimalField( + label=_('Position'), required=False, help_text=_("The lowest-numbered unit occupied by the device"), widget=APISelect( @@ -405,27 +450,34 @@ class DeviceForm(TenancyForm, NetBoxModelForm): ) ) device_type = DynamicModelChoiceField( + label=_('Device type'), queryset=DeviceType.objects.all(), selector=True ) device_role = DynamicModelChoiceField( + label=_('Device role'), queryset=DeviceRole.objects.all() ) platform = DynamicModelChoiceField( + label=_('Platform'), queryset=Platform.objects.all(), required=False ) cluster = DynamicModelChoiceField( + label=_('Cluster'), queryset=Cluster.objects.all(), required=False, selector=True ) - comments = CommentField() + comments = CommentField( + label=_('Comments'), + ) local_context_data = JSONField( required=False, label='' ) virtual_chassis = DynamicModelChoiceField( + label=_('Virtual chassis'), queryset=VirtualChassis.objects.all(), required=False, selector=True @@ -441,6 +493,7 @@ class DeviceForm(TenancyForm, NetBoxModelForm): help_text=_("The priority of the device in the virtual chassis") ) config_template = DynamicModelChoiceField( + label=_('Config template'), queryset=ConfigTemplate.objects.all(), required=False ) @@ -518,36 +571,43 @@ class DeviceForm(TenancyForm, NetBoxModelForm): class ModuleForm(ModuleCommonForm, NetBoxModelForm): device = DynamicModelChoiceField( + label=_('Device'), queryset=Device.objects.all(), initial_params={ 'modulebays': '$module_bay' } ) module_bay = DynamicModelChoiceField( + label=_('Module bay'), queryset=ModuleBay.objects.all(), query_params={ 'device_id': '$device' } ) module_type = DynamicModelChoiceField( + label=_('Module type'), queryset=ModuleType.objects.all(), selector=True ) - comments = CommentField() + comments = CommentField( + label=_('Comments'), + ) replicate_components = forms.BooleanField( + label=_('Replicate components'), required=False, initial=True, help_text=_("Automatically populate components associated with this module type") ) adopt_components = forms.BooleanField( + label=_('Adopt components'), required=False, initial=False, help_text=_("Adopt already existing components") ) fieldsets = ( - ('Module', ('device', 'module_bay', 'module_type', 'status', 'description', 'tags')), - ('Hardware', ( + (_('Module'), ('device', 'module_bay', 'module_type', 'status', 'description', 'tags')), + (_('Hardware'), ( 'serial', 'asset_tag', 'replicate_components', 'adopt_components', )), ) @@ -571,7 +631,9 @@ class ModuleForm(ModuleCommonForm, NetBoxModelForm): class CableForm(TenancyForm, NetBoxModelForm): - comments = CommentField() + comments = CommentField( + label=_('Comments'), + ) class Meta: model = Cable @@ -581,17 +643,19 @@ class CableForm(TenancyForm, NetBoxModelForm): ] error_messages = { 'length': { - 'max_value': 'Maximum length is 32767 (any unit)' + 'max_value': _('Maximum length is 32767 (any unit)') } } class PowerPanelForm(NetBoxModelForm): site = DynamicModelChoiceField( + label=_('Site'), queryset=Site.objects.all(), selector=True ) location = DynamicModelChoiceField( + label=_('Location'), queryset=Location.objects.all(), required=False, query_params={ @@ -613,19 +677,23 @@ class PowerPanelForm(NetBoxModelForm): class PowerFeedForm(NetBoxModelForm): power_panel = DynamicModelChoiceField( + label=_('Power panel'), queryset=PowerPanel.objects.all(), selector=True ) rack = DynamicModelChoiceField( + label=_('Rack'), queryset=Rack.objects.all(), required=False, selector=True ) - comments = CommentField() + comments = CommentField( + label=_('Comments'), + ) fieldsets = ( - ('Power Feed', ('power_panel', 'rack', 'name', 'status', 'type', 'description', 'mark_connected', 'tags')), - ('Characteristics', ('supply', 'voltage', 'amperage', 'phase', 'max_utilization')), + (_('Power Feed'), ('power_panel', 'rack', 'name', 'status', 'type', 'description', 'mark_connected', 'tags')), + (_('Characteristics'), ('supply', 'voltage', 'amperage', 'phase', 'max_utilization')), ) class Meta: @@ -642,10 +710,13 @@ class PowerFeedForm(NetBoxModelForm): class VirtualChassisForm(NetBoxModelForm): master = forms.ModelChoiceField( + label=_('Master'), queryset=Device.objects.all(), required=False, ) - comments = CommentField() + comments = CommentField( + label=_('Comments'), + ) class Meta: model = VirtualChassis @@ -705,6 +776,7 @@ class DeviceVCMembershipForm(forms.ModelForm): class VCMemberSelectForm(BootstrapMixin, forms.Form): device = DynamicModelChoiceField( + label=_('Device'), queryset=Device.objects.all(), query_params={ 'virtual_chassis_id': 'null', @@ -727,6 +799,7 @@ class VCMemberSelectForm(BootstrapMixin, forms.Form): class ComponentTemplateForm(BootstrapMixin, forms.ModelForm): device_type = DynamicModelChoiceField( + label=_('Device type'), queryset=DeviceType.objects.all() ) @@ -740,10 +813,12 @@ class ComponentTemplateForm(BootstrapMixin, forms.ModelForm): class ModularComponentTemplateForm(ComponentTemplateForm): device_type = DynamicModelChoiceField( + label=_('Device type'), queryset=DeviceType.objects.all().all(), required=False ) module_type = DynamicModelChoiceField( + label=_('Module type'), queryset=ModuleType.objects.all(), required=False ) @@ -796,6 +871,7 @@ class PowerPortTemplateForm(ModularComponentTemplateForm): class PowerOutletTemplateForm(ModularComponentTemplateForm): power_port = DynamicModelChoiceField( + label=_('Power port'), queryset=PowerPortTemplate.objects.all(), required=False, query_params={ @@ -816,6 +892,7 @@ class PowerOutletTemplateForm(ModularComponentTemplateForm): class InterfaceTemplateForm(ModularComponentTemplateForm): bridge = DynamicModelChoiceField( + label=_('Bridge'), queryset=InterfaceTemplate.objects.all(), required=False, query_params={ @@ -826,8 +903,8 @@ class InterfaceTemplateForm(ModularComponentTemplateForm): fieldsets = ( (None, ('device_type', 'module_type', 'name', 'label', 'type', 'enabled', 'mgmt_only', 'description', 'bridge')), - ('PoE', ('poe_mode', 'poe_type')), - ('Wireless', ('rf_role',)) + (_('PoE'), ('poe_mode', 'poe_type')), + (_('Wireless'), ('rf_role',)), ) class Meta: @@ -839,6 +916,7 @@ class InterfaceTemplateForm(ModularComponentTemplateForm): class FrontPortTemplateForm(ModularComponentTemplateForm): rear_port = DynamicModelChoiceField( + label=_('Rear port'), queryset=RearPortTemplate.objects.all(), required=False, query_params={ @@ -900,6 +978,7 @@ class DeviceBayTemplateForm(ComponentTemplateForm): class InventoryItemTemplateForm(ComponentTemplateForm): parent = DynamicModelChoiceField( + label=_('Parent'), queryset=InventoryItemTemplate.objects.all(), required=False, query_params={ @@ -907,20 +986,24 @@ class InventoryItemTemplateForm(ComponentTemplateForm): } ) role = DynamicModelChoiceField( + label=_('Role'), queryset=InventoryItemRole.objects.all(), required=False ) manufacturer = DynamicModelChoiceField( + label=_('Manufacturer'), queryset=Manufacturer.objects.all(), required=False ) component_type = ContentTypeChoiceField( + label=_('Component type'), queryset=ContentType.objects.all(), limit_choices_to=MODULAR_COMPONENT_TEMPLATE_MODELS, required=False, widget=forms.HiddenInput ) component_id = forms.IntegerField( + label=_('Component id'), required=False, widget=forms.HiddenInput ) @@ -946,6 +1029,7 @@ class InventoryItemTemplateForm(ComponentTemplateForm): class DeviceComponentForm(NetBoxModelForm): device = DynamicModelChoiceField( + label=_('Device'), queryset=Device.objects.all(), selector=True ) @@ -960,6 +1044,7 @@ class DeviceComponentForm(NetBoxModelForm): class ModularDeviceComponentForm(DeviceComponentForm): module = DynamicModelChoiceField( + label=_('Module'), queryset=Module.objects.all(), required=False, query_params={ @@ -1016,6 +1101,7 @@ class PowerPortForm(ModularDeviceComponentForm): class PowerOutletForm(ModularDeviceComponentForm): power_port = DynamicModelChoiceField( + label=_('Power port'), queryset=PowerPort.objects.all(), required=False, query_params={ @@ -1042,7 +1128,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm): vdcs = DynamicModelMultipleChoiceField( queryset=VirtualDeviceContext.objects.all(), required=False, - label='Virtual Device Contexts', + label=_('Virtual Device Contexts'), query_params={ 'device_id': '$device', } @@ -1120,13 +1206,13 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm): ) fieldsets = ( - ('Interface', ('device', 'module', 'name', 'label', 'type', 'speed', 'duplex', 'description', 'tags')), - ('Addressing', ('vrf', 'mac_address', 'wwn')), - ('Operation', ('vdcs', 'mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected')), - ('Related Interfaces', ('parent', 'bridge', 'lag')), - ('PoE', ('poe_mode', 'poe_type')), - ('802.1Q Switching', ('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans')), - ('Wireless', ( + (_('Interface'), ('device', 'module', 'name', 'label', 'type', 'speed', 'duplex', 'description', 'tags')), + (_('Addressing'), ('vrf', 'mac_address', 'wwn')), + (_('Operation'), ('vdcs', 'mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected')), + (_('Related Interfaces'), ('parent', 'bridge', 'lag')), + (_('PoE'), ('poe_mode', 'poe_type')), + (_('802.1Q Switching'), ('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans')), + (_('Wireless'), ( 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'wireless_lan_group', 'wireless_lans', )), ) @@ -1232,6 +1318,7 @@ class PopulateDeviceBayForm(BootstrapMixin, forms.Form): class InventoryItemForm(DeviceComponentForm): parent = DynamicModelChoiceField( + label=_('Parent'), queryset=InventoryItem.objects.all(), required=False, query_params={ @@ -1239,10 +1326,12 @@ class InventoryItemForm(DeviceComponentForm): } ) role = DynamicModelChoiceField( + label=_('Role'), queryset=InventoryItemRole.objects.all(), required=False ) manufacturer = DynamicModelChoiceField( + label=_('Manufacturer'), queryset=Manufacturer.objects.all(), required=False ) @@ -1306,8 +1395,8 @@ class InventoryItemForm(DeviceComponentForm): ) fieldsets = ( - ('Inventory Item', ('device', 'parent', 'name', 'label', 'role', 'description', 'tags')), - ('Hardware', ('manufacturer', 'part_id', 'serial', 'asset_tag')), + (_('Inventory Item'), ('device', 'parent', 'name', 'label', 'role', 'description', 'tags')), + (_('Hardware'), ('manufacturer', 'part_id', 'serial', 'asset_tag')), ) class Meta: @@ -1358,7 +1447,7 @@ class InventoryItemForm(DeviceComponentForm): ) if self.cleaned_data[field] ] if len(selected_objects) > 1: - raise forms.ValidationError("An InventoryItem can only be assigned to a single component.") + raise forms.ValidationError(_("An InventoryItem can only be assigned to a single component.")) elif selected_objects: self.instance.component = self.cleaned_data[selected_objects[0]] else: @@ -1369,10 +1458,12 @@ class InventoryItemForm(DeviceComponentForm): # class InventoryItemRoleForm(NetBoxModelForm): - slug = SlugField() + slug = SlugField( + label=_('Slug'), + ) fieldsets = ( - ('Inventory Item Role', ( + (_('Inventory Item Role'), ( 'name', 'slug', 'color', 'description', 'tags', )), ) @@ -1386,12 +1477,13 @@ class InventoryItemRoleForm(NetBoxModelForm): class VirtualDeviceContextForm(TenancyForm, NetBoxModelForm): device = DynamicModelChoiceField( + label=_('Device'), queryset=Device.objects.all(), selector=True ) primary_ip4 = DynamicModelChoiceField( queryset=IPAddress.objects.all(), - label='Primary IPv4', + label=_('Primary IPv4'), required=False, query_params={ 'device_id': '$device', @@ -1400,7 +1492,7 @@ class VirtualDeviceContextForm(TenancyForm, NetBoxModelForm): ) primary_ip6 = DynamicModelChoiceField( queryset=IPAddress.objects.all(), - label='Primary IPv6', + label=_('Primary IPv6'), required=False, query_params={ 'device_id': '$device', @@ -1409,8 +1501,8 @@ class VirtualDeviceContextForm(TenancyForm, NetBoxModelForm): ) fieldsets = ( - ('Virtual Device Context', ('device', 'name', 'status', 'identifier', 'primary_ip4', 'primary_ip6', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')) + (_('Virtual Device Context'), ('device', 'name', 'status', 'identifier', 'primary_ip4', 'primary_ip6', 'tags')), + (_('Tenancy'), ('tenant_group', 'tenant')) ) class Meta: