Skip to content

Commit 2f972be

Browse files
committed
NPL-379 Add bulk import to Custom Object
1 parent ad0472d commit 2f972be

File tree

4 files changed

+77
-5
lines changed

4 files changed

+77
-5
lines changed

netbox_custom_objects/templates/netbox_custom_objects/custom_object_list.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
{% plugin_list_buttons model %}
88
{% block extra_controls %}{% endblock %}
99
{% custom_object_add_button model custom_object_type %}
10-
{% custom_object_import_button model %}
10+
{% custom_object_import_button model custom_object_type %}
1111
{% custom_object_export_button model %}
1212
</div>
1313
{% endblock controls %}

netbox_custom_objects/templatetags/custom_object_buttons.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,9 +203,12 @@ def custom_object_add_button(model, custom_object_type, action="add"):
203203

204204

205205
@register.inclusion_tag("buttons/import.html")
206-
def custom_object_import_button(model, action="bulk_import"):
206+
def custom_object_import_button(model, custom_object_type, action="bulk_import"):
207207
try:
208-
url = reverse(get_viewname(model, action))
208+
viewname = get_viewname(model, action)
209+
url = reverse(
210+
viewname, kwargs={"custom_object_type": custom_object_type.name.lower()}
211+
)
209212
except NoReverseMatch:
210213
url = None
211214

netbox_custom_objects/urls.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@
4242
views.CustomObjectBulkDeleteView.as_view(),
4343
name="customobject_bulk_delete",
4444
),
45+
path(
46+
"<str:custom_object_type>/bulk-import/",
47+
views.CustomObjectBulkImportView.as_view(),
48+
name="customobject_bulk_import",
49+
),
4550
path(
4651
"<str:custom_object_type>/<int:pk>/",
4752
views.CustomObjectView.as_view(),

netbox_custom_objects/views.py

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from django.urls import reverse
66
from extras.choices import CustomFieldUIVisibleChoices
77
from netbox.filtersets import BaseFilterSet
8-
from netbox.forms import NetBoxModelBulkEditForm, NetBoxModelFilterSetForm
8+
from netbox.forms import NetBoxModelBulkEditForm, NetBoxModelFilterSetForm, NetBoxModelImportForm
99
from netbox.views import generic
1010
from netbox.views.generic.mixins import TableMixin
1111
from utilities.forms import ConfirmationForm
@@ -462,8 +462,17 @@ def get_queryset(self, request):
462462
return model.objects.all()
463463

464464
def get_form(self, queryset):
465+
meta = type(
466+
"Meta",
467+
(),
468+
{
469+
"model": queryset.model,
470+
"fields": "__all__",
471+
},
472+
)
473+
465474
attrs = {
466-
"model": queryset.model,
475+
"Meta": meta,
467476
"__module__": "database.forms",
468477
}
469478

@@ -504,3 +513,58 @@ def get_queryset(self, request):
504513
)
505514
model = self.custom_object_type.get_model()
506515
return model.objects.all()
516+
517+
518+
@register_model_view(CustomObject, 'bulk_import', path='import', detail=False)
519+
class CustomObjectBulkImportView(generic.BulkImportView):
520+
queryset = None
521+
model_form = None
522+
523+
def get(self, request, custom_object_type):
524+
# Necessary because get() in BulkImportView only takes request and no **kwargs
525+
return super().get(request)
526+
527+
def setup(self, request, *args, **kwargs):
528+
super().setup(request, *args, **kwargs)
529+
self.queryset = self.get_queryset(request)
530+
self.model_form = self.get_model_form(self.queryset)
531+
532+
def get_queryset(self, request):
533+
if self.queryset:
534+
return self.queryset
535+
custom_object_type = self.kwargs.get("custom_object_type", None)
536+
self.custom_object_type = CustomObjectType.objects.get(
537+
name__iexact=custom_object_type
538+
)
539+
model = self.custom_object_type.get_model()
540+
return model.objects.all()
541+
542+
def get_model_form(self, queryset):
543+
meta = type(
544+
"Meta",
545+
(),
546+
{
547+
"model": queryset.model,
548+
"fields": "__all__",
549+
},
550+
)
551+
552+
attrs = {
553+
"Meta": meta,
554+
"__module__": "database.forms",
555+
}
556+
557+
for field in self.custom_object_type.fields.all():
558+
field_type = field_types.FIELD_TYPE_CLASS[field.type]()
559+
try:
560+
attrs[field.name] = field_type.get_annotated_form_field(field)
561+
except NotImplementedError:
562+
print(f"bulk import form: {field.name} field is not supported")
563+
564+
form = type(
565+
f"{queryset.model._meta.object_name}BulkImportForm",
566+
(NetBoxModelImportForm,),
567+
attrs,
568+
)
569+
570+
return form

0 commit comments

Comments
 (0)