diff --git a/README.rst b/README.rst index bbc473d..1762757 100644 --- a/README.rst +++ b/README.rst @@ -17,7 +17,7 @@ Installation - Python 2.7, 3.3+ - `Django `_ >= 1.5 -- Pandas +- (optional) Pandas - Numpy - python-dateutil - pytz @@ -26,6 +26,13 @@ To install:: pip install django-csv-exports +or to include the optional dependency:: + + pip install django-csv-exports[pandas] + +Exporting with pandas may be faster than the standard library under certain +circumstances, test with your dataset. + Next add `django_exports` to your `INSTALLED_APPS` to include the related css/js:: INSTALLED_APPS = ( diff --git a/django_csv_exports/admin.py b/django_csv_exports/admin.py index ae8c321..6f843fe 100644 --- a/django_csv_exports/admin.py +++ b/django_csv_exports/admin.py @@ -1,7 +1,5 @@ import csv -import pandas - import django from django.conf import settings from django.contrib import admin @@ -14,6 +12,13 @@ def export_as_csv(admin_model, request, queryset): Generic csv export admin action. based on http://djangosnippets.org/snippets/1697/ """ + + # import pandas lazily as to not slow down ./manage.py + try: + import pandas + except ImportError: + pandas = None + # everyone has perms to export as csv unless explicitly defined if getattr(settings, 'DJANGO_EXPORTS_REQUIRE_PERM', None): admin_opts = admin_model.opts @@ -37,8 +42,14 @@ def export_as_csv(admin_model, request, queryset): response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename=%s.csv' % text(opts).replace('.', '_') - queryset = queryset.values_list(*field_names) - pandas.DataFrame(list(queryset), columns=field_names).to_csv(response, index=False, encoding='utf-8') + if pandas is not None: + queryset = queryset.values_list(*field_names) + pandas.DataFrame(list(queryset), columns=field_names).to_csv(response, index=False, encoding='utf-8') + else: + writer = csv.writer(response) + writer.writerow(list(field_names)) + for obj in queryset: + writer.writerow([text(getattr(obj, field)) for field in field_names]) return response return HttpResponseForbidden() export_as_csv.short_description = "Export selected objects as csv file" diff --git a/setup.py b/setup.py index e6124e8..9f5694d 100644 --- a/setup.py +++ b/setup.py @@ -35,10 +35,12 @@ def read_file(filename): long_description=read_file('README.rst'), test_suite="runtests.runtests", zip_safe=False, - install_requires=[ - 'pandas', - 'numpy', - 'python-dateutil', - 'pytz' - ] + extras_require={ + 'pandas': [ + 'pandas', + 'numpy', + 'python-dateutil', + 'pytz' + ] + } )