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

Initial work on JSON/YAML-based DeviceType import

This commit is contained in:
Jeremy Stretch
2019-09-05 17:23:56 -04:00
parent 2ce0ff505a
commit f8fdca4968
10 changed files with 202 additions and 39 deletions

View File

@ -1,4 +1,6 @@
import json
import sys
import yaml
from copy import deepcopy
from django.conf import settings
@ -26,7 +28,7 @@ from extras.querysets import CustomFieldQueryset
from utilities.forms import BootstrapMixin, CSVDataField
from utilities.utils import csv_format
from .error_handlers import handle_protectederror
from .forms import ConfirmationForm
from .forms import ConfirmationForm, ImportForm
from .paginator import EnhancedPaginator
@ -393,6 +395,62 @@ class BulkCreateView(GetReturnURLMixin, View):
})
class ObjectImportView(GetReturnURLMixin, View):
"""
Import a single object (YAML or JSON format).
"""
model = None
model_form = None
template_name = 'utilities/obj_import.html'
def create_object(self, data):
raise NotImplementedError("View must implement object creation logic")
def get(self, request):
form = ImportForm()
return render(request, self.template_name, {
'form': form,
'obj_type': self.model._meta.verbose_name,
'return_url': self.get_return_url(request),
})
def post(self, request):
form = ImportForm(request.POST)
if form.is_valid():
# Process object data
if form.cleaned_data['format'] == 'json':
data = json.loads(form.cleaned_data['data'])
else:
data = yaml.load(form.cleaned_data['data'])
# Initialize model form
model_form = self.model_form(data)
if model_form.is_valid():
obj = model_form.save(commit=False)
# assert False, model_form.cleaned_data['interfaces']
messages.success(request, "Imported object: {}".format(obj))
return redirect(self.get_return_url(request))
else:
# Replicate model form errors for display
for field, err in model_form.errors.items():
form.add_error(None, "{}: {}".format(field, err))
return render(request, self.template_name, {
'form': form,
'obj_type': self.model._meta.verbose_name,
'return_url': self.get_return_url(request),
})
class BulkImportView(GetReturnURLMixin, View):
"""
Import objects in bulk (CSV format).
@ -404,7 +462,7 @@ class BulkImportView(GetReturnURLMixin, View):
"""
model_form = None
table = None
template_name = 'utilities/obj_import.html'
template_name = 'utilities/obj_bulk_import.html'
widget_attrs = {}
def _import_form(self, *args, **kwargs):