diff --git a/.github/ISSUE_TEMPLATE/01-feature_request.yaml b/.github/ISSUE_TEMPLATE/01-feature_request.yaml
index 82ba01c77..f07db712d 100644
--- a/.github/ISSUE_TEMPLATE/01-feature_request.yaml
+++ b/.github/ISSUE_TEMPLATE/01-feature_request.yaml
@@ -14,7 +14,7 @@ body:
attributes:
label: NetBox version
description: What version of NetBox are you currently running?
- placeholder: v4.1.1
+ placeholder: v4.1.3
validations:
required: true
- type: dropdown
@@ -24,6 +24,21 @@ body:
- Data model extension
- New functionality
- Change to existing functionality
+ - Other
+ validations:
+ required: true
+ - type: dropdown
+ attributes:
+ label: Triage priority
+ description: >
+ Issue triage may be prioritized in some cases. Select whichever of the following
+ conditions applies, if any.
+ options:
+ - I volunteer to perform this work (if approved)
+ - I'm a NetBox Labs customer
+ - This is a very minor change
+ - N/A
+ default: 3
validations:
required: true
- type: textarea
diff --git a/.github/ISSUE_TEMPLATE/02-bug_report.yaml b/.github/ISSUE_TEMPLATE/02-bug_report.yaml
index 2476bbcfc..892981402 100644
--- a/.github/ISSUE_TEMPLATE/02-bug_report.yaml
+++ b/.github/ISSUE_TEMPLATE/02-bug_report.yaml
@@ -22,11 +22,25 @@ body:
- Self-hosted
validations:
required: true
+ - type: dropdown
+ attributes:
+ label: Triage priority
+ description: >
+ Issue triage may be prioritized in some cases. Select whichever of the following
+ conditions applies, if any.
+ options:
+ - I volunteer to perform this work (if approved)
+ - I'm a NetBox Labs customer
+ - This is preventing me from using NetBox
+ - N/A
+ default: 3
+ validations:
+ required: true
- type: input
attributes:
label: NetBox Version
description: What version of NetBox are you currently running?
- placeholder: v4.1.1
+ placeholder: v4.1.3
validations:
required: true
- type: dropdown
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index b4be03742..c3b4876c3 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -73,7 +73,7 @@ jobs:
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- pip install pycodestyle coverage tblib
+ pip install ruff coverage tblib
- name: Build documentation
run: mkdocs build
@@ -85,7 +85,7 @@ jobs:
run: python netbox/manage.py makemigrations --check
- name: Check PEP8 compliance
- run: pycodestyle --ignore=W504,E501 --exclude=node_modules netbox/
+ run: ruff check netbox/
- name: Check UI ESLint, TypeScript, and Prettier Compliance
run: yarn --cwd netbox/project-static validate
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 000000000..09f935b61
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,44 @@
+repos:
+- repo: https://github.com/astral-sh/ruff-pre-commit
+ rev: v0.6.9
+ hooks:
+ - id: ruff
+ name: "Ruff linter"
+ args: [ netbox/ ]
+- repo: local
+ hooks:
+ - id: django-check
+ name: "Django system check"
+ description: "Run Django's internal check for common problems"
+ entry: python netbox/manage.py check
+ language: system
+ pass_filenames: false
+ types: [python]
+ - id: django-makemigrations
+ name: "Django migrations check"
+ description: "Check for any missing Django migrations"
+ entry: python netbox/manage.py makemigrations --check
+ language: system
+ pass_filenames: false
+ types: [python]
+ - id: mkdocs-build
+ name: "Build documentation"
+ description: "Build the documentation with mkdocs"
+ files: 'docs/'
+ entry: mkdocs build
+ language: system
+ pass_filenames: false
+ - id: yarn-validate
+ name: "Yarn validate"
+ description: "Check UI ESLint, TypeScript, and Prettier compliance"
+ files: 'netbox/project-static/'
+ entry: yarn --cwd netbox/project-static validate
+ language: system
+ pass_filenames: false
+ - id: verify-bundles
+ name: "Verify static asset bundles"
+ description: "Ensure that any modified static assets have been compiled"
+ files: 'netbox/project-static/'
+ entry: scripts/verify-bundles.sh
+ language: system
+ pass_filenames: false
diff --git a/README.md b/README.md
index 34975980b..0c793b8a4 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,11 @@
-
+ NetBox Community | + NetBox Cloud | + NetBox Enterprise +
NetBox exists to empower network engineers. Since its release in 2016, it has become the go-to solution for modeling and documenting network infrastructure for thousands of organizations worldwide. As a successor to legacy IPAM and DCIM applications, NetBox provides a cohesive, extensive, and accessible data model for all things networked. By providing a single robust user interface and programmable APIs for everything from cable maps to device configurations, NetBox serves as the central source of truth for the modern network. @@ -81,11 +85,6 @@ NetBox automatically logs the creation, modification, and deletion of all manage * The [official documentation](https://docs.netbox.dev) offers a comprehensive introduction. * Check out [our wiki](https://github.com/netbox-community/netbox/wiki/Community-Contributions) for even more projects to get the most out of NetBox! -
-
- Looking for a managed solution? Check out NetBox Cloud or NetBox Enterprise!
-
10.1.1.0/24,192.168.10.16/32,2001:"
"db8:1::/64
"
msgstr ""
-#: netbox/users/forms/model_forms.py:176
+#: netbox/users/forms/model_forms.py:175
msgid "Confirm password"
msgstr ""
-#: netbox/users/forms/model_forms.py:179
+#: netbox/users/forms/model_forms.py:178
msgid "Enter the same password as before, for verification."
msgstr ""
-#: netbox/users/forms/model_forms.py:228
+#: netbox/users/forms/model_forms.py:227
msgid "Passwords do not match! Please check your input and try again."
msgstr ""
-#: netbox/users/forms/model_forms.py:295
+#: netbox/users/forms/model_forms.py:294
msgid "Additional actions"
msgstr ""
-#: netbox/users/forms/model_forms.py:298
+#: netbox/users/forms/model_forms.py:297
msgid "Actions granted in addition to those listed above"
msgstr ""
-#: netbox/users/forms/model_forms.py:314
+#: netbox/users/forms/model_forms.py:313
msgid "Objects"
msgstr ""
-#: netbox/users/forms/model_forms.py:326
+#: netbox/users/forms/model_forms.py:325
msgid ""
"JSON expression of a queryset filter that will return only permitted "
"objects. Leave null to match all objects of this type. A list of multiple "
"objects will result in a logical OR operation."
msgstr ""
-#: netbox/users/forms/model_forms.py:365
+#: netbox/users/forms/model_forms.py:364
msgid "At least one action must be selected."
msgstr ""
-#: netbox/users/forms/model_forms.py:383
+#: netbox/users/forms/model_forms.py:382
#, python-brace-format
msgid "Invalid filter for {model}: {error}"
msgstr ""
@@ -14478,7 +14518,7 @@ msgid "Invalid value for a multiple choice field: {value}"
msgstr ""
#: netbox/utilities/forms/fields/csv.py:57
-#: netbox/utilities/forms/fields/csv.py:74
+#: netbox/utilities/forms/fields/csv.py:78
#, python-format
msgid "Object not found: %(value)s"
msgstr ""
@@ -14489,11 +14529,16 @@ msgid ""
"\"{value}\" is not a unique value for this field; multiple objects were found"
msgstr ""
-#: netbox/utilities/forms/fields/csv.py:97
-msgid "Object type must be specified as \"192.0.2.[1,5,100-254]/24
"
msgstr ""
-"Określ zakres numeryczny, aby utworzyć wiele adresów IP.192.0.2. [1,5,100-254] /24
"
+"Określ zakres numeryczny, aby utworzyć wiele adresów IP.192.0.2.[1,5,100-254]/24
"
#: netbox/utilities/forms/fields/fields.py:31
#, python-brace-format
@@ -15201,15 +15215,15 @@ msgstr "Anuluj subskrypcję"
msgid "Subscribe"
msgstr "Subskrybuj"
-#: netbox/utilities/templates/form_helpers/render_field.html:39
+#: netbox/utilities/templates/form_helpers/render_field.html:41
msgid "Copy to clipboard"
msgstr "Kopiuj do schowka"
-#: netbox/utilities/templates/form_helpers/render_field.html:55
+#: netbox/utilities/templates/form_helpers/render_field.html:57
msgid "This field is required"
msgstr "To pole jest wymagane"
-#: netbox/utilities/templates/form_helpers/render_field.html:68
+#: netbox/utilities/templates/form_helpers/render_field.html:70
msgid "Set Null"
msgstr "Ustaw Null"
@@ -15280,7 +15294,7 @@ msgstr "Grupa nadrzędna (ID)"
#: netbox/virtualization/filtersets.py:85
msgid "Parent group (slug)"
-msgstr "Grupa nadrzędna (ślimak)"
+msgstr "Grupa nadrzędna (identyfikator)"
#: netbox/virtualization/filtersets.py:89
#: netbox/virtualization/filtersets.py:141
@@ -15629,7 +15643,7 @@ msgstr "Polityka IPsec (nazwa)"
#: netbox/vpn/filtersets.py:359
msgid "L2VPN (slug)"
-msgstr "L2VPN (ślimak)"
+msgstr "L2VPN (identyfikator)"
#: netbox/vpn/filtersets.py:423
msgid "VM Interface (ID)"
diff --git a/netbox/translations/pt/LC_MESSAGES/django.mo b/netbox/translations/pt/LC_MESSAGES/django.mo
index b961d51f0..a7bb4e1d9 100644
Binary files a/netbox/translations/pt/LC_MESSAGES/django.mo and b/netbox/translations/pt/LC_MESSAGES/django.mo differ
diff --git a/netbox/translations/pt/LC_MESSAGES/django.po b/netbox/translations/pt/LC_MESSAGES/django.po
index 62f9cb04e..4b62823c1 100644
--- a/netbox/translations/pt/LC_MESSAGES/django.po
+++ b/netbox/translations/pt/LC_MESSAGES/django.po
@@ -6,17 +6,17 @@
# Translators:
# Renato Almeida de Oliveira, 2023
# Fer22f event
, model
, timestamp
, "
"username
, request_id
, and data
."
msgstr ""
-"Шаблон Jinja2 для власного тіла запиту. Якщо він порожній, буде включено "
-"об'єкт JSON, що представляє зміну. Доступні контекстні дані включають: "
-"подія
, модель
, мітка часу
, ім'я"
-" користувача
, ідентифікатор запиту
, і дані
."
+"Шаблон Jinja2 для користувацького тіла запиту. Якщо він порожній, буде "
+"включено об'єкт JSON, що представляє зміну. Доступні контекстні дані "
+"включають: подія
, модель
, мітка часу
,"
+" ім'я користувача
, ідентифікатор запиту
, і "
+"дані
."
#: netbox/extras/models/models.py:204
msgid "secret"
@@ -8678,11 +8692,11 @@ msgstr "Примусове відкриття посилання в новому
#: netbox/extras/models/models.py:341
msgid "custom link"
-msgstr "користувальницьке посилання"
+msgstr "користувацьке посилання"
#: netbox/extras/models/models.py:342
msgid "custom links"
-msgstr "користувальницькі посилання"
+msgstr "користувацькі посилання"
#: netbox/extras/models/models.py:389
msgid "The object type(s) to which this template applies."
@@ -9093,8 +9107,7 @@ msgstr "Правила перевірки повинні бути передан
#, python-brace-format
msgid "Custom validation failed for {attribute}: {exception}"
msgstr ""
-"Користувальницька перевірка зіткнулася з невдачею через{attribute}: "
-"{exception}"
+"Користувацька перевірка зіткнулася з невдачею через{attribute}: {exception}"
#: netbox/extras/validators.py:134
#, python-brace-format
@@ -9837,7 +9850,7 @@ msgstr "З шаблону"
#: netbox/ipam/forms/model_forms.py:743
msgid "Custom"
-msgstr "Користувальницький"
+msgstr "Користувацький"
#: netbox/ipam/forms/model_forms.py:773
msgid ""
@@ -10436,7 +10449,7 @@ msgstr "Діапазони повинні бути вказані в формі
msgid "Range boundaries must be defined as integers."
msgstr "Межі діапазону повинні бути визначені як цілі числа."
-#: netbox/netbox/api/serializers/fields.py:39
+#: netbox/netbox/api/serializers/fields.py:40
#, python-brace-format
msgid "{class_name} must implement get_view_name()"
msgstr "{class_name} повинен реалізувати get_view_name()"
@@ -10648,11 +10661,11 @@ msgstr "Максимальний розмір сторінки"
#: netbox/netbox/config/parameters.py:150
#: netbox/templates/core/inc/config_data.html:96
msgid "Custom validators"
-msgstr "Користувальницькі перевіряючі"
+msgstr "Користувацькі перевіряючі"
#: netbox/netbox/config/parameters.py:152
msgid "Custom validation rules (JSON)"
-msgstr "Користувальницькі правила перевірки (у форматі JSON)"
+msgstr "Користувацькі правила перевірки (у форматі JSON)"
#: netbox/netbox/config/parameters.py:160
#: netbox/templates/core/inc/config_data.html:104
@@ -10777,43 +10790,43 @@ msgstr "Невідоме ім'я поля '{name}' у призначених д
#: netbox/netbox/models/features.py:286
#, python-brace-format
msgid "Invalid value for custom field '{name}': {error}"
-msgstr "Невірне значення для користувальницького поля '{name}': {error}"
+msgstr "Невірне значення для користувацького поля '{name}': {error}"
#: netbox/netbox/models/features.py:295
#, python-brace-format
msgid "Custom field '{name}' must have a unique value."
-msgstr "Користувальницьке поле '{name}' має мати унікальне значення."
+msgstr "Користувацьке поле '{name}' має мати унікальне значення."
#: netbox/netbox/models/features.py:302
#, python-brace-format
msgid "Missing required custom field '{name}'."
-msgstr "Відсутнє обов'язкове користувальницьке поле '{name}'."
+msgstr "Відсутнє обов'язкове користувацьке поле '{name}'."
-#: netbox/netbox/models/features.py:467
+#: netbox/netbox/models/features.py:462
msgid "Remote data source"
msgstr "Віддалене джерело даних"
-#: netbox/netbox/models/features.py:477
+#: netbox/netbox/models/features.py:472
msgid "data path"
msgstr "шлях даних"
-#: netbox/netbox/models/features.py:481
+#: netbox/netbox/models/features.py:476
msgid "Path to remote file (relative to data source root)"
msgstr "Шляху до віддаленого файлу (відносно кореня джерела даних)"
-#: netbox/netbox/models/features.py:484
+#: netbox/netbox/models/features.py:479
msgid "auto sync enabled"
msgstr "увімкнено автоматичну синхронізацію"
-#: netbox/netbox/models/features.py:486
+#: netbox/netbox/models/features.py:481
msgid "Enable automatic synchronization of data when the data file is updated"
msgstr "Увімкнути автоматичну синхронізацію даних при оновленні файлу даних"
-#: netbox/netbox/models/features.py:489
+#: netbox/netbox/models/features.py:484
msgid "date synced"
msgstr "дата синхронізована"
-#: netbox/netbox/models/features.py:583
+#: netbox/netbox/models/features.py:578
#, python-brace-format
msgid "{class_name} must implement a sync_data() method."
msgstr "{class_name} повинен реалізувати метод sync_data ()."
@@ -11061,15 +11074,15 @@ msgstr "Налаштування"
#: netbox/templates/ipam/ipaddress_bulk_add.html:35
#: netbox/templates/ipam/vlan_edit.html:59
msgid "Custom Fields"
-msgstr "Користувальницькі поля"
+msgstr "Користувацькі поля"
#: netbox/netbox/navigation/menu.py:326
msgid "Custom Field Choices"
-msgstr "Вибір користувальницьких полів"
+msgstr "Вибір користувацьких полів"
#: netbox/netbox/navigation/menu.py:327
msgid "Custom Links"
-msgstr "Користувальницькі посилання"
+msgstr "Користувацькі посилання"
#: netbox/netbox/navigation/menu.py:328
msgid "Export Templates"
@@ -12553,7 +12566,7 @@ msgid "Parent Bay"
msgstr "Батьківська бухта"
#: netbox/templates/dcim/device_edit.html:48
-#: netbox/utilities/templates/form_helpers/render_field.html:20
+#: netbox/utilities/templates/form_helpers/render_field.html:22
msgid "Regenerate Slug"
msgstr "Відновити слимака"
@@ -12898,17 +12911,17 @@ msgstr "Максимальна вага"
msgid "Total Weight"
msgstr "Загальна вага"
-#: netbox/templates/dcim/rack.html:121
+#: netbox/templates/dcim/rack.html:125
#: netbox/templates/dcim/rack_elevation_list.html:15
msgid "Images and Labels"
msgstr "Зображення та етикетки"
-#: netbox/templates/dcim/rack.html:122
+#: netbox/templates/dcim/rack.html:126
#: netbox/templates/dcim/rack_elevation_list.html:16
msgid "Images only"
msgstr "Лише зображення"
-#: netbox/templates/dcim/rack.html:123
+#: netbox/templates/dcim/rack.html:127
#: netbox/templates/dcim/rack_elevation_list.html:17
msgid "Labels only"
msgstr "Тільки етикетки"
@@ -14784,7 +14797,7 @@ msgstr "Користувач з цим ім'ям користувача вже
#: netbox/users/tables.py:98
msgid "Custom Actions"
-msgstr "Користувальницькі дії"
+msgstr "Користувацькі дії"
#: netbox/utilities/api.py:153
#, python-brace-format
@@ -15187,15 +15200,15 @@ msgstr "Відписатися"
msgid "Subscribe"
msgstr "Підписатися"
-#: netbox/utilities/templates/form_helpers/render_field.html:39
+#: netbox/utilities/templates/form_helpers/render_field.html:41
msgid "Copy to clipboard"
msgstr "Копіювати в буфер обміну"
-#: netbox/utilities/templates/form_helpers/render_field.html:55
+#: netbox/utilities/templates/form_helpers/render_field.html:57
msgid "This field is required"
msgstr "Це поле обов'язкове для заповнення"
-#: netbox/utilities/templates/form_helpers/render_field.html:68
+#: netbox/utilities/templates/form_helpers/render_field.html:70
msgid "Set Null"
msgstr "Встановити нуль"
diff --git a/netbox/translations/zh/LC_MESSAGES/django.mo b/netbox/translations/zh/LC_MESSAGES/django.mo
index 74fec4f74..614b4d487 100644
Binary files a/netbox/translations/zh/LC_MESSAGES/django.mo and b/netbox/translations/zh/LC_MESSAGES/django.mo differ
diff --git a/netbox/translations/zh/LC_MESSAGES/django.po b/netbox/translations/zh/LC_MESSAGES/django.po
index ad19ef97c..784313a74 100644
--- a/netbox/translations/zh/LC_MESSAGES/django.po
+++ b/netbox/translations/zh/LC_MESSAGES/django.po
@@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-09-12 05:02+0000\n"
+"POT-Creation-Date: 2024-09-25 05:02+0000\n"
"PO-Revision-Date: 2023-10-30 17:48+0000\n"
"Last-Translator: Jeremy Stretch, 2024\n"
"Language-Team: Chinese (https://app.transifex.com/netbox-community/teams/178115/zh/)\n"
@@ -96,8 +96,8 @@ msgstr "您的密码已成功更改。"
#: netbox/circuits/choices.py:21 netbox/dcim/choices.py:20
#: netbox/dcim/choices.py:102 netbox/dcim/choices.py:185
-#: netbox/dcim/choices.py:231 netbox/dcim/choices.py:1518
-#: netbox/dcim/choices.py:1594 netbox/dcim/choices.py:1644
+#: netbox/dcim/choices.py:231 netbox/dcim/choices.py:1522
+#: netbox/dcim/choices.py:1598 netbox/dcim/choices.py:1648
#: netbox/virtualization/choices.py:20 netbox/virtualization/choices.py:45
#: netbox/vpn/choices.py:18
msgid "Planned"
@@ -110,7 +110,7 @@ msgstr "置备"
#: netbox/circuits/choices.py:23 netbox/core/tables/tasks.py:22
#: netbox/dcim/choices.py:22 netbox/dcim/choices.py:103
#: netbox/dcim/choices.py:184 netbox/dcim/choices.py:230
-#: netbox/dcim/choices.py:1593 netbox/dcim/choices.py:1643
+#: netbox/dcim/choices.py:1597 netbox/dcim/choices.py:1647
#: netbox/extras/tables/tables.py:495 netbox/ipam/choices.py:31
#: netbox/ipam/choices.py:49 netbox/ipam/choices.py:69
#: netbox/ipam/choices.py:154 netbox/templates/extras/configcontext.html:25
@@ -121,8 +121,8 @@ msgid "Active"
msgstr "在线"
#: netbox/circuits/choices.py:24 netbox/dcim/choices.py:183
-#: netbox/dcim/choices.py:229 netbox/dcim/choices.py:1592
-#: netbox/dcim/choices.py:1645 netbox/virtualization/choices.py:24
+#: netbox/dcim/choices.py:229 netbox/dcim/choices.py:1596
+#: netbox/dcim/choices.py:1649 netbox/virtualization/choices.py:24
#: netbox/virtualization/choices.py:43
msgid "Offline"
msgstr "离线"
@@ -135,7 +135,7 @@ msgstr "预留"
msgid "Decommissioned"
msgstr "退役"
-#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1605
+#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1609
#: netbox/tenancy/choices.py:17
msgid "Primary"
msgstr "主要联系人"
@@ -341,7 +341,7 @@ msgstr "接入点A (ID)"
#: netbox/extras/filtersets.py:348 netbox/extras/filtersets.py:391
#: netbox/extras/filtersets.py:438 netbox/extras/filtersets.py:498
#: netbox/extras/filtersets.py:657 netbox/extras/filtersets.py:703
-#: netbox/ipam/forms/model_forms.py:449 netbox/netbox/filtersets.py:277
+#: netbox/ipam/forms/model_forms.py:449 netbox/netbox/filtersets.py:280
#: netbox/netbox/forms/__init__.py:22 netbox/netbox/forms/base.py:167
#: netbox/templates/htmx/object_selector.html:28
#: netbox/templates/inc/filter_list.html:45
@@ -579,8 +579,8 @@ msgstr "服务ID"
#: netbox/dcim/forms/bulk_edit.py:1173 netbox/dcim/forms/bulk_edit.py:1200
#: netbox/dcim/forms/bulk_edit.py:1678 netbox/dcim/forms/filtersets.py:1064
#: netbox/dcim/forms/filtersets.py:1455 netbox/dcim/forms/filtersets.py:1479
-#: netbox/dcim/tables/devices.py:700 netbox/dcim/tables/devices.py:757
-#: netbox/dcim/tables/devices.py:999 netbox/dcim/tables/devicetypes.py:250
+#: netbox/dcim/tables/devices.py:701 netbox/dcim/tables/devices.py:758
+#: netbox/dcim/tables/devices.py:1000 netbox/dcim/tables/devicetypes.py:250
#: netbox/dcim/tables/devicetypes.py:265 netbox/dcim/tables/racks.py:33
#: netbox/extras/forms/bulk_edit.py:270 netbox/extras/tables/tables.py:443
#: netbox/templates/circuits/circuittype.html:30
@@ -617,7 +617,7 @@ msgstr "颜色"
#: netbox/dcim/forms/object_import.py:84
#: netbox/dcim/forms/object_import.py:113
#: netbox/dcim/forms/object_import.py:145 netbox/dcim/tables/devices.py:178
-#: netbox/dcim/tables/devices.py:810 netbox/dcim/tables/power.py:77
+#: netbox/dcim/tables/devices.py:811 netbox/dcim/tables/power.py:77
#: netbox/dcim/tables/racks.py:138 netbox/extras/forms/bulk_import.py:42
#: netbox/extras/tables/tables.py:405 netbox/extras/tables/tables.py:465
#: netbox/netbox/tables/tables.py:240
@@ -674,8 +674,8 @@ msgstr "运营商账户"
#: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:799
#: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958
#: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170
-#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:813
-#: netbox/dcim/tables/devices.py:1059 netbox/dcim/tables/modules.py:69
+#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:814
+#: netbox/dcim/tables/devices.py:1060 netbox/dcim/tables/modules.py:69
#: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126
#: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138
#: netbox/ipam/forms/bulk_edit.py:255 netbox/ipam/forms/bulk_edit.py:305
@@ -824,7 +824,7 @@ msgstr "服务参数"
#: netbox/circuits/forms/model_forms.py:183
#: netbox/dcim/forms/model_forms.py:139 netbox/dcim/forms/model_forms.py:181
#: netbox/dcim/forms/model_forms.py:266 netbox/dcim/forms/model_forms.py:323
-#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1691
+#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1692
#: netbox/ipam/forms/model_forms.py:64 netbox/ipam/forms/model_forms.py:81
#: netbox/ipam/forms/model_forms.py:115 netbox/ipam/forms/model_forms.py:136
#: netbox/ipam/forms/model_forms.py:160 netbox/ipam/forms/model_forms.py:232
@@ -1403,11 +1403,11 @@ msgstr "运营商网络"
#: netbox/dcim/tables/devices.py:134 netbox/dcim/tables/devices.py:289
#: netbox/dcim/tables/devices.py:392 netbox/dcim/tables/devices.py:433
#: netbox/dcim/tables/devices.py:482 netbox/dcim/tables/devices.py:531
-#: netbox/dcim/tables/devices.py:645 netbox/dcim/tables/devices.py:727
-#: netbox/dcim/tables/devices.py:774 netbox/dcim/tables/devices.py:837
-#: netbox/dcim/tables/devices.py:907 netbox/dcim/tables/devices.py:970
-#: netbox/dcim/tables/devices.py:990 netbox/dcim/tables/devices.py:1019
-#: netbox/dcim/tables/devices.py:1049 netbox/dcim/tables/devicetypes.py:32
+#: netbox/dcim/tables/devices.py:645 netbox/dcim/tables/devices.py:728
+#: netbox/dcim/tables/devices.py:775 netbox/dcim/tables/devices.py:838
+#: netbox/dcim/tables/devices.py:908 netbox/dcim/tables/devices.py:971
+#: netbox/dcim/tables/devices.py:991 netbox/dcim/tables/devices.py:1020
+#: netbox/dcim/tables/devices.py:1050 netbox/dcim/tables/devicetypes.py:32
#: netbox/dcim/tables/power.py:22 netbox/dcim/tables/power.py:62
#: netbox/dcim/tables/racks.py:24 netbox/dcim/tables/racks.py:113
#: netbox/dcim/tables/sites.py:24 netbox/dcim/tables/sites.py:51
@@ -1545,7 +1545,7 @@ msgstr "承诺速率"
#: netbox/circuits/tables/circuits.py:80
#: netbox/circuits/tables/providers.py:48
#: netbox/circuits/tables/providers.py:82
-#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1032
+#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1033
#: netbox/dcim/tables/devicetypes.py:93 netbox/dcim/tables/modules.py:29
#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39
#: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84
@@ -1624,7 +1624,7 @@ msgstr "完成"
#: netbox/core/choices.py:22 netbox/core/choices.py:59
#: netbox/core/constants.py:20 netbox/core/tables/tasks.py:34
#: netbox/dcim/choices.py:187 netbox/dcim/choices.py:233
-#: netbox/dcim/choices.py:1595 netbox/virtualization/choices.py:47
+#: netbox/dcim/choices.py:1599 netbox/virtualization/choices.py:47
msgid "Failed"
msgstr "故障"
@@ -1948,7 +1948,7 @@ msgstr "必须上传文件或选择数据文件进行同步"
msgid "Rack Elevations"
msgstr "机柜立面图"
-#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1506
+#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1510
#: netbox/dcim/forms/bulk_edit.py:969 netbox/dcim/forms/bulk_edit.py:1357
#: netbox/dcim/forms/bulk_edit.py:1375 netbox/dcim/tables/racks.py:158
#: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295
@@ -2518,7 +2518,7 @@ msgid "Staging"
msgstr "暂存"
#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189
-#: netbox/dcim/choices.py:234 netbox/dcim/choices.py:1519
+#: netbox/dcim/choices.py:234 netbox/dcim/choices.py:1523
#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48
msgid "Decommissioning"
msgstr "报废"
@@ -2582,7 +2582,7 @@ msgstr "已弃用"
msgid "Millimeters"
msgstr "毫米"
-#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1541
+#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1545
msgid "Inches"
msgstr "英寸"
@@ -2604,9 +2604,9 @@ msgstr "从后向前"
#: netbox/dcim/forms/bulk_import.py:1088 netbox/dcim/forms/filtersets.py:234
#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93
#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1062
-#: netbox/dcim/forms/model_forms.py:1501
+#: netbox/dcim/forms/model_forms.py:1502
#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:653
-#: netbox/dcim/tables/devices.py:865 netbox/dcim/tables/devices.py:950
+#: netbox/dcim/tables/devices.py:866 netbox/dcim/tables/devices.py:951
#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59
#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44
#: netbox/templates/dcim/interface.html:102
@@ -2636,15 +2636,15 @@ msgstr "上级"
msgid "Child"
msgstr "子类"
-#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:339
-#: netbox/templates/dcim/rack.html:129
+#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340
+#: netbox/templates/dcim/rack.html:133
#: netbox/templates/dcim/rack_elevation_list.html:20
#: netbox/templates/dcim/rackreservation.html:76
msgid "Front"
msgstr "前"
-#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:345
-#: netbox/templates/dcim/rack.html:135
+#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346
+#: netbox/templates/dcim/rack.html:139
#: netbox/templates/dcim/rack_elevation_list.html:21
#: netbox/templates/dcim/rackreservation.html:82
msgid "Rear"
@@ -2672,7 +2672,7 @@ msgid "Side to rear"
msgstr "侧进风后出风"
#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:253
-#: netbox/dcim/choices.py:1291
+#: netbox/dcim/choices.py:1295
msgid "Passive"
msgstr "被动"
@@ -2680,15 +2680,15 @@ msgstr "被动"
msgid "Mixed"
msgstr "混合风道"
-#: netbox/dcim/choices.py:478 netbox/dcim/choices.py:726
+#: netbox/dcim/choices.py:478 netbox/dcim/choices.py:727
msgid "NEMA (Non-locking)"
msgstr "NEMA(非锁定)"
-#: netbox/dcim/choices.py:500 netbox/dcim/choices.py:748
+#: netbox/dcim/choices.py:500 netbox/dcim/choices.py:749
msgid "NEMA (Locking)"
msgstr "NEMA(锁定)"
-#: netbox/dcim/choices.py:524 netbox/dcim/choices.py:772
+#: netbox/dcim/choices.py:524 netbox/dcim/choices.py:773
msgid "California Style"
msgstr "美标"
@@ -2696,42 +2696,42 @@ msgstr "美标"
msgid "International/ITA"
msgstr "国际通用标准/ITA"
-#: netbox/dcim/choices.py:567 netbox/dcim/choices.py:807
+#: netbox/dcim/choices.py:567 netbox/dcim/choices.py:808
msgid "Proprietary"
msgstr "专用规格"
-#: netbox/dcim/choices.py:575 netbox/dcim/choices.py:816
-#: netbox/dcim/choices.py:1207 netbox/dcim/choices.py:1209
-#: netbox/dcim/choices.py:1435 netbox/dcim/choices.py:1437
+#: netbox/dcim/choices.py:575 netbox/dcim/choices.py:818
+#: netbox/dcim/choices.py:1211 netbox/dcim/choices.py:1213
+#: netbox/dcim/choices.py:1439 netbox/dcim/choices.py:1441
#: netbox/netbox/navigation/menu.py:200
msgid "Other"
msgstr "其他"
-#: netbox/dcim/choices.py:780
+#: netbox/dcim/choices.py:781
msgid "ITA/International"
msgstr "ITA/国际通用标准"
-#: netbox/dcim/choices.py:846
+#: netbox/dcim/choices.py:848
msgid "Physical"
msgstr "物理"
-#: netbox/dcim/choices.py:847 netbox/dcim/choices.py:1013
+#: netbox/dcim/choices.py:849 netbox/dcim/choices.py:1016
msgid "Virtual"
msgstr "虚拟"
-#: netbox/dcim/choices.py:848 netbox/dcim/choices.py:1086
+#: netbox/dcim/choices.py:850 netbox/dcim/choices.py:1089
#: netbox/dcim/forms/bulk_edit.py:1515 netbox/dcim/forms/filtersets.py:1330
-#: netbox/dcim/forms/model_forms.py:988 netbox/dcim/forms/model_forms.py:1396
+#: netbox/dcim/forms/model_forms.py:988 netbox/dcim/forms/model_forms.py:1397
#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144
#: netbox/templates/dcim/interface.html:210
msgid "Wireless"
msgstr "无线"
-#: netbox/dcim/choices.py:1011
+#: netbox/dcim/choices.py:1014
msgid "Virtual interfaces"
msgstr "虚拟接口"
-#: netbox/dcim/choices.py:1014 netbox/dcim/forms/bulk_edit.py:1410
+#: netbox/dcim/choices.py:1017 netbox/dcim/forms/bulk_edit.py:1410
#: netbox/dcim/forms/bulk_import.py:840 netbox/dcim/forms/model_forms.py:974
#: netbox/dcim/tables/devices.py:657 netbox/templates/dcim/interface.html:106
#: netbox/templates/virtualization/vminterface.html:43
@@ -2741,27 +2741,27 @@ msgstr "虚拟接口"
msgid "Bridge"
msgstr "桥接"
-#: netbox/dcim/choices.py:1015
+#: netbox/dcim/choices.py:1018
msgid "Link Aggregation Group (LAG)"
msgstr "链路聚合组(LAG)"
-#: netbox/dcim/choices.py:1019
+#: netbox/dcim/choices.py:1022
msgid "Ethernet (fixed)"
msgstr "以太网(固定类型)"
-#: netbox/dcim/choices.py:1034
+#: netbox/dcim/choices.py:1037
msgid "Ethernet (modular)"
msgstr "以太网(模块)"
-#: netbox/dcim/choices.py:1070
+#: netbox/dcim/choices.py:1073
msgid "Ethernet (backplane)"
msgstr "以太网(背板)"
-#: netbox/dcim/choices.py:1101
+#: netbox/dcim/choices.py:1105
msgid "Cellular"
msgstr "蜂窝网络"
-#: netbox/dcim/choices.py:1153 netbox/dcim/forms/filtersets.py:383
+#: netbox/dcim/choices.py:1157 netbox/dcim/forms/filtersets.py:383
#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963
#: netbox/dcim/forms/filtersets.py:1542
#: netbox/templates/dcim/inventoryitem.html:52
@@ -2769,129 +2769,130 @@ msgstr "蜂窝网络"
msgid "Serial"
msgstr "串口"
-#: netbox/dcim/choices.py:1168
+#: netbox/dcim/choices.py:1172
msgid "Coaxial"
msgstr "同轴电缆接口"
-#: netbox/dcim/choices.py:1188
+#: netbox/dcim/choices.py:1192
msgid "Stacking"
msgstr "堆叠"
-#: netbox/dcim/choices.py:1238
+#: netbox/dcim/choices.py:1242
msgid "Half"
msgstr "半双工"
-#: netbox/dcim/choices.py:1239
+#: netbox/dcim/choices.py:1243
msgid "Full"
msgstr "全双工"
-#: netbox/dcim/choices.py:1240 netbox/netbox/preferences.py:31
+#: netbox/dcim/choices.py:1244 netbox/netbox/preferences.py:31
#: netbox/wireless/choices.py:480
msgid "Auto"
msgstr "自动"
-#: netbox/dcim/choices.py:1251
+#: netbox/dcim/choices.py:1255
msgid "Access"
msgstr "接入"
-#: netbox/dcim/choices.py:1252 netbox/ipam/tables/vlans.py:172
+#: netbox/dcim/choices.py:1256 netbox/ipam/tables/vlans.py:172
#: netbox/ipam/tables/vlans.py:217
#: netbox/templates/dcim/inc/interface_vlans_table.html:7
msgid "Tagged"
msgstr "Trunk口"
-#: netbox/dcim/choices.py:1253
+#: netbox/dcim/choices.py:1257
msgid "Tagged (All)"
msgstr "Trunk口(允许所有VLAN)"
-#: netbox/dcim/choices.py:1282
+#: netbox/dcim/choices.py:1286
msgid "IEEE Standard"
msgstr "IEEE标准"
-#: netbox/dcim/choices.py:1293
+#: netbox/dcim/choices.py:1297
msgid "Passive 24V (2-pair)"
msgstr "24V(2对供电)"
-#: netbox/dcim/choices.py:1294
+#: netbox/dcim/choices.py:1298
msgid "Passive 24V (4-pair)"
msgstr "24V(4对供电)"
-#: netbox/dcim/choices.py:1295
+#: netbox/dcim/choices.py:1299
msgid "Passive 48V (2-pair)"
msgstr "48V(2对供电)"
-#: netbox/dcim/choices.py:1296
+#: netbox/dcim/choices.py:1300
msgid "Passive 48V (4-pair)"
msgstr "48V(4对供电)"
-#: netbox/dcim/choices.py:1366 netbox/dcim/choices.py:1476
+#: netbox/dcim/choices.py:1370 netbox/dcim/choices.py:1480
msgid "Copper"
msgstr "铜缆"
-#: netbox/dcim/choices.py:1389
+#: netbox/dcim/choices.py:1393
msgid "Fiber Optic"
msgstr "光纤"
-#: netbox/dcim/choices.py:1422 netbox/dcim/choices.py:1505
+#: netbox/dcim/choices.py:1426 netbox/dcim/choices.py:1509
msgid "USB"
msgstr "USB"
-#: netbox/dcim/choices.py:1492
+#: netbox/dcim/choices.py:1496
msgid "Fiber"
msgstr "光纤"
-#: netbox/dcim/choices.py:1517 netbox/dcim/forms/filtersets.py:1227
+#: netbox/dcim/choices.py:1521 netbox/dcim/forms/filtersets.py:1227
msgid "Connected"
msgstr "已连接"
-#: netbox/dcim/choices.py:1536 netbox/wireless/choices.py:497
+#: netbox/dcim/choices.py:1540 netbox/wireless/choices.py:497
msgid "Kilometers"
msgstr "公里"
-#: netbox/dcim/choices.py:1537 netbox/templates/dcim/cable_trace.html:65
+#: netbox/dcim/choices.py:1541 netbox/templates/dcim/cable_trace.html:65
#: netbox/wireless/choices.py:498
msgid "Meters"
msgstr "米"
-#: netbox/dcim/choices.py:1538
+#: netbox/dcim/choices.py:1542
msgid "Centimeters"
msgstr "厘米"
-#: netbox/dcim/choices.py:1539 netbox/wireless/choices.py:499
+#: netbox/dcim/choices.py:1543 netbox/wireless/choices.py:499
msgid "Miles"
msgstr "英里"
-#: netbox/dcim/choices.py:1540 netbox/templates/dcim/cable_trace.html:66
+#: netbox/dcim/choices.py:1544 netbox/templates/dcim/cable_trace.html:66
#: netbox/wireless/choices.py:500
msgid "Feet"
msgstr "英尺"
-#: netbox/dcim/choices.py:1556 netbox/templates/dcim/device.html:327
-#: netbox/templates/dcim/rack.html:106
+#: netbox/dcim/choices.py:1560 netbox/templates/dcim/device.html:327
+#: netbox/templates/dcim/rack.html:107
msgid "Kilograms"
msgstr "千克"
-#: netbox/dcim/choices.py:1557
+#: netbox/dcim/choices.py:1561
msgid "Grams"
msgstr "克"
-#: netbox/dcim/choices.py:1558 netbox/templates/dcim/rack.html:107
+#: netbox/dcim/choices.py:1562 netbox/templates/dcim/device.html:328
+#: netbox/templates/dcim/rack.html:108
msgid "Pounds"
msgstr "磅"
-#: netbox/dcim/choices.py:1559
+#: netbox/dcim/choices.py:1563
msgid "Ounces"
msgstr "盎司"
-#: netbox/dcim/choices.py:1606
+#: netbox/dcim/choices.py:1610
msgid "Redundant"
msgstr "冗余"
-#: netbox/dcim/choices.py:1627
+#: netbox/dcim/choices.py:1631
msgid "Single phase"
msgstr "单相电"
-#: netbox/dcim/choices.py:1628
+#: netbox/dcim/choices.py:1632
msgid "Three-phase"
msgstr "三相"
@@ -3261,7 +3262,7 @@ msgstr "指定VID"
#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1489
#: netbox/dcim/forms/bulk_import.py:891 netbox/dcim/forms/filtersets.py:1428
-#: netbox/dcim/forms/model_forms.py:1377
+#: netbox/dcim/forms/model_forms.py:1378
#: netbox/dcim/models/device_components.py:712
#: netbox/dcim/tables/devices.py:623 netbox/ipam/filtersets.py:316
#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483
@@ -3340,7 +3341,7 @@ msgid "LAG interface (ID)"
msgstr "链路聚合接口(ID)"
#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725
-#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1689
+#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1690
#: netbox/templates/dcim/virtualdevicecontext.html:15
msgid "Virtual Device Context"
msgstr "虚拟设备上下文"
@@ -3415,7 +3416,7 @@ msgstr "标签"
#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546
#: netbox/dcim/forms/object_create.py:197
#: netbox/dcim/forms/object_create.py:353 netbox/dcim/tables/devices.py:165
-#: netbox/dcim/tables/devices.py:703 netbox/dcim/tables/devicetypes.py:247
+#: netbox/dcim/tables/devices.py:704 netbox/dcim/tables/devicetypes.py:247
#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131
#: netbox/templates/dcim/modulebay.html:38
#: netbox/templates/dcim/virtualchassis.html:66
@@ -3460,9 +3461,9 @@ msgstr "时区"
#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337
#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395
#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1075
-#: netbox/dcim/forms/model_forms.py:1514
+#: netbox/dcim/forms/model_forms.py:1515
#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96
-#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:936
+#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:937
#: netbox/dcim/tables/devicetypes.py:81 netbox/dcim/tables/devicetypes.py:309
#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60
#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132
@@ -3586,9 +3587,9 @@ msgstr "编号"
#: netbox/dcim/forms/bulk_import.py:1076 netbox/dcim/forms/filtersets.py:367
#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534
#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1070
-#: netbox/dcim/forms/model_forms.py:1509
+#: netbox/dcim/forms/model_forms.py:1510
#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169
-#: netbox/dcim/tables/devices.py:805 netbox/dcim/tables/devices.py:933
+#: netbox/dcim/tables/devices.py:806 netbox/dcim/tables/devices.py:934
#: netbox/dcim/tables/devicetypes.py:305 netbox/dcim/tables/racks.py:129
#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:260
#: netbox/ipam/forms/bulk_edit.py:310 netbox/ipam/forms/bulk_edit.py:358
@@ -3678,7 +3679,7 @@ msgstr "机柜"
#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398
#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608
#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942
-#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1579
+#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1580
#: netbox/templates/dcim/device_edit.html:20
msgid "Hardware"
msgstr "硬件"
@@ -3786,15 +3787,15 @@ msgstr "平台"
#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616
#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633
#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1208
-#: netbox/dcim/forms/model_forms.py:1663
+#: netbox/dcim/forms/model_forms.py:1664
#: netbox/dcim/forms/object_create.py:257 netbox/dcim/tables/connections.py:22
#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60
#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371
#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454
#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:594
-#: netbox/dcim/tables/devices.py:693 netbox/dcim/tables/devices.py:750
-#: netbox/dcim/tables/devices.py:797 netbox/dcim/tables/devices.py:857
-#: netbox/dcim/tables/devices.py:926 netbox/dcim/tables/devices.py:1053
+#: netbox/dcim/tables/devices.py:694 netbox/dcim/tables/devices.py:751
+#: netbox/dcim/tables/devices.py:798 netbox/dcim/tables/devices.py:858
+#: netbox/dcim/tables/devices.py:927 netbox/dcim/tables/devices.py:1054
#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321
#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:481
#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:319
@@ -3938,7 +3939,7 @@ msgstr "分配功率(瓦)"
#: netbox/dcim/forms/bulk_edit.py:1078 netbox/dcim/forms/bulk_import.py:786
#: netbox/dcim/forms/model_forms.py:953 netbox/dcim/forms/model_forms.py:1278
-#: netbox/dcim/forms/model_forms.py:1566 netbox/dcim/forms/object_import.py:55
+#: netbox/dcim/forms/model_forms.py:1567 netbox/dcim/forms/object_import.py:55
msgid "Power port"
msgstr "电源接口"
@@ -4026,14 +4027,14 @@ msgstr "模式"
msgid "VLAN group"
msgstr "VLAN 组"
-#: netbox/dcim/forms/bulk_edit.py:1476 netbox/dcim/forms/model_forms.py:1359
+#: netbox/dcim/forms/bulk_edit.py:1476 netbox/dcim/forms/model_forms.py:1360
#: netbox/dcim/tables/devices.py:579
#: netbox/virtualization/forms/bulk_edit.py:248
#: netbox/virtualization/forms/model_forms.py:326
msgid "Untagged VLAN"
msgstr "未标记的VLAN"
-#: netbox/dcim/forms/bulk_edit.py:1484 netbox/dcim/forms/model_forms.py:1368
+#: netbox/dcim/forms/bulk_edit.py:1484 netbox/dcim/forms/model_forms.py:1369
#: netbox/dcim/tables/devices.py:585
#: netbox/virtualization/forms/bulk_edit.py:256
#: netbox/virtualization/forms/model_forms.py:335
@@ -4052,7 +4053,7 @@ msgid "Wireless LANs"
msgstr "无线局域网"
#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/filtersets.py:1328
-#: netbox/dcim/forms/model_forms.py:1389 netbox/ipam/forms/bulk_edit.py:285
+#: netbox/dcim/forms/model_forms.py:1390 netbox/ipam/forms/bulk_edit.py:285
#: netbox/ipam/forms/bulk_edit.py:377 netbox/ipam/forms/filtersets.py:169
#: netbox/templates/dcim/interface.html:122
#: netbox/templates/ipam/prefix.html:95
@@ -4061,24 +4062,24 @@ msgid "Addressing"
msgstr "寻址"
#: netbox/dcim/forms/bulk_edit.py:1509 netbox/dcim/forms/filtersets.py:720
-#: netbox/dcim/forms/model_forms.py:1390
+#: netbox/dcim/forms/model_forms.py:1391
#: netbox/virtualization/forms/model_forms.py:350
msgid "Operation"
msgstr "操作"
#: netbox/dcim/forms/bulk_edit.py:1510 netbox/dcim/forms/filtersets.py:1329
-#: netbox/dcim/forms/model_forms.py:987 netbox/dcim/forms/model_forms.py:1392
+#: netbox/dcim/forms/model_forms.py:987 netbox/dcim/forms/model_forms.py:1393
msgid "PoE"
msgstr "PoE"
-#: netbox/dcim/forms/bulk_edit.py:1511 netbox/dcim/forms/model_forms.py:1391
+#: netbox/dcim/forms/bulk_edit.py:1511 netbox/dcim/forms/model_forms.py:1392
#: netbox/templates/dcim/interface.html:99
#: netbox/virtualization/forms/bulk_edit.py:267
#: netbox/virtualization/forms/model_forms.py:351
msgid "Related Interfaces"
msgstr "相关接口"
-#: netbox/dcim/forms/bulk_edit.py:1512 netbox/dcim/forms/model_forms.py:1393
+#: netbox/dcim/forms/bulk_edit.py:1512 netbox/dcim/forms/model_forms.py:1394
#: netbox/virtualization/forms/bulk_edit.py:268
#: netbox/virtualization/forms/model_forms.py:352
msgid "802.1Q Switching"
@@ -4413,7 +4414,7 @@ msgid "VDC {vdc} is not assigned to device {device}"
msgstr "VDC {vdc} 没有指定给设备 {device}"
#: netbox/dcim/forms/bulk_import.py:951 netbox/dcim/forms/model_forms.py:1000
-#: netbox/dcim/forms/model_forms.py:1574
+#: netbox/dcim/forms/model_forms.py:1575
#: netbox/dcim/forms/object_import.py:117
msgid "Rear port"
msgstr "后置端口"
@@ -4427,7 +4428,7 @@ msgstr "对应后置端口"
msgid "Physical medium classification"
msgstr "物理端口类型"
-#: netbox/dcim/forms/bulk_import.py:1028 netbox/dcim/tables/devices.py:818
+#: netbox/dcim/forms/bulk_import.py:1028 netbox/dcim/tables/devices.py:819
msgid "Installed device"
msgstr "安装设备"
@@ -4516,7 +4517,7 @@ msgid "{side_upper} side termination not found: {device} {name}"
msgstr "{side_upper} 端接口类型未发现: {device} {name}"
#: netbox/dcim/forms/bulk_import.py:1293 netbox/dcim/forms/model_forms.py:785
-#: netbox/dcim/tables/devices.py:1023 netbox/templates/dcim/device.html:132
+#: netbox/dcim/tables/devices.py:1024 netbox/templates/dcim/device.html:132
#: netbox/templates/dcim/virtualchassis.html:27
#: netbox/templates/dcim/virtualchassis.html:67
msgid "Master"
@@ -4546,6 +4547,28 @@ msgstr "供应类型(AC/DC)"
msgid "Single or three-phase"
msgstr "单相或三相"
+#: netbox/dcim/forms/bulk_import.py:1439 netbox/dcim/forms/model_forms.py:1670
+#: netbox/templates/dcim/device.html:190
+#: netbox/templates/dcim/virtualdevicecontext.html:30
+#: netbox/templates/virtualization/virtualmachine.html:52
+msgid "Primary IPv4"
+msgstr "主 IPv4"
+
+#: netbox/dcim/forms/bulk_import.py:1443
+msgid "IPv4 address with mask, e.g. 1.2.3.4/24"
+msgstr "带掩码的 IPv4 地址,例如 1.2.3.4/24"
+
+#: netbox/dcim/forms/bulk_import.py:1446 netbox/dcim/forms/model_forms.py:1679
+#: netbox/templates/dcim/device.html:206
+#: netbox/templates/dcim/virtualdevicecontext.html:41
+#: netbox/templates/virtualization/virtualmachine.html:68
+msgid "Primary IPv6"
+msgstr "主 IPv6"
+
+#: netbox/dcim/forms/bulk_import.py:1450
+msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64"
+msgstr "带有前缀长度的 IPv6 地址,例如 2001:db8:: 1/64"
+
#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:528
#: netbox/templates/dcim/interface.html:57
#: netbox/templates/virtualization/vminterface.html:55
@@ -4702,7 +4725,7 @@ msgstr "类型"
msgid "Mgmt only"
msgstr "仅用于管理"
-#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1382
+#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1383
#: netbox/dcim/models/device_components.py:630
#: netbox/templates/dcim/interface.html:129
msgid "WWN"
@@ -4736,7 +4759,7 @@ msgstr "信道功率(dBm)"
msgid "Cable"
msgstr "电缆"
-#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:945
+#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:946
msgid "Discovered"
msgstr "已发现"
@@ -4830,8 +4853,8 @@ msgstr "电源接口模版"
msgid "Rear port template"
msgstr "后置接口模版"
-#: netbox/dcim/forms/model_forms.py:1144 netbox/dcim/forms/model_forms.py:1387
-#: netbox/dcim/forms/model_forms.py:1550 netbox/dcim/forms/model_forms.py:1582
+#: netbox/dcim/forms/model_forms.py:1144 netbox/dcim/forms/model_forms.py:1388
+#: netbox/dcim/forms/model_forms.py:1551 netbox/dcim/forms/model_forms.py:1583
#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318
#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289
#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372
@@ -4855,7 +4878,7 @@ msgstr "后置接口模版"
msgid "Interface"
msgstr "接口"
-#: netbox/dcim/forms/model_forms.py:1145 netbox/dcim/forms/model_forms.py:1583
+#: netbox/dcim/forms/model_forms.py:1145 netbox/dcim/forms/model_forms.py:1584
#: netbox/dcim/tables/connections.py:27
#: netbox/templates/dcim/consoleport.html:17
#: netbox/templates/dcim/consoleserverport.html:74
@@ -4863,14 +4886,14 @@ msgstr "接口"
msgid "Console Port"
msgstr "Console 端口"
-#: netbox/dcim/forms/model_forms.py:1146 netbox/dcim/forms/model_forms.py:1584
+#: netbox/dcim/forms/model_forms.py:1146 netbox/dcim/forms/model_forms.py:1585
#: netbox/templates/dcim/consoleport.html:73
#: netbox/templates/dcim/consoleserverport.html:17
#: netbox/templates/dcim/frontport.html:109
msgid "Console Server Port"
msgstr "Console 服务器端口"
-#: netbox/dcim/forms/model_forms.py:1147 netbox/dcim/forms/model_forms.py:1585
+#: netbox/dcim/forms/model_forms.py:1147 netbox/dcim/forms/model_forms.py:1586
#: netbox/templates/circuits/inc/circuit_termination_fields.html:52
#: netbox/templates/dcim/consoleport.html:76
#: netbox/templates/dcim/consoleserverport.html:77
@@ -4881,8 +4904,8 @@ msgstr "Console 服务器端口"
msgid "Front Port"
msgstr "前置接口"
-#: netbox/dcim/forms/model_forms.py:1148 netbox/dcim/forms/model_forms.py:1586
-#: netbox/dcim/tables/devices.py:706
+#: netbox/dcim/forms/model_forms.py:1148 netbox/dcim/forms/model_forms.py:1587
+#: netbox/dcim/tables/devices.py:707
#: netbox/templates/circuits/inc/circuit_termination_fields.html:53
#: netbox/templates/dcim/consoleport.html:79
#: netbox/templates/dcim/consoleserverport.html:80
@@ -4894,24 +4917,24 @@ msgstr "前置接口"
msgid "Rear Port"
msgstr "后置接口"
-#: netbox/dcim/forms/model_forms.py:1149 netbox/dcim/forms/model_forms.py:1587
+#: netbox/dcim/forms/model_forms.py:1149 netbox/dcim/forms/model_forms.py:1588
#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512
#: netbox/templates/dcim/poweroutlet.html:44
#: netbox/templates/dcim/powerport.html:17
msgid "Power Port"
msgstr "电源接口"
-#: netbox/dcim/forms/model_forms.py:1150 netbox/dcim/forms/model_forms.py:1588
+#: netbox/dcim/forms/model_forms.py:1150 netbox/dcim/forms/model_forms.py:1589
#: netbox/templates/dcim/poweroutlet.html:17
#: netbox/templates/dcim/powerport.html:77
msgid "Power Outlet"
msgstr "电源插座"
-#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1590
+#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591
msgid "Component Assignment"
msgstr "组件分配"
-#: netbox/dcim/forms/model_forms.py:1195 netbox/dcim/forms/model_forms.py:1637
+#: netbox/dcim/forms/model_forms.py:1195 netbox/dcim/forms/model_forms.py:1638
msgid "An InventoryItem can only be assigned to a single component."
msgstr "库存项只能分配给单个组件"
@@ -4919,54 +4942,46 @@ msgstr "库存项只能分配给单个组件"
msgid "LAG interface"
msgstr "链路聚合接口"
-#: netbox/dcim/forms/model_forms.py:1483
+#: netbox/dcim/forms/model_forms.py:1355
+msgid "Filter VLANs available for assignment by group."
+msgstr "按组筛选可供分配的 VLAN。"
+
+#: netbox/dcim/forms/model_forms.py:1484
msgid "Child Device"
msgstr "子设备"
-#: netbox/dcim/forms/model_forms.py:1484
+#: netbox/dcim/forms/model_forms.py:1485
msgid ""
"Child devices must first be created and assigned to the site and rack of the"
" parent device."
msgstr "必须首先创建子设备,并将其分配给父设备的站点和机柜。"
-#: netbox/dcim/forms/model_forms.py:1526
+#: netbox/dcim/forms/model_forms.py:1527
msgid "Console port"
msgstr "Console 接口"
-#: netbox/dcim/forms/model_forms.py:1534
+#: netbox/dcim/forms/model_forms.py:1535
msgid "Console server port"
msgstr "Console 服务器端口"
-#: netbox/dcim/forms/model_forms.py:1542
+#: netbox/dcim/forms/model_forms.py:1543
msgid "Front port"
msgstr "前置接口"
-#: netbox/dcim/forms/model_forms.py:1558
+#: netbox/dcim/forms/model_forms.py:1559
msgid "Power outlet"
msgstr "电源插座"
-#: netbox/dcim/forms/model_forms.py:1578
+#: netbox/dcim/forms/model_forms.py:1579
#: netbox/templates/dcim/inventoryitem.html:17
msgid "Inventory Item"
msgstr "库存项"
-#: netbox/dcim/forms/model_forms.py:1651
+#: netbox/dcim/forms/model_forms.py:1652
#: netbox/templates/dcim/inventoryitemrole.html:15
msgid "Inventory Item Role"
msgstr "库存物品分类"
-#: netbox/dcim/forms/model_forms.py:1669 netbox/templates/dcim/device.html:190
-#: netbox/templates/dcim/virtualdevicecontext.html:30
-#: netbox/templates/virtualization/virtualmachine.html:52
-msgid "Primary IPv4"
-msgstr "主 IPv4"
-
-#: netbox/dcim/forms/model_forms.py:1678 netbox/templates/dcim/device.html:206
-#: netbox/templates/dcim/virtualdevicecontext.html:41
-#: netbox/templates/virtualization/virtualmachine.html:68
-msgid "Primary IPv6"
-msgstr "主 IPv6"
-
#: netbox/dcim/forms/object_create.py:48
#: netbox/dcim/forms/object_create.py:199
#: netbox/dcim/forms/object_create.py:355
@@ -5013,7 +5028,7 @@ msgid ""
"selected number of rear port positions ({rearport_count})."
msgstr "要创建的前置端口数 ({frontport_count}) 必须与所选的后置端口数({rearport_count})匹配。"
-#: netbox/dcim/forms/object_create.py:409 netbox/dcim/tables/devices.py:1029
+#: netbox/dcim/forms/object_create.py:409 netbox/dcim/tables/devices.py:1030
#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53
#: netbox/templates/dcim/virtualchassis_edit.html:47
#: netbox/templates/ipam/fhrpgroup.html:38
@@ -6528,7 +6543,7 @@ msgstr "配置模版"
msgid "Site Group"
msgstr "站点组"
-#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1064
+#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1065
#: netbox/ipam/forms/bulk_import.py:503 netbox/ipam/forms/model_forms.py:306
#: netbox/ipam/forms/model_forms.py:315 netbox/ipam/tables/ip.py:356
#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446
@@ -6537,12 +6552,12 @@ msgstr "站点组"
msgid "IP Address"
msgstr "IP地址"
-#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1068
+#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1069
#: netbox/virtualization/tables/virtualmachines.py:86
msgid "IPv4 Address"
msgstr "IPv4 地址"
-#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1072
+#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1073
#: netbox/virtualization/tables/virtualmachines.py:90
msgid "IPv6 Address"
msgstr "IPv6 地址"
@@ -6580,7 +6595,7 @@ msgstr "电源接口"
msgid "Power outlets"
msgstr "电源插座"
-#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1077
+#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1078
#: netbox/dcim/tables/devicetypes.py:129 netbox/dcim/views.py:1042
#: netbox/dcim/views.py:1281 netbox/dcim/views.py:1977
#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250
@@ -6687,28 +6702,28 @@ msgstr "仅限管理"
msgid "VDCs"
msgstr "VDCs"
-#: netbox/dcim/tables/devices.py:869 netbox/templates/dcim/modulebay.html:53
+#: netbox/dcim/tables/devices.py:870 netbox/templates/dcim/modulebay.html:53
msgid "Installed Module"
msgstr "已安装的模块"
-#: netbox/dcim/tables/devices.py:872
+#: netbox/dcim/tables/devices.py:873
msgid "Module Serial"
msgstr "模块状态"
-#: netbox/dcim/tables/devices.py:876
+#: netbox/dcim/tables/devices.py:877
msgid "Module Asset Tag"
msgstr "模块资产标签"
-#: netbox/dcim/tables/devices.py:885
+#: netbox/dcim/tables/devices.py:886
msgid "Module Status"
msgstr "模块状态"
-#: netbox/dcim/tables/devices.py:940 netbox/dcim/tables/devicetypes.py:313
+#: netbox/dcim/tables/devices.py:941 netbox/dcim/tables/devicetypes.py:313
#: netbox/templates/dcim/inventoryitem.html:40
msgid "Component"
msgstr "组件"
-#: netbox/dcim/tables/devices.py:996
+#: netbox/dcim/tables/devices.py:997
msgid "Items"
msgstr "项目"
@@ -10201,7 +10216,7 @@ msgstr "必须以表单(下限、上限)指定范围。"
msgid "Range boundaries must be defined as integers."
msgstr "范围边界必须定义为整数。"
-#: netbox/netbox/api/serializers/fields.py:39
+#: netbox/netbox/api/serializers/fields.py:40
#, python-brace-format
msgid "{class_name} must implement get_view_name()"
msgstr "{class_name} 必须实现 get_view_name ()"
@@ -10548,31 +10563,31 @@ msgstr "自定义字段 '{name}'必须具有唯一值。"
msgid "Missing required custom field '{name}'."
msgstr "缺少必需的自定义字段'{name}'."
-#: netbox/netbox/models/features.py:467
+#: netbox/netbox/models/features.py:462
msgid "Remote data source"
msgstr "远程数据源"
-#: netbox/netbox/models/features.py:477
+#: netbox/netbox/models/features.py:472
msgid "data path"
msgstr "文件路径"
-#: netbox/netbox/models/features.py:481
+#: netbox/netbox/models/features.py:476
msgid "Path to remote file (relative to data source root)"
msgstr "数据源文件路径(相对路径)"
-#: netbox/netbox/models/features.py:484
+#: netbox/netbox/models/features.py:479
msgid "auto sync enabled"
msgstr "自动同步已启用"
-#: netbox/netbox/models/features.py:486
+#: netbox/netbox/models/features.py:481
msgid "Enable automatic synchronization of data when the data file is updated"
msgstr "数据文件更新时启用数据自动同步"
-#: netbox/netbox/models/features.py:489
+#: netbox/netbox/models/features.py:484
msgid "date synced"
msgstr "数据已同步"
-#: netbox/netbox/models/features.py:583
+#: netbox/netbox/models/features.py:578
#, python-brace-format
msgid "{class_name} must implement a sync_data() method."
msgstr "{class_name}必须包含sync_data()方法。"
@@ -12299,7 +12314,7 @@ msgid "Parent Bay"
msgstr "父托架"
#: netbox/templates/dcim/device_edit.html:48
-#: netbox/utilities/templates/form_helpers/render_field.html:20
+#: netbox/utilities/templates/form_helpers/render_field.html:22
msgid "Regenerate Slug"
msgstr "重新生成缩写"
@@ -12642,17 +12657,17 @@ msgstr "最大承重"
msgid "Total Weight"
msgstr "总重量"
-#: netbox/templates/dcim/rack.html:121
+#: netbox/templates/dcim/rack.html:125
#: netbox/templates/dcim/rack_elevation_list.html:15
msgid "Images and Labels"
msgstr "图片和标签"
-#: netbox/templates/dcim/rack.html:122
+#: netbox/templates/dcim/rack.html:126
#: netbox/templates/dcim/rack_elevation_list.html:16
msgid "Images only"
msgstr "仅图像"
-#: netbox/templates/dcim/rack.html:123
+#: netbox/templates/dcim/rack.html:127
#: netbox/templates/dcim/rack_elevation_list.html:17
msgid "Labels only"
msgstr "仅标签"
@@ -14839,15 +14854,15 @@ msgstr "取消订阅"
msgid "Subscribe"
msgstr "订阅"
-#: netbox/utilities/templates/form_helpers/render_field.html:39
+#: netbox/utilities/templates/form_helpers/render_field.html:41
msgid "Copy to clipboard"
msgstr "复制到剪贴板"
-#: netbox/utilities/templates/form_helpers/render_field.html:55
+#: netbox/utilities/templates/form_helpers/render_field.html:57
msgid "This field is required"
msgstr "此字段必填"
-#: netbox/utilities/templates/form_helpers/render_field.html:68
+#: netbox/utilities/templates/form_helpers/render_field.html:70
msgid "Set Null"
msgstr "设置为空"
diff --git a/netbox/users/api/nested_serializers.py b/netbox/users/api/nested_serializers.py
index 2a5763476..201e38901 100644
--- a/netbox/users/api/nested_serializers.py
+++ b/netbox/users/api/nested_serializers.py
@@ -18,7 +18,7 @@ __all__ = [
# TODO: Remove in v4.2
warnings.warn(
- f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.",
+ "Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.",
DeprecationWarning
)
diff --git a/netbox/users/api/views.py b/netbox/users/api/views.py
index 240f68d36..bba9a4ec3 100644
--- a/netbox/users/api/views.py
+++ b/netbox/users/api/views.py
@@ -73,7 +73,7 @@ class TokenProvisionView(APIView):
def perform_create(self, serializer):
model = serializer.Meta.model
- logger = logging.getLogger(f'netbox.api.views.TokenProvisionView')
+ logger = logging.getLogger('netbox.api.views.TokenProvisionView')
logger.info(f"Creating new {model._meta.verbose_name}")
serializer.save()
diff --git a/netbox/users/apps.py b/netbox/users/apps.py
index cd61a59bc..4bfd612d9 100644
--- a/netbox/users/apps.py
+++ b/netbox/users/apps.py
@@ -6,7 +6,7 @@ class UsersConfig(AppConfig):
def ready(self):
from netbox.models.features import register_models
- from . import signals
+ from . import signals # noqa: F401
# Register models
register_models(*self.get_models())
diff --git a/netbox/users/forms/model_forms.py b/netbox/users/forms/model_forms.py
index 639b9f726..42c3b15f0 100644
--- a/netbox/users/forms/model_forms.py
+++ b/netbox/users/forms/model_forms.py
@@ -36,7 +36,6 @@ class UserConfigFormMetaclass(forms.models.ModelFormMetaclass):
# Emulate a declared field for each supported user preference
preference_fields = {}
for field_name, preference in PREFERENCES.items():
- description = f'{preference.description}{field_name}
'
if preference.description:
help_text = f'{preference.description}