Skip to content

Commit f600429

Browse files
committed
Add message support for bulk import/update
1 parent 0514bb4 commit f600429

File tree

4 files changed

+39
-26
lines changed

4 files changed

+39
-26
lines changed

netbox/netbox/forms/mixins.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515

1616

1717
class ChangeLoggingMixin(forms.Form):
18+
"""
19+
Adds an optional field for recording a message on the resulting changelog record(s).
20+
"""
1821
changelog_message = forms.CharField(
1922
required=False,
2023
max_length=200

netbox/netbox/views/generic/bulk_views.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,6 @@ def create_and_update_objects(self, form, request):
424424
} if prefetch_ids else {}
425425

426426
for i, record in enumerate(records, start=1):
427-
instance = None
428427
object_id = int(record.pop('id')) if record.get('id') else None
429428

430429
# Determine whether this object is being created or updated
@@ -440,6 +439,8 @@ def create_and_update_objects(self, form, request):
440439
instance.snapshot()
441440

442441
else:
442+
instance = self.queryset.model()
443+
443444
# For newly created objects, apply any default custom field values
444445
custom_fields = CustomField.objects.filter(
445446
object_types=ContentType.objects.get_for_model(self.queryset.model),
@@ -450,6 +451,9 @@ def create_and_update_objects(self, form, request):
450451
if field_name not in record:
451452
record[field_name] = cf.default
452453

454+
# Record changelog message (if any)
455+
instance._changelog_message = form.cleaned_data.pop('changelog_message', '')
456+
453457
# Instantiate the model form for the object
454458
model_form_kwargs = {
455459
'data': record,

netbox/templates/generic/bulk_import.html

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -42,32 +42,31 @@
4242

4343
{# Data Import Form #}
4444
<div class="tab-pane show active" id="import-form" role="tabpanel" aria-labelledby="import-form-tab">
45-
<div class="row">
46-
<div class="col col-md-12 col-lg-10 offset-lg-1">
47-
<form action="" method="post" enctype="multipart/form-data" class="form">
48-
{% csrf_token %}
49-
<input type="hidden" name="import_method" value="direct" />
50-
51-
{# Form fields #}
52-
{% render_field form.data %}
53-
{% render_field form.format %}
54-
{% render_field form.csv_delimiter %}
55-
56-
{# Meta fields #}
57-
<div class="bg-primary-subtle border border-primary rounded-1 pt-3 mb-3">
58-
{% render_field form.background_job %}
59-
</div>
45+
<div class="col col-md-12 col-lg-10 offset-lg-1">
46+
<form action="" method="post" enctype="multipart/form-data" class="form">
47+
{% csrf_token %}
48+
<input type="hidden" name="import_method" value="direct" />
49+
50+
{# Form fields #}
51+
{% render_field form.data %}
52+
{% render_field form.format %}
53+
{% render_field form.csv_delimiter %}
54+
55+
{# Meta fields #}
56+
<div class="bg-primary-subtle border border-primary rounded-1 pt-3 mb-3">
57+
{% render_field form.changelog_message %}
58+
{% render_field form.background_job %}
59+
</div>
6060

61-
<div class="form-group">
62-
<div class="col col-md-12 text-end">
63-
{% if return_url %}
64-
<a href="{{ return_url }}" class="btn btn-outline-secondary">{% trans "Cancel" %}</a>
65-
{% endif %}
66-
<button type="submit" name="data_submit" class="btn btn-primary">{% trans "Submit" %}</button>
67-
</div>
61+
<div class="form-group">
62+
<div class="col col-md-12 text-end">
63+
{% if return_url %}
64+
<a href="{{ return_url }}" class="btn btn-outline-secondary">{% trans "Cancel" %}</a>
65+
{% endif %}
66+
<button type="submit" name="data_submit" class="btn btn-primary">{% trans "Submit" %}</button>
6867
</div>
69-
</form>
70-
</div>
68+
</div>
69+
</form>
7170
</div>
7271
</div>
7372

@@ -83,6 +82,11 @@
8382
{% render_field form.format %}
8483
{% render_field form.csv_delimiter %}
8584

85+
{# Meta fields #}
86+
<div class="bg-primary-subtle border border-primary rounded-1 pt-3 mb-3">
87+
{% render_field form.changelog_message %}
88+
</div>
89+
8690
<div class="form-group">
8791
<div class="col col-md-12 text-end">
8892
{% if return_url %}
@@ -110,6 +114,7 @@
110114

111115
{# Meta fields #}
112116
<div class="bg-primary-subtle border border-primary rounded-1 pt-3 mb-3">
117+
{% render_field form.changelog_message %}
113118
{% render_field form.background_job %}
114119
</div>
115120

netbox/utilities/forms/bulk_import.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@
88

99
from core.forms.mixins import SyncedDataMixin
1010
from netbox.choices import CSVDelimiterChoices, ImportFormatChoices, ImportMethodChoices
11+
from netbox.forms.mixins import ChangeLoggingMixin
1112
from utilities.constants import CSV_DELIMITERS
1213
from utilities.forms.mixins import BackgroundJobMixin
1314
from utilities.forms.utils import parse_csv
1415

1516

16-
class BulkImportForm(BackgroundJobMixin, SyncedDataMixin, forms.Form):
17+
class BulkImportForm(ChangeLoggingMixin, BackgroundJobMixin, SyncedDataMixin, forms.Form):
1718
import_method = forms.ChoiceField(
1819
choices=ImportMethodChoices,
1920
required=False

0 commit comments

Comments
 (0)