|
5 | 5 | from django.urls import reverse |
6 | 6 | from extras.choices import CustomFieldUIVisibleChoices |
7 | 7 | from netbox.filtersets import BaseFilterSet |
8 | | -from netbox.forms import NetBoxModelBulkEditForm, NetBoxModelFilterSetForm |
| 8 | +from netbox.forms import NetBoxModelBulkEditForm, NetBoxModelFilterSetForm, NetBoxModelImportForm |
9 | 9 | from netbox.views import generic |
10 | 10 | from netbox.views.generic.mixins import TableMixin |
11 | 11 | from utilities.forms import ConfirmationForm |
@@ -462,8 +462,17 @@ def get_queryset(self, request): |
462 | 462 | return model.objects.all() |
463 | 463 |
|
464 | 464 | def get_form(self, queryset): |
| 465 | + meta = type( |
| 466 | + "Meta", |
| 467 | + (), |
| 468 | + { |
| 469 | + "model": queryset.model, |
| 470 | + "fields": "__all__", |
| 471 | + }, |
| 472 | + ) |
| 473 | + |
465 | 474 | attrs = { |
466 | | - "model": queryset.model, |
| 475 | + "Meta": meta, |
467 | 476 | "__module__": "database.forms", |
468 | 477 | } |
469 | 478 |
|
@@ -504,3 +513,58 @@ def get_queryset(self, request): |
504 | 513 | ) |
505 | 514 | model = self.custom_object_type.get_model() |
506 | 515 | 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