diff --git a/netbox/netbox/views/generic.py b/netbox/netbox/views/generic.py index c01f69783..c665c3630 100644 --- a/netbox/netbox/views/generic.py +++ b/netbox/netbox/views/generic.py @@ -1,5 +1,6 @@ import logging import re +import csv from copy import deepcopy from django.contrib import messages @@ -7,7 +8,7 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import FieldDoesNotExist, ObjectDoesNotExist, ValidationError from django.db import transaction, IntegrityError from django.db.models import ManyToManyField, ProtectedError -from django.forms import Form, ModelMultipleChoiceField, MultipleHiddenInput, Textarea, FileField, CharField +from django.forms import Form, ModelMultipleChoiceField, MultipleHiddenInput, Textarea, FileField from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django.utils.html import escape @@ -668,7 +669,6 @@ class BulkImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): Upload_CSV = FileField( required=False ) - # this is where the import form is created -- add csv upload here or create new form? return ImportForm(*args, **kwargs) def _save_obj(self, obj_form, request): @@ -693,7 +693,6 @@ class BulkImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): logger = logging.getLogger('netbox.views.BulkImportView') new_objs = [] form = self._import_form(request.POST) - # this is where the csv data is handled if form.is_valid(): logger.debug("Form validation was successful") @@ -701,33 +700,27 @@ class BulkImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): try: # Iterate through CSV data and bind each row to a new model form instance. with transaction.atomic(): - if len(request.FILES) != 0: csv_file = request.FILES["Upload_CSV"] csv_file.seek(0) csv_str = csv_file.read().decode('utf-8') - - csv_list = csv_str.split('\n') - header_row = csv_list[0] - csv_list.pop(0) - header_list = header_row.split(',') + reader = csv.reader(csv_str.splitlines()) + headers_list = next(reader) headers = {} - for elt in header_list: - headers[elt] = None + for header in headers_list: + headers[header] = None records = [] - for row in csv_list: - if row != "": - row_str = (',').join(row) - row_list = row.split(',') - row_dict = {} - for i, elt in enumerate(row_list): - if elt == '': - row_dict[header_list[i]] = None - else: - row_dict[header_list[i]] = elt - records.append(row_dict) + for row in reader: + row_dict = {} + for i, elt in enumerate(row): + if elt == '': + row_dict[headers_list[i]] = None + else: + row_dict[headers_list[i]] = elt + records.append(row_dict) else: headers, records = form.cleaned_data['csv'] + print("headers:", headers, "records:", records) for row, data in enumerate(records, start=1): obj_form = self.model_form(data, headers=headers) restrict_form_fields(obj_form, request.user)