From 8331efcc0417d64158d3e94ee036f817b310e123 Mon Sep 17 00:00:00 2001 From: Adon Metcalfe Date: Fri, 18 Dec 2015 09:51:39 +0800 Subject: [PATCH 1/2] Update to support Django 1.9 ValuesIterable Includes fallback for ValuesQuerySet --- djqscsv/djqscsv.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/djqscsv/djqscsv.py b/djqscsv/djqscsv.py index c879f4b..70a3b30 100644 --- a/djqscsv/djqscsv.py +++ b/djqscsv/djqscsv.py @@ -10,7 +10,9 @@ # required to import ValuesQuerySet settings.configure() # pragma: no cover -from django.db.models.query import ValuesQuerySet +from django.db.models import query +if not hasattr(query, "ValuesIterable"): # Fall back for old versions of django + query.ValuesIterable = query.ValuesQuerySet from django.utils import six @@ -74,7 +76,7 @@ def write_csv(queryset, file_obj, **kwargs): # the CSV must always be built from a values queryset # in order to introspect the necessary fields. - if isinstance(queryset, ValuesQuerySet): + if isinstance(queryset, query.ValuesIterable): values_qs = queryset else: values_qs = queryset.values() From 0eea4759cbd29e5dbf66069155ed38a420bc89eb Mon Sep 17 00:00:00 2001 From: ASI Date: Fri, 18 Dec 2015 13:29:47 +0800 Subject: [PATCH 2/2] tweaks for 1.9 compat --- djqscsv/djqscsv.py | 44 ++++++++++---------------------------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/djqscsv/djqscsv.py b/djqscsv/djqscsv.py index 70a3b30..c95bb58 100644 --- a/djqscsv/djqscsv.py +++ b/djqscsv/djqscsv.py @@ -6,13 +6,6 @@ from django.http import HttpResponse from django.conf import settings -if not settings.configured: - # required to import ValuesQuerySet - settings.configure() # pragma: no cover - -from django.db.models import query -if not hasattr(query, "ValuesIterable"): # Fall back for old versions of django - query.ValuesIterable = query.ValuesQuerySet from django.utils import six @@ -76,27 +69,18 @@ def write_csv(queryset, file_obj, **kwargs): # the CSV must always be built from a values queryset # in order to introspect the necessary fields. - if isinstance(queryset, query.ValuesIterable): - values_qs = queryset + if len(queryset) > 0: + if not hasattr(queryset[0], "keys"): + try: + values_qs = queryset.values() + except AttributeError: + raise CSVException("This doesn't look like a QuerySet or ValuesIterable") + else: + values_qs = queryset + field_names = values_qs[0].keys() else: - values_qs = queryset.values() - - try: - field_names = values_qs.field_names - - except AttributeError: - # in django1.5, empty querysets trigger - # this exception, but not django 1.6 raise CSVException("Empty queryset provided to exporter.") - extra_columns = list(values_qs.query.extra_select) - if extra_columns: - field_names += extra_columns - - aggregate_columns = list(values_qs.query.aggregate_select) - if aggregate_columns: - field_names += aggregate_columns - if field_order: # go through the field_names and put the ones # that appear in the ordering list first @@ -116,15 +100,7 @@ def write_csv(queryset, file_obj, **kwargs): for field in queryset.model._meta.fields if field.name in field_names)) - # merge the custom field headers into the verbose/raw defaults, if provided - merged_header_map = name_map.copy() - if extra_columns: - merged_header_map.update(dict((k, k) for k in extra_columns)) - merged_header_map.update(field_header_map) - - merged_header_map = dict((k, _safe_utf8_stringify(v)) - for (k, v) in merged_header_map.items()) - writer.writerow(merged_header_map) + writer.writerow(name_map) for record in values_qs: record = _sanitize_unicode_record(field_serializer_map, record)