7961 add csv bulk update

This commit is contained in:
Arthur 2022-10-14 16:55:20 -07:00
parent a44eed5001
commit b97e3c9f6a

View File

@ -321,13 +321,35 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView):
return ImportForm(*args, **kwargs) return ImportForm(*args, **kwargs)
def _create_objects(self, form, request): def _get_records(self, form, request):
new_objs = []
if request.FILES: if request.FILES:
headers, records = form.cleaned_data['csv_file'] headers, records = form.cleaned_data['csv_file']
else: else:
headers, records = form.cleaned_data['csv'] headers, records = form.cleaned_data['csv']
return headers, records
def _update_objects(self, form, request, headers, records):
new_objs = []
for row, data in enumerate(records, start=1):
data = self.queryset.model.get(pk=data["pk"]) | data
obj_form = self.model_form(data, headers=headers)
restrict_form_fields(obj_form, request.user)
if obj_form.is_valid():
obj = self._save_obj(obj_form, request)
new_objs.append(obj)
else:
for field, err in obj_form.errors.items():
form.add_error('csv', f'Row {row} {field}: {err[0]}')
raise ValidationError("")
return new_objs
def _create_objects(self, form, request, headers, records):
new_objs = []
for row, data in enumerate(records, start=1): for row, data in enumerate(records, start=1):
obj_form = self.model_form(data, headers=headers) obj_form = self.model_form(data, headers=headers)
restrict_form_fields(obj_form, request.user) restrict_form_fields(obj_form, request.user)
@ -375,7 +397,11 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView):
try: try:
# Iterate through CSV data and bind each row to a new model form instance. # Iterate through CSV data and bind each row to a new model form instance.
with transaction.atomic(): with transaction.atomic():
new_objs = self._create_objects(form, request) headers, records = self._get_records(form, request)
if "pk" in headers:
new_objs = self._update_objects(form, request, headers, records)
else:
new_objs = self._create_objects(form, request, headers, records)
# Enforce object-level permissions # Enforce object-level permissions
if self.queryset.filter(pk__in=[obj.pk for obj in new_objs]).count() != len(new_objs): if self.queryset.filter(pk__in=[obj.pk for obj in new_objs]).count() != len(new_objs):