Skip to content

Commit

Permalink
Merge pull request #5 from xx396/master
Browse files Browse the repository at this point in the history
Performance boost for related fields and adds support for nullable ones
  • Loading branch information
thomst committed Aug 29, 2021
2 parents c14e205 + 1aecbf7 commit db2b900
Showing 1 changed file with 7 additions and 11 deletions.
18 changes: 7 additions & 11 deletions csvexport/actions.py
Expand Up @@ -129,15 +129,6 @@ def __str__(self):
return ''.join(self.data)


def get_value(item, choice):
fields = choice.split('.')
for field in fields:
value = getattr(item, field)
item = value
if not item: break
return str(value or settings.CSV_EXPORT_EMPTY_VALUE)


def csvexport(modeladmin, request, queryset):
"""
Admin-action to export items as csv-formatted data.
Expand Down Expand Up @@ -208,13 +199,18 @@ def csvexport(modeladmin, request, queryset):
header += list(fields_form.cleaned_data[node.key])

csv_data = CSVData(unique_form.cleaned_data['unique'])
header_fields = [f.replace('.', '__') for f in header]
related_fields = ['__'.join(f.split('__')[:-1]) for f in header_fields if '__' in f]
if related_fields:
queryset = queryset.select_related(*related_fields)

# write csv-header and -data and return csv-data as view or download
try:
writer = csv.writer(csv_data, **csv_format)
writer.writerow(tuple(f for f in header))
for item in queryset:
writer.writerow(tuple(get_value(item, f) for f in header))
for item in queryset.values_list(*header_fields):
row = tuple(f if f is not None and f != '' else settings.CSV_EXPORT_EMPTY_VALUE for f in item)
writer.writerow(row)
except (csv.Error, TypeError) as exc:
messages.error(request, 'Could not write csv-file: {}'.format(exc))
else:
Expand Down

0 comments on commit db2b900

Please sign in to comment.