11import json
2+ import gc
23import logging
34import os
45
@@ -30,7 +31,12 @@ def render(self):
3031 )
3132
3233 with open (self .file_path , errors = 'replace' ) as fp :
33- sheets , size = self ._render_grid (fp , self .metadata .ext )
34+ sheets , size , nbr_rows , nbr_cols = self ._render_grid (fp , self .metadata .ext )
35+
36+ # Force GC
37+ gc .collect ()
38+
39+ if sheets and size :
3440 return self .TEMPLATE .render (
3541 base = self .assets_url ,
3642 width = settings .TABLE_WIDTH ,
@@ -39,6 +45,14 @@ def render(self):
3945 options = json .dumps (size ),
4046 )
4147
48+ assert nbr_rows and nbr_cols
49+ raise exceptions .TableTooBigError (
50+ 'Table is too large to render.' ,
51+ extension = self .metadata .ext ,
52+ nbr_cols = nbr_cols ,
53+ nbr_rows = nbr_rows
54+ )
55+
4256 @property
4357 def file_required (self ):
4458 return True
@@ -59,6 +73,11 @@ def _render_grid(self, fp, ext, *args, **kwargs):
5973 size = settings .SMALL_TABLE
6074 self ._renderer_tabular_metrics ['size' ] = 'small'
6175 self ._renderer_tabular_metrics ['nbr_sheets' ] = len (sheets )
76+
77+ table_too_big = False
78+ nbr_cols = 0
79+ nbr_rows = 0
80+
6281 for sheet_title in sheets :
6382 sheet = sheets [sheet_title ]
6483
@@ -74,10 +93,14 @@ def _render_grid(self, fp, ext, *args, **kwargs):
7493
7594 nbr_rows = len (sheet [1 ])
7695 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 )
96+ table_too_big = True
97+ break
98+
99+ if table_too_big :
100+ del sheets
101+ return None , None , nbr_rows , nbr_cols
79102
80- return sheets , size
103+ return sheets , size , None , None
81104
82105 def _populate_data (self , fp , ext ):
83106 """Determine the appropriate library and use it to populate rows and columns
0 commit comments