From a3ce248c0dcb9897282d3c09c7ce62c699f95d8f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 13 Aug 2025 08:38:57 -0400 Subject: [PATCH] Add support for pipe character as delimiting character for bulk imports --- netbox/netbox/choices.py | 2 ++ netbox/netbox/constants.py | 8 -------- netbox/netbox/preferences.py | 2 +- netbox/utilities/constants.py | 1 + netbox/utilities/export.py | 2 +- netbox/utilities/forms/bulk_import.py | 2 +- 6 files changed, 6 insertions(+), 11 deletions(-) diff --git a/netbox/netbox/choices.py b/netbox/netbox/choices.py index 5c3110745..4c2b2478a 100644 --- a/netbox/netbox/choices.py +++ b/netbox/netbox/choices.py @@ -151,12 +151,14 @@ class CSVDelimiterChoices(ChoiceSet): AUTO = 'auto' COMMA = CSV_DELIMITERS['comma'] SEMICOLON = CSV_DELIMITERS['semicolon'] + PIPE = CSV_DELIMITERS['pipe'] TAB = CSV_DELIMITERS['tab'] CHOICES = [ (AUTO, _('Auto-detect')), (COMMA, _('Comma')), (SEMICOLON, _('Semicolon')), + (PIPE, _('Pipe')), (TAB, _('Tab')), ] diff --git a/netbox/netbox/constants.py b/netbox/netbox/constants.py index 7a8d54ca8..d3f9c4786 100644 --- a/netbox/netbox/constants.py +++ b/netbox/netbox/constants.py @@ -60,11 +60,3 @@ CENSOR_TOKEN_CHANGED = '***CHANGED***' # Placeholder text for empty tables EMPTY_TABLE_TEXT = 'No results found' - -# CSV delimiters -CSV_DELIMITERS = { - 'comma': ',', - 'semicolon': ';', - 'pipe': '|', - 'tab': '\t', -} diff --git a/netbox/netbox/preferences.py b/netbox/netbox/preferences.py index f69d2abc7..d8fb130f4 100644 --- a/netbox/netbox/preferences.py +++ b/netbox/netbox/preferences.py @@ -1,9 +1,9 @@ from django.conf import settings from django.utils.translation import gettext_lazy as _ -from netbox.constants import CSV_DELIMITERS from netbox.registry import registry from users.preferences import UserPreference +from utilities.constants import CSV_DELIMITERS from utilities.paginator import EnhancedPaginator diff --git a/netbox/utilities/constants.py b/netbox/utilities/constants.py index 9f027f8e1..c2ffa37a8 100644 --- a/netbox/utilities/constants.py +++ b/netbox/utilities/constants.py @@ -69,6 +69,7 @@ HTTP_REQUEST_META_SAFE_COPY = [ CSV_DELIMITERS = { 'comma': ',', 'semicolon': ';', + 'pipe': '|', 'tab': '\t', } diff --git a/netbox/utilities/export.py b/netbox/utilities/export.py index 56ba9506a..73d784579 100644 --- a/netbox/utilities/export.py +++ b/netbox/utilities/export.py @@ -1,7 +1,7 @@ from django.utils.translation import gettext_lazy as _ from django_tables2.export import TableExport as TableExport_ -from netbox.constants import CSV_DELIMITERS +from utilities.constants import CSV_DELIMITERS __all__ = ( 'TableExport', diff --git a/netbox/utilities/forms/bulk_import.py b/netbox/utilities/forms/bulk_import.py index 967ba1196..1e38de014 100644 --- a/netbox/utilities/forms/bulk_import.py +++ b/netbox/utilities/forms/bulk_import.py @@ -115,7 +115,7 @@ class BulkImportForm(ChangelogMessageMixin, BackgroundJobMixin, SyncedDataMixin, dialect = csv.Sniffer().sniff(data.strip(), delimiters=delimiters) except csv.Error: dialect = csv.excel - elif delimiter in (CSVDelimiterChoices.COMMA, CSVDelimiterChoices.SEMICOLON): + elif delimiter in (CSVDelimiterChoices.COMMA, CSVDelimiterChoices.SEMICOLON, CSVDelimiterChoices.PIPE): dialect = csv.excel dialect.delimiter = delimiter elif delimiter == CSVDelimiterChoices.TAB: