77
88
99RESPONSE_ERROR = (
10- "Response data is a %s, not a DataFrame! "
11- "Did you extend PandasMixin?"
10+ "Response data is a %s, not a DataFrame! Did you extend PandasMixin?"
1211)
1312
1413
@@ -18,18 +17,17 @@ class PandasBaseRenderer(BaseRenderer):
1817 Only works with serializers that return DataFrames as their data object.
1918 Uses a StringIO to capture the output of dataframe.to_[format]()
2019 """
20+
2121 def render (self , data , accepted_media_type = None , renderer_context = None ):
22- if renderer_context and ' response' in renderer_context :
23- status_code = renderer_context [' response' ].status_code
22+ if renderer_context and " response" in renderer_context :
23+ status_code = renderer_context [" response" ].status_code
2424 if not status .is_success (status_code ):
25- return "Error: %s" % data .get (' detail' , status_code )
25+ return "Error: %s" % data .get (" detail" , status_code )
2626
2727 if not isinstance (data , DataFrame ):
28- raise Exception (
29- RESPONSE_ERROR % type (data ).__name__
30- )
28+ raise Exception (RESPONSE_ERROR % type (data ).__name__ )
3129
32- name = getattr (self , ' function' , "to_%s" % self .format )
30+ name = getattr (self , " function" , "to_%s" % self .format )
3331 if not hasattr (data , name ):
3432 raise Exception ("Data frame is missing %s property!" % name )
3533
@@ -60,16 +58,17 @@ class PandasFileRenderer(PandasBaseRenderer):
6058 """
6159 Renderer for output formats that absolutely must use a file (i.e. Excel)
6260 """
61+
6362 def init_output (self ):
64- file , filename = mkstemp (suffix = '.' + self .format )
63+ file , filename = mkstemp (suffix = "." + self .format )
6564 self .filename = filename
6665 os .close (file )
6766
6867 def get_pandas_args (self , data ):
6968 return [self .filename ]
7069
7170 def get_output (self ):
72- file = open (self .filename , 'rb' )
71+ file = open (self .filename , "rb" )
7372 result = file .read ()
7473 file .close ()
7574 os .unlink (self .filename )
@@ -82,59 +81,66 @@ class PandasHTMLRenderer(TemplateHTMLRenderer, PandasBaseRenderer):
8281
8382 def render (self , data , accepted_media_type = None , renderer_context = None ):
8483 table = PandasBaseRenderer .render (
85- self , data , accepted_media_type , renderer_context ,
84+ self ,
85+ data ,
86+ accepted_media_type ,
87+ renderer_context ,
8688 )
8789
8890 return TemplateHTMLRenderer .render (
89- self , {'table' : table }, accepted_media_type , renderer_context ,
91+ self ,
92+ {"table" : table },
93+ accepted_media_type ,
94+ renderer_context ,
9095 )
9196
9297 def get_template_context (self , data , renderer_context ):
93- view = renderer_context [' view' ]
94- request = renderer_context [' request' ]
98+ view = renderer_context [" view" ]
99+ request = renderer_context [" request" ]
95100
96- data [' name' ] = view .get_view_name ()
97- data [' description' ] = view .get_view_description (html = True )
98- data [' url' ] = request .path .replace (' .html' , '' )
101+ data [" name" ] = view .get_view_name ()
102+ data [" description" ] = view .get_view_description (html = True )
103+ data [" url" ] = request .path .replace (" .html" , "" )
99104 full_path = request .get_full_path ()
100- if '?' in full_path :
101- data ['url_params' ] = full_path [full_path .index ('?' ):]
102- data ['available_formats' ] = [
103- cls .format for cls in view .renderer_classes
104- if cls .format != 'html'
105+ if "?" in full_path :
106+ data ["url_params" ] = full_path [full_path .index ("?" ) :]
107+ data ["available_formats" ] = [
108+ cls .format for cls in view .renderer_classes if cls .format != "html"
105109 ]
106110
107111 chart_type = view .pandas_serializer_class .wq_chart_type
108112 if chart_type :
109- data [' wq_chart_type' ] = chart_type
113+ data [" wq_chart_type" ] = chart_type
110114
111- if hasattr (view , ' get_template_context' ):
115+ if hasattr (view , " get_template_context" ):
112116 data .update (view .get_template_context (data ))
113117
114118 return data
115119
116120 def get_pandas_kwargs (self , data , renderer_context ):
117121 return {
118- ' classes' : ' ui-table table-stripe' ,
119- ' na_rep' : '' ,
122+ " classes" : " ui-table table-stripe" ,
123+ " na_rep" : "" ,
120124 }
121125
122126
123127class PandasCSVRenderer (PandasBaseRenderer ):
124128 """
125129 Renders data frame as CSV
126130 """
131+
127132 media_type = "text/csv"
128133 format = "csv"
129134
130135 def get_pandas_kwargs (self , data , renderer_context ):
131- return {' encoding' : self .charset }
136+ return {" encoding" : self .charset }
132137
133138
134139class PandasTextRenderer (PandasCSVRenderer ):
135140 """
136141 Renders data frame as CSV, but uses text/plain as media type
137142 """
143+
138144 media_type = "text/plain"
139145 format = "txt"
140146 function = "to_csv"
@@ -144,52 +150,52 @@ class PandasJSONRenderer(PandasBaseRenderer):
144150 """
145151 Renders data frame as JSON
146152 """
153+
147154 media_type = "application/json"
148155 format = "json"
149156
150157 orient_choices = {
151- ' records-index' , # Unique to DRP
152- ' split' ,
153- ' records' ,
154- ' index' ,
155- ' columns' ,
156- ' values' ,
157- ' table' ,
158+ " records-index" , # Unique to DRP
159+ " split" ,
160+ " records" ,
161+ " index" ,
162+ " columns" ,
163+ " values" ,
164+ " table" ,
158165 }
159- default_orient = ' records-index'
166+ default_orient = " records-index"
160167
161- date_format_choices = {' epoch' , ' iso' }
162- default_date_format = ' iso'
168+ date_format_choices = {" epoch" , " iso" }
169+ default_date_format = " iso"
163170
164171 def get_pandas_kwargs (self , data , renderer_context ):
165- request = renderer_context [' request' ]
172+ request = renderer_context [" request" ]
166173
167- orient = request .GET .get (' orient' , '' )
174+ orient = request .GET .get (" orient" , "" )
168175 if orient not in self .orient_choices :
169176 orient = self .default_orient
170177
171- date_format = request .GET .get (' date_format' , '' )
178+ date_format = request .GET .get (" date_format" , "" )
172179 if date_format not in self .date_format_choices :
173180 date_format = self .default_date_format
174181
175182 return {
176- ' orient' : orient ,
177- ' date_format' : date_format ,
183+ " orient" : orient ,
184+ " date_format" : date_format ,
178185 }
179186
180187 def render_dataframe (self , data , name , * args , ** kwargs ):
181- if kwargs .get (' orient' ) == ' records-index' :
182- kwargs [' orient' ] = ' records'
188+ if kwargs .get (" orient" ) == " records-index" :
189+ kwargs [" orient" ] = " records"
183190 data .reset_index (inplace = True )
184- return super ().render_dataframe (
185- data , name , * args , ** kwargs
186- )
191+ return super ().render_dataframe (data , name , * args , ** kwargs )
187192
188193
189194class PandasExcelRenderer (PandasFileRenderer ):
190195 """
191196 Renders data frame as Excel (.xlsx)
192197 """
198+
193199 media_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" # noqa
194200 format = "xlsx"
195201 function = "to_excel"
@@ -199,6 +205,7 @@ class PandasOldExcelRenderer(PandasFileRenderer):
199205 """
200206 Renders data frame as Excel (.xls)
201207 """
208+
202209 media_type = "application/vnd.ms-excel"
203210 format = "xls"
204211 function = "to_excel"
@@ -208,21 +215,24 @@ class PandasImageRenderer(PandasBaseRenderer):
208215 """
209216 Renders dataframe using built-in plot() function
210217 """
218+
211219 function = "plot"
212- matplotlib_backend = ' Agg'
220+ matplotlib_backend = " Agg"
213221
214222 def init_output (self ):
215223 import matplotlib
224+
216225 matplotlib .use (self .matplotlib_backend )
217226 import matplotlib .pyplot as plt
227+
218228 self .fig = plt .figure ()
219229 self .ax = self .fig .add_subplot (111 )
220230
221231 def get_pandas_args (self , data ):
222232 return []
223233
224234 def get_pandas_kwargs (self , data , renderer_context ):
225- return {'ax' : self .ax }
235+ return {"ax" : self .ax }
226236
227237 def get_output (self ):
228238 data = BytesIO ()
0 commit comments