1- import os
21import json
2+ import logging
3+ import os
34
5+ from humanfriendly import format_size
46from mako .lookup import TemplateLookup
7+
58from mfr .core import extension
9+ from mfr .extensions .tabular import settings , exceptions
610
7- from mfr .extensions .tabular import settings
8- from mfr .extensions .tabular import exceptions
11+ logger = logging .getLogger (__name__ )
912
1013
1114class TabularRenderer (extension .BaseRenderer ):
@@ -16,6 +19,16 @@ class TabularRenderer(extension.BaseRenderer):
1619 ]).get_template ('viewer.mako' )
1720
1821 def render (self ):
22+ file_size = os .path .getsize (self .file_path )
23+ if file_size > settings .MAX_FILE_SIZE :
24+ raise exceptions .FileTooLargeError (
25+ 'Tabular files larger than {} are not rendered. Please download '
26+ 'the file to view.' .format (format_size (settings .MAX_FILE_SIZE , binary = True )),
27+ file_size = file_size ,
28+ max_size = settings .MAX_FILE_SIZE ,
29+ extension = self .metadata .ext ,
30+ )
31+
1932 with open (self .file_path , errors = 'replace' ) as fp :
2033 sheets , size = self ._render_grid (fp , self .metadata .ext )
2134 return self .TEMPLATE .render (
@@ -34,7 +47,7 @@ def file_required(self):
3447 def cache_result (self ):
3548 return True
3649
37- def _render_grid (self , fp , ext , * args , ** kwargs ): # assets_path, ext):
50+ def _render_grid (self , fp , ext , * args , ** kwargs ):
3851 """Render a tabular file to html
3952 :param fp: file pointer object
4053 :return: RenderResult object containing html and assets
@@ -46,22 +59,31 @@ def _render_grid(self, fp, ext, *args, **kwargs): # assets_path, ext):
4659 size = settings .SMALL_TABLE
4760 self ._renderer_tabular_metrics ['size' ] = 'small'
4861 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
62+ for sheet_title in sheets :
63+ sheet = sheets [sheet_title ]
64+
65+ # sheet is a two-element list. sheet[0] is a list of dicts containing metadata about
66+ # the column headers. Each dict contains four keys: `field`, `name`, `sortable`, `id`.
67+ # sheet[1] is a list of dicts where each dict contains the row data. The keys are the
68+ # fields the data belongs to and the values are the data values.
69+
70+ nbr_cols = len (sheet [0 ])
71+ if nbr_cols > 9 :
5272 size = settings .BIG_TABLE
5373 self ._renderer_tabular_metrics ['size' ] = 'big'
5474
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 )
75+ nbr_rows = len (sheet [1 ])
76+ if nbr_cols > settings .MAX_SIZE or nbr_rows > settings .MAX_SIZE :
77+ raise exceptions .TableTooBigError ('Table is too large to render.' , extension = ext ,
78+ nbr_cols = nbr_cols , nbr_rows = nbr_rows )
5779
5880 return sheets , size
5981
6082 def _populate_data (self , fp , ext ):
6183 """Determine the appropriate library and use it to populate rows and columns
6284 :param fp: file pointer
6385 :param ext: file extension
64- :return: tuple of column headers and row data
86+ :return: a dict mapping sheet titles to tuples of column headers and row data
6587 """
6688 function_preference = settings .LIBS .get (ext .lower ())
6789
0 commit comments