From 910f6b380cc5cddb1e8ac85277727f9df9f44471 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 12 Sep 2023 16:32:19 -0400 Subject: [PATCH] Move delimiting chars to a separate constant for easy reference --- netbox/utilities/choices.py | 8 +++++--- netbox/utilities/constants.py | 11 +++++++++++ netbox/utilities/forms/bulk_import.py | 8 ++++---- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/netbox/utilities/choices.py b/netbox/utilities/choices.py index 193da6b5a..77bfc03ca 100644 --- a/netbox/utilities/choices.py +++ b/netbox/utilities/choices.py @@ -1,6 +1,8 @@ from django.conf import settings from django.utils.translation import gettext_lazy as _ +from .constants import CSV_DELIMITERS + class ChoiceSetMeta(type): """ @@ -234,9 +236,9 @@ class ImportFormatChoices(ChoiceSet): class CSVDelimiterChoices(ChoiceSet): AUTO = 'auto' - COMMA = ',' - SEMICOLON = ';' - TAB = '\t' + COMMA = CSV_DELIMITERS['comma'] + SEMICOLON = CSV_DELIMITERS['semicolon'] + TAB = CSV_DELIMITERS['tab'] CHOICES = [ (AUTO, _('Auto-detect')), diff --git a/netbox/utilities/constants.py b/netbox/utilities/constants.py index 5c551a810..345894065 100644 --- a/netbox/utilities/constants.py +++ b/netbox/utilities/constants.py @@ -58,3 +58,14 @@ HTTP_REQUEST_META_SAFE_COPY = [ 'SERVER_NAME', 'SERVER_PORT', ] + + +# +# CSV-style format delimiters +# + +CSV_DELIMITERS = { + 'comma': ',', + 'semicolon': ';', + 'tab': '\t', +} diff --git a/netbox/utilities/forms/bulk_import.py b/netbox/utilities/forms/bulk_import.py index 6c736ae29..63cec2ba2 100644 --- a/netbox/utilities/forms/bulk_import.py +++ b/netbox/utilities/forms/bulk_import.py @@ -7,10 +7,10 @@ from django import forms from django.utils.translation import gettext as _ from core.forms.mixins import SyncedDataMixin -from utilities.choices import CSVDelimiterChoices, ImportFormatChoices +from utilities.choices import CSVDelimiterChoices, ImportFormatChoices, ImportMethodChoices +from utilities.constants import CSV_DELIMITERS from utilities.forms.utils import parse_csv from .mixins import BootstrapMixin -from ..choices import ImportMethodChoices class BulkImportForm(BootstrapMixin, SyncedDataMixin, forms.Form): @@ -92,7 +92,7 @@ class BulkImportForm(BootstrapMixin, SyncedDataMixin, forms.Form): return ImportFormatChoices.YAML # Look for any of the CSV delimiters in the first line (ignoring the default 'auto' choice) first_line = data.split('\n', 1)[0] - csv_delimiters = CSVDelimiterChoices.values()[1:] + csv_delimiters = CSV_DELIMITERS.values() if any(x in first_line for x in csv_delimiters): return ImportFormatChoices.CSV except IndexError: @@ -109,7 +109,7 @@ class BulkImportForm(BootstrapMixin, SyncedDataMixin, forms.Form): if delimiter == CSVDelimiterChoices.AUTO: # This uses a rough heuristic to detect the CSV dialect based on the presence of supported delimiting # characters. If the data is malformed, we'll fall back to the default Excel dialect. - delimiters = ''.join(CSVDelimiterChoices.values()[1:]) # Skip "auto" + delimiters = ''.join(CSV_DELIMITERS.values()) try: dialect = csv.Sniffer().sniff(data.strip(), delimiters=delimiters) except csv.Error: