|
1 | 1 | import re |
2 | 2 | import csv |
| 3 | +from http import HTTPStatus |
3 | 4 |
|
4 | 5 | from mfr.extensions.tabular import utilities |
5 | | -from mfr.extensions.tabular.exceptions import EmptyTableError, TabularRendererError |
| 6 | +from mfr.extensions.tabular.exceptions import (EmptyTableError, |
| 7 | + TabularRendererError) |
6 | 8 |
|
7 | 9 |
|
8 | 10 | def csv_stdlib(fp): |
@@ -42,35 +44,48 @@ def parse_stdlib(reader): |
42 | 44 | """ |
43 | 45 | columns = [] |
44 | 46 | # update the reader field names to avoid duplicate column names when performing row extraction |
45 | | - for idx, fieldname in enumerate(reader.fieldnames or []): |
46 | | - column_count = sum(1 for column in columns if fieldname == column['name']) |
47 | | - if column_count: |
48 | | - unique_fieldname = '{}-{}'.format(fieldname, column_count + 1) |
49 | | - reader.fieldnames[idx] = unique_fieldname |
50 | | - else: |
51 | | - unique_fieldname = fieldname |
52 | | - columns.append({ |
53 | | - 'id': unique_fieldname, |
54 | | - 'field': unique_fieldname, |
55 | | - 'name': fieldname, |
56 | | - 'sortable': True, |
57 | | - }) |
58 | | - |
59 | 47 | try: |
| 48 | + for idx, fieldname in enumerate(reader.fieldnames or []): |
| 49 | + column_count = sum(1 for column in columns if fieldname == column['name']) |
| 50 | + if column_count: |
| 51 | + unique_fieldname = '{}-{}'.format(fieldname, column_count + 1) |
| 52 | + reader.fieldnames[idx] = unique_fieldname |
| 53 | + else: |
| 54 | + unique_fieldname = fieldname |
| 55 | + columns.append({ |
| 56 | + 'id': unique_fieldname, |
| 57 | + 'field': unique_fieldname, |
| 58 | + 'name': fieldname, |
| 59 | + 'sortable': True, |
| 60 | + }) |
| 61 | + |
60 | 62 | rows = [row for row in reader] |
61 | 63 | except csv.Error as e: |
62 | 64 | if any("field larger than field limit" in errorMsg for errorMsg in e.args): |
63 | 65 | raise TabularRendererError( |
64 | 66 | 'This file contains a field too large to render. ' |
65 | 67 | 'Please download and view it locally.', |
66 | | - code=400, |
| 68 | + code=HTTPStatus.BAD_REQUEST, |
67 | 69 | extension='csv', |
68 | 70 | ) from e |
69 | 71 | else: |
70 | | - raise TabularRendererError('csv.Error: {}'.format(e), extension='csv') from e |
| 72 | + raise TabularRendererError('Cannot render file as csv/tsv. ' |
| 73 | + 'The file may be empty or corrupt', |
| 74 | + code=HTTPStatus.BAD_REQUEST, |
| 75 | + extension='csv') from e |
| 76 | + |
| 77 | + # Outside other except because the `if any` line causes more errors to be raised |
| 78 | + # on certain exceptions |
| 79 | + except Exception as e: |
| 80 | + raise TabularRendererError('Cannot render file as csv/tsv. ' |
| 81 | + 'The file may be empty or corrupt', |
| 82 | + code=HTTPStatus.BAD_REQUEST, |
| 83 | + extension='csv') from e |
71 | 84 |
|
72 | 85 | if not columns and not rows: |
73 | | - raise EmptyTableError('Table empty or corrupt.', extension='csv') |
| 86 | + raise EmptyTableError('Cannot render file as csv/tsv. ' |
| 87 | + 'The file may be empty or corrupt', |
| 88 | + code=HTTPStatus.BAD_REQUEST, extension='csv') |
74 | 89 |
|
75 | 90 | return {'Sheet 1': (columns, rows)} |
76 | 91 |
|
|
0 commit comments