|
1 | 1 | from __future__ import unicode_literals |
| 2 | +import codecs |
2 | 3 | import unicodecsv as csv |
3 | 4 | from django.conf import settings |
4 | 5 | from rest_framework.renderers import * |
|
8 | 9 | from types import GeneratorType |
9 | 10 |
|
10 | 11 | from logging import getLogger |
| 12 | + |
11 | 13 | log = getLogger(__name__) |
12 | 14 |
|
13 | 15 | # six versions 1.3.0 and previous don't have PY2 |
14 | 16 | try: |
15 | 17 | from six import PY2 |
16 | 18 | except ImportError: |
17 | 19 | import sys |
| 20 | + |
18 | 21 | PY2 = sys.version_info[0] == 2 |
19 | 22 |
|
20 | 23 |
|
@@ -173,28 +176,32 @@ def flatten_dict(self, d): |
173 | 176 | def headers(): |
174 | 177 | doc = ("The headers property. Kept around for backward compatibility." |
175 | 178 | "Use the header attribute instead.") |
| 179 | + |
176 | 180 | def fget(self): |
177 | 181 | log.warning('The CSVRenderer.headers property is deprecated. ' |
178 | 182 | 'Use CSVRenderer.header instead.') |
179 | 183 | return self.header |
| 184 | + |
180 | 185 | def fset(self, value): |
181 | 186 | log.warning('The CSVRenderer.headers property is deprecated. ' |
182 | 187 | 'Use CSVRenderer.header instead.') |
183 | 188 | self.header = value |
| 189 | + |
184 | 190 | def fdel(self): |
185 | 191 | log.warning('The CSVRenderer.headers property is deprecated. ' |
186 | 192 | 'Use CSVRenderer.header instead.') |
187 | 193 | del self.header |
| 194 | + |
188 | 195 | return locals() |
| 196 | + |
189 | 197 | headers = property(**headers()) |
190 | 198 |
|
191 | 199 |
|
192 | | -class CSVRendererWithUnderscores (CSVRenderer): |
| 200 | +class CSVRendererWithUnderscores(CSVRenderer): |
193 | 201 | level_sep = '_' |
194 | 202 |
|
195 | 203 |
|
196 | 204 | class CSVStreamingRenderer(CSVRenderer): |
197 | | - |
198 | 205 | def render(self, data, media_type=None, renderer_context={}): |
199 | 206 | """ |
200 | 207 | Renders serialized *data* into CSV to be used with Django |
@@ -223,6 +230,10 @@ def render(self, data, media_type=None, renderer_context={}): |
223 | 230 | header = renderer_context.get('header', self.header) |
224 | 231 | labels = renderer_context.get('labels', self.labels) |
225 | 232 | encoding = renderer_context.get('encoding', settings.DEFAULT_CHARSET) |
| 233 | + bom = renderer_context.get('bom', False) |
| 234 | + |
| 235 | + if bom and encoding == settings.DEFAULT_CHARSET: |
| 236 | + yield codecs.BOM_UTF8 |
226 | 237 |
|
227 | 238 | table = self.tablize(data, header=header, labels=labels) |
228 | 239 | csv_buffer = Echo() |
|
0 commit comments