|
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