Skip to content

Commit c384ef1

Browse files
committed
tabular: document sheet data structure, log sizes
* Add more documentation for the `sheets` data structure. Rename or create some derived variables to make code clearer. * Log the number of columns and rows when one or the other exceeds the maximum allowed number.
1 parent 4cf6112 commit c384ef1

File tree

3 files changed

+23
-9
lines changed

3 files changed

+23
-9
lines changed

mfr/extensions/tabular/exceptions.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,14 @@ class TableTooBigError(TabularRendererError):
2929

3030
__TYPE = 'tabular_table_too_big'
3131

32-
def __init__(self, message, *args, code: int=400, **kwargs):
32+
def __init__(self, message, *args, code: int=400, nbr_cols: int=0, nbr_rows: int=0, **kwargs):
3333
super().__init__(message, *args, code=code, **kwargs)
34-
self.attr_stack.append([self.__TYPE, {}])
34+
self.nbr_cols = nbr_cols
35+
self.nbr_rows = nbr_rows
36+
self.attr_stack.append([self.__TYPE, {
37+
'nbr_cols': self.nbr_cols,
38+
'nbr_rows': self.nbr_rows
39+
}])
3540

3641

3742
class UnexpectedFormattingError(TabularRendererError):

mfr/extensions/tabular/render.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,31 @@ def _render_grid(self, fp, ext, *args, **kwargs): # assets_path, ext):
4646
size = settings.SMALL_TABLE
4747
self._renderer_tabular_metrics['size'] = 'small'
4848
self._renderer_tabular_metrics['nbr_sheets'] = len(sheets)
49-
for sheet in sheets:
50-
sheet = sheets[sheet] # Sheets are stored in key-value pairs of the form {sheet: (col, row)}
51-
if len(sheet[0]) > 9: # Check the number of columns
49+
for sheet_title in sheets:
50+
sheet = sheets[sheet_title]
51+
52+
# sheet is a two-element list. sheet[0] is a list of dicts containing metadata about
53+
# the column headers. Each dict contains four keys: `field`, `name`, `sortable`, `id`.
54+
# sheet[1] is a list of dicts where each dict contains the row data. The keys are the
55+
# fields the data belongs to and the values are the data values.
56+
57+
nbr_cols = len(sheet[0])
58+
if nbr_cols > 9:
5259
size = settings.BIG_TABLE
5360
self._renderer_tabular_metrics['size'] = 'big'
5461

55-
if len(sheet[0]) > settings.MAX_SIZE or len(sheet[1]) > settings.MAX_SIZE:
56-
raise exceptions.TableTooBigError('Table is too large to render.', extension=ext)
62+
nbr_rows = len(sheet[1])
63+
if nbr_cols > settings.MAX_SIZE or nbr_rows > settings.MAX_SIZE:
64+
raise exceptions.TableTooBigError('Table is too large to render.', extension=ext,
65+
nbr_cols=nbr_cols, nbr_rows=nbr_rows)
5766

5867
return sheets, size
5968

6069
def _populate_data(self, fp, ext):
6170
"""Determine the appropriate library and use it to populate rows and columns
6271
:param fp: file pointer
6372
:param ext: file extension
64-
:return: tuple of column headers and row data
73+
:return: a dict mapping sheet titles to tuples of column headers and row data
6574
"""
6675
function_preference = settings.LIBS.get(ext.lower())
6776

mfr/extensions/tabular/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
config = settings.child('TABULAR_EXTENSION_CONFIG')
66

7-
MAX_SIZE = int(config.get('MAX_SIZE', 10000))
7+
MAX_SIZE = int(config.get('MAX_SIZE', 10000)) # max number of rows or columns allowed.
88
TABLE_WIDTH = int(config.get('TABLE_WIDTH', 700))
99
TABLE_HEIGHT = int(config.get('TABLE_HEIGHT', 600))
1010

0 commit comments

Comments
 (0)