diff --git a/netbox/utilities/forms.py b/netbox/utilities/forms.py index 73d082525..f6e0b36b1 100644 --- a/netbox/utilities/forms.py +++ b/netbox/utilities/forms.py @@ -236,14 +236,15 @@ class CSVDataField(forms.CharField): if not self.help_text: self.help_text = 'Enter one line per record in CSV format.' - def utf_8_encoder(self, unicode_csv_data): - for line in unicode_csv_data: - yield line.encode('utf-8') - def to_python(self, value): - # Return a list of dictionaries, each representing an individual record + """ + Return a list of dictionaries, each representing an individual record + """ + # Python 2's csv module has problems with Unicode + if not isinstance(value, str): + value = value.encode('utf-8') records = [] - reader = csv.reader(self.utf_8_encoder(value.splitlines())) + reader = csv.reader(value.splitlines()) for i, row in enumerate(reader, start=1): if row: if len(row) < len(self.columns): diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py index 7002cafc0..8aaded410 100644 --- a/netbox/utilities/utils.py +++ b/netbox/utilities/utils.py @@ -1,15 +1,26 @@ +import six + + def csv_format(data): """ Encapsulate any data which contains a comma within double quotes. """ csv = [] - for d in data: - if d in [None, False]: + for value in data: + + # Represent None or False with empty string + if value in [None, False]: csv.append(u'') - elif type(d) not in (str, unicode): - csv.append(u'{}'.format(d)) - elif u',' in d: - csv.append(u'"{}"'.format(d)) + continue + + # Force conversion to string first so we can check for any commas + if not isinstance(value, six.string_types): + value = u'{}'.format(value) + + # Double-quote the value if it contains a comma + if u',' in value: + csv.append(u'"{}"'.format(value)) else: - csv.append(d) + csv.append(u'{}'.format(value)) + return u','.join(csv)