Skip to content

Commit 4453a1c

Browse files
committed
fix TYPE_OBJECT, TYPE_MULTIOBJECT fields
1 parent 507c2d9 commit 4453a1c

File tree

2 files changed

+66
-34
lines changed

2 files changed

+66
-34
lines changed

netbox_custom_objects/field_types.py

Lines changed: 49 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
from django.utils.translation import gettext_lazy as _
1515
from extras.choices import CustomFieldTypeChoices, CustomFieldUIEditableChoices
1616
from utilities.api import get_serializer_for_model
17-
from utilities.forms.fields import (CSVChoiceField, CSVMultipleChoiceField,
17+
from utilities.forms.fields import (CSVChoiceField, CSVModelChoiceField,
18+
CSVModelMultipleChoiceField, CSVMultipleChoiceField,
1819
DynamicChoiceField,
1920
DynamicMultipleChoiceField, JSONField,
2021
LaxURLField)
@@ -357,7 +358,6 @@ def get_form_field(self, field, for_csv_import=False, **kwargs):
357358
"""
358359
content_type = ContentType.objects.get(pk=field.related_object_type_id)
359360

360-
from utilities.forms.fields import DynamicModelChoiceField
361361
if content_type.app_label == APP_LABEL:
362362
# This is a custom object type
363363
from netbox_custom_objects.models import CustomObjectType
@@ -367,24 +367,34 @@ def get_form_field(self, field, for_csv_import=False, **kwargs):
367367
)
368368
custom_object_type = CustomObjectType.objects.get(pk=custom_object_type_id)
369369
model = custom_object_type.get_model()
370-
field_class = DynamicModelChoiceField
371370
else:
372371
# This is a regular NetBox model
373372
model = content_type.model_class()
374373

374+
if for_csv_import:
375+
field_class = CSVModelChoiceField
376+
# For CSV import, determine to_field_name from the field configuration
377+
to_field_name = getattr(field, 'to_field_name', None) or 'name'
378+
return field_class(
379+
queryset=model.objects.all(),
380+
required=field.required,
381+
initial=field.default,
382+
to_field_name=to_field_name,
383+
)
384+
else:
385+
from utilities.forms.fields import DynamicModelChoiceField
375386
field_class = DynamicModelChoiceField
376-
377-
return field_class(
378-
queryset=model.objects.all(),
379-
required=field.required,
380-
initial=field.default,
381-
query_params=(
382-
field.related_object_filter
383-
if hasattr(field, "related_object_filter")
384-
else None
385-
),
386-
selector=True,
387-
)
387+
return field_class(
388+
queryset=model.objects.all(),
389+
required=field.required,
390+
initial=field.default,
391+
query_params=(
392+
field.related_object_filter
393+
if hasattr(field, "related_object_filter")
394+
else None
395+
),
396+
selector=True,
397+
)
388398

389399
def get_filterform_field(self, field, **kwargs):
390400
return None
@@ -658,19 +668,30 @@ def get_form_field(self, field, for_csv_import=False, **kwargs):
658668
# This is a regular NetBox model
659669
model = content_type.model_class()
660670

661-
from utilities.forms.fields import DynamicModelMultipleChoiceField
662-
663-
return DynamicModelMultipleChoiceField(
664-
queryset=model.objects.all(),
665-
required=field.required,
666-
initial=field.default,
667-
query_params=(
668-
field.related_object_filter
669-
if hasattr(field, "related_object_filter")
670-
else None
671-
),
672-
selector=True,
673-
)
671+
if for_csv_import:
672+
field_class = CSVModelMultipleChoiceField
673+
# For CSV import, determine to_field_name from the field configuration
674+
to_field_name = getattr(field, 'to_field_name', None) or 'name'
675+
return field_class(
676+
queryset=model.objects.all(),
677+
required=field.required,
678+
initial=field.default,
679+
to_field_name=to_field_name,
680+
)
681+
else:
682+
from utilities.forms.fields import DynamicModelMultipleChoiceField
683+
field_class = DynamicModelMultipleChoiceField
684+
return field_class(
685+
queryset=model.objects.all(),
686+
required=field.required,
687+
initial=field.default,
688+
query_params=(
689+
field.related_object_filter
690+
if hasattr(field, "related_object_filter")
691+
else None
692+
),
693+
selector=True,
694+
)
674695

675696
def get_filterform_field(self, field, **kwargs):
676697
return None

netbox_custom_objects/views.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@
1414
from extras.models import JournalEntry
1515
from extras.tables import JournalEntryTable
1616
from netbox.filtersets import BaseFilterSet
17-
from netbox.forms import NetBoxModelBulkEditForm, NetBoxModelFilterSetForm, NetBoxModelImportForm
17+
from netbox.forms import (
18+
NetBoxModelBulkEditForm,
19+
NetBoxModelFilterSetForm,
20+
NetBoxModelImportForm,
21+
)
1822
from netbox.views import generic
1923
from netbox.views.generic.mixins import TableMixin
2024
from utilities.forms import ConfirmationForm
@@ -31,7 +35,7 @@
3135
from . import field_types, filtersets, forms, tables
3236
from .models import CustomObject, CustomObjectType, CustomObjectTypeField
3337

34-
logger = logging.getLogger('netbox_custom_objects.views')
38+
logger = logging.getLogger("netbox_custom_objects.views")
3539

3640

3741
class CustomJournalEntryForm(JournalEntryForm):
@@ -123,7 +127,9 @@ def get_table(self, data, request, bulk_actions=True):
123127
attrs[field.name] = field_type.get_table_column_field(field)
124128
except NotImplementedError:
125129
logger.debug(
126-
"table mixin: {} field is not implemented; using a default column".format(field.name)
130+
"table mixin: {} field is not implemented; using a default column".format(
131+
field.name
132+
)
127133
)
128134
# Define a method "render_table_column" method on any FieldType to customize output
129135
# See https://django-tables2.readthedocs.io/en/latest/pages/custom-data.html#table-render-foo-methods
@@ -587,7 +593,9 @@ def get_form(self, queryset):
587593
try:
588594
attrs[field.name] = field_type.get_annotated_form_field(field)
589595
except NotImplementedError:
590-
logger.debug("bulk edit form: {} field is not supported".format(field.name))
596+
logger.debug(
597+
"bulk edit form: {} field is not supported".format(field.name)
598+
)
591599

592600
form = type(
593601
f"{queryset.model._meta.object_name}BulkEditForm",
@@ -621,7 +629,7 @@ def get_queryset(self, request):
621629
return model.objects.all()
622630

623631

624-
@register_model_view(CustomObject, 'bulk_import', path='import', detail=False)
632+
@register_model_view(CustomObject, "bulk_import", path="import", detail=False)
625633
class CustomObjectBulkImportView(generic.BulkImportView):
626634
queryset = None
627635
model_form = None
@@ -667,7 +675,9 @@ def get_model_form(self, queryset):
667675
for field in self.custom_object_type.fields.all():
668676
field_type = field_types.FIELD_TYPE_CLASS[field.type]()
669677
try:
670-
attrs[field.name] = field_type.get_annotated_form_field(field)
678+
attrs[field.name] = field_type.get_annotated_form_field(
679+
field, for_csv_import=True
680+
)
671681
except NotImplementedError:
672682
print(f"bulk import form: {field.name} field is not supported")
673683

@@ -679,6 +689,7 @@ def get_model_form(self, queryset):
679689

680690
return form
681691

692+
682693
class CustomObjectJournalView(ConditionalLoginRequiredMixin, View):
683694
"""
684695
Custom journal view for CustomObject instances.

0 commit comments

Comments
 (0)