Skip to content

Commit 237cd80

Browse files
committed
Handle CSV data de/encoding
1 parent b79043a commit 237cd80

File tree

3 files changed

+22
-14
lines changed

3 files changed

+22
-14
lines changed

opentreemap/exporter/tests.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,19 @@ def setUp(self):
3838
password='bar')
3939

4040
def assertCSVRowValue(self, csv_file, row_index, headers_and_values):
41-
csvreader = csv.reader(csv_file, delimiter=b",")
42-
rows = list(csvreader)
41+
# decode bytes object into string list required by the csv reader
42+
str_rows = [line.decode('utf-8') for line in csv_file]
4343

4444
# strip the BOM out
45-
rows[0][0] = rows[0][0][3:]
45+
str_rows[0] = str_rows[0][1:]
4646

47-
self.assertTrue(len(rows) > 1)
47+
csvreader = csv.reader(str_rows, delimiter=",")
48+
reader_rows = list(csvreader)
49+
50+
self.assertTrue(len(reader_rows) > 1)
4851
for (header, value) in headers_and_values.items():
49-
target_column = rows[0].index(header)
50-
self.assertEqual(value, rows[row_index][target_column])
52+
target_column = reader_rows[0].index(header)
53+
self.assertEqual(value, reader_rows[row_index][target_column])
5154

5255
def assertTaskProducesCSV(self, user, model, assert_fields_and_values):
5356
self._assertTaskProducesCSVBase(user, model, assert_fields_and_values)
@@ -82,6 +85,7 @@ def assertPsuedoAsyncTaskWorks(self, model,
8285

8386
job_id = ctx['job_id']
8487
job = ExportJob.objects.get(pk=job_id)
88+
8589
self.assertCSVRowValue(job.outfile, 1,
8690
{assertion_field: assertion_value})
8791

@@ -213,16 +217,20 @@ class UserExportsTest(UserExportsTestCase):
213217

214218
def get_csv_data_with_base_assertions(self):
215219
resp = users_csv(make_request(), self.instance)
216-
reader = csv.reader(resp)
217220

218-
# Skip BOM and entry line
219-
next(reader)
220-
next(reader)
221+
# decode bytes object into string list required by the csv reader
222+
str_rows = [line.decode('utf-8') for line in resp]
221223

224+
# strip the BOM and entry line out
225+
reader = csv.reader(str_rows[2:])
226+
227+
# grab and strip the header
222228
header = next(reader)
223229

224-
data = [dict(list(zip(header, [x.decode('utf8') for x in row])))
225-
for row in reader]
230+
reader_rows = list(reader)
231+
232+
data = (lambda h=header, rows=reader_rows:
233+
[dict(list(zip(h, [x for x in row]))) for row in rows])()
226234

227235
commander, user1data, user2data = data
228236
self.assertEqual(commander['username'], self.commander.username)

opentreemap/importer/util.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def _as_utf8(f):
3434

3535

3636
def _guess_dialect_and_reset_read_pointer(f):
37-
dialect = csv.Sniffer().sniff(_as_utf8(f).read(4096), delimiters=',\t')
37+
dialect = csv.Sniffer().sniff(_as_utf8(f).read(4096).decode(), delimiters=',\t')
3838
f.seek(0)
3939
return dialect
4040

opentreemap/importer/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -707,7 +707,7 @@ def process_csv(request, instance, import_type, **kwargs):
707707
filename = list(files.keys())[0]
708708
file_obj = files[filename]
709709

710-
file_obj = io.BytesIO(decode(file_obj.read()).encode('utf-8'))
710+
file_obj = io.BytesIO((file_obj.read().encode('utf-8')))
711711

712712
owner = request.user
713713
ImportEventModel = get_import_event_model(import_type)

0 commit comments

Comments
 (0)