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:
@ -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):
|
||||
|
Reference in New Issue
Block a user