From 9d2ddb285fe883c1d77923b164933a0cdbcebabb Mon Sep 17 00:00:00 2001 From: abidibo Date: Tue, 28 May 2024 17:27:26 +0200 Subject: [PATCH 1/3] fix: #7, save_virtual_workbook missing in new openpyxl versions --- admin_export_action/report.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/admin_export_action/report.py b/admin_export_action/report.py index 7e4ff10..1416df6 100644 --- a/admin_export_action/report.py +++ b/admin_export_action/report.py @@ -24,9 +24,9 @@ from openpyxl.styles import Font from openpyxl.utils import get_column_letter from openpyxl.workbook import Workbook -from openpyxl.writer.excel import save_virtual_workbook +from tempfile import NamedTemporaryFile -from six import BytesIO, text_type +from six import text_type from .introspection import get_model_from_path_string from .config import get_config @@ -224,14 +224,17 @@ def list_to_workbook(data, title='report', header=None, widths=None): def build_xlsx_response(wb, title="report"): """ Take a workbook and return a xlsx file response """ title = generate_filename(title, '.xlsx') - myfile = BytesIO() - myfile.write(save_virtual_workbook(wb)) - response = HttpResponse( - myfile.getvalue(), - content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') - response['Content-Disposition'] = 'attachment; filename=%s' % title - response['Content-Length'] = myfile.tell() - return response + response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + with NamedTemporaryFile() as tmp: + wb.save(tmp.name) + tmp.seek(0) + response = HttpResponse( + tmp.read(), + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response['Content-Disposition'] = 'attachment; filename=%s' % title + response['Content-Length'] = tmp.tell() + + return response def list_to_xlsx_response(data, title='report', header=None, From 42923075f2d86fa7de0fb74e5675a615595e1220 Mon Sep 17 00:00:00 2001 From: abidibo Date: Tue, 28 May 2024 17:51:55 +0200 Subject: [PATCH 2/3] feat: #2, sort fields in selection (non exactly as issue tracked) --- admin_export_action/views.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/admin_export_action/views.py b/admin_export_action/views.py index 3aaa8b5..4ab32b3 100644 --- a/admin_export_action/views.py +++ b/admin_export_action/views.py @@ -53,9 +53,9 @@ def get_context_data(self, **kwargs): context['opts'] = model_class._meta context['queryset'] = queryset context['model_ct'] = self.request.GET['ct'] - context[ - 'related_fields'] = introspection.get_relation_fields_from_model( - model_class) + + related = introspection.get_relation_fields_from_model(model_class) + context['related_fields'] = sorted(related, key=lambda x: x.verbose_name if hasattr(x, 'verbose_name') else x.get_accessor_name()) # extra context try: @@ -63,9 +63,13 @@ def get_context_data(self, **kwargs): except KeyError: raise ValueError("Model %r not registered with admin" % model_class) + context.update(model_admin.admin_site.each_context(self.request)) - context.update(introspection.get_fields(model_class, field_name, path)) + struct = introspection.get_fields(model_class, field_name, path) + context.update({ + "fields": sorted(struct.get("fields"), key=lambda x: x.verbose_name if hasattr(x, 'verbose_name') else x.name), + }) return context def post(self, request, **kwargs): From a0907bc2930118bdf0e06d2e25d96744bb971d43 Mon Sep 17 00:00:00 2001 From: abidibo Date: Tue, 28 May 2024 17:57:15 +0200 Subject: [PATCH 3/3] build: bump version number to 0.3.2 --- setup.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 7c1410a..f7102d6 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ setup( name='django-admin-export-action', - version='0.3.1', + version='0.3.2', packages=['admin_export_action'], include_package_data=True, license='MIT License', @@ -41,6 +41,8 @@ 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', 'Topic :: Software Development', ], project_urls={