|
2 | 2 | import datetime
|
3 | 3 |
|
4 | 4 | from django.core.exceptions import ValidationError
|
5 |
| -from django.templatetags.l10n import localize |
6 | 5 | from django.utils.text import slugify
|
7 | 6 | from django.http import HttpResponse
|
8 | 7 |
|
|
20 | 19 | # Keyword arguments that will be used by this module
|
21 | 20 | # the rest will be passed along to the csv writer
|
22 | 21 | DJQSCSV_KWARGS = {'field_header_map': None,
|
| 22 | + 'field_serializer_map': None, |
23 | 23 | 'use_verbose_names': True,
|
24 | 24 | 'field_order': None}
|
25 | 25 |
|
@@ -59,6 +59,7 @@ def write_csv(queryset, file_obj, **kwargs):
|
59 | 59 |
|
60 | 60 | # process keyword arguments to pull out the ones used by this function
|
61 | 61 | field_header_map = kwargs.get('field_header_map', {})
|
| 62 | + field_serializer_map = kwargs.get('field_serializer_map', {}) |
62 | 63 | use_verbose_names = kwargs.get('use_verbose_names', True)
|
63 | 64 | field_order = kwargs.get('field_order', None)
|
64 | 65 |
|
@@ -121,7 +122,7 @@ def write_csv(queryset, file_obj, **kwargs):
|
121 | 122 | writer.writerow(merged_header_map)
|
122 | 123 |
|
123 | 124 | for record in values_qs:
|
124 |
| - record = _sanitize_unicode_record(record) |
| 125 | + record = _sanitize_unicode_record(field_serializer_map, record) |
125 | 126 | writer.writerow(record)
|
126 | 127 |
|
127 | 128 |
|
@@ -154,20 +155,31 @@ def _validate_and_clean_filename(filename):
|
154 | 155 | return filename
|
155 | 156 |
|
156 | 157 |
|
157 |
| -def _sanitize_unicode_record(record): |
| 158 | +def _sanitize_unicode_record(field_serializer_map, record): |
158 | 159 |
|
159 |
| - def _sanitize_value(value): |
| 160 | + def _serialize_value(value): |
| 161 | + # provide default serializer for the case when |
| 162 | + # non text values get sent without a serializer |
| 163 | + if isinstance(value, datetime.datetime): |
| 164 | + return value.isoformat() |
| 165 | + else: |
| 166 | + return unicode(value) |
| 167 | + |
| 168 | + def _sanitize_text(value): |
| 169 | + # make sure every text value is of type 'str', coercing unicode |
160 | 170 | if isinstance(value, unicode):
|
161 | 171 | return value.encode("utf-8")
|
162 |
| - elif isinstance(value, datetime.datetime): |
163 |
| - return value.isoformat().encode("utf-8") |
| 172 | + elif isinstance(value, str): |
| 173 | + return value |
164 | 174 | else:
|
165 |
| - return localize(value) |
| 175 | + return str(value).encode("utf-8") |
166 | 176 |
|
167 | 177 | obj = {}
|
168 | 178 | for key, val in six.iteritems(record):
|
169 | 179 | if val is not None:
|
170 |
| - obj[_sanitize_value(key)] = _sanitize_value(val) |
| 180 | + serializer = field_serializer_map.get(key, _serialize_value) |
| 181 | + newval = serializer(val) |
| 182 | + obj[_sanitize_text(key)] = _sanitize_text(newval) |
171 | 183 |
|
172 | 184 | return obj
|
173 | 185 |
|
|
0 commit comments