1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

csv parse using python csv library

This commit is contained in:
Alyssa Bigley
2021-06-02 10:12:26 -04:00
parent 0c9376039c
commit 2bc68707b5

View File

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