7
7
8
8
9
9
RESPONSE_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?"
12
11
)
13
12
14
13
@@ -18,18 +17,17 @@ class PandasBaseRenderer(BaseRenderer):
18
17
Only works with serializers that return DataFrames as their data object.
19
18
Uses a StringIO to capture the output of dataframe.to_[format]()
20
19
"""
20
+
21
21
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
24
24
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 )
26
26
27
27
if not isinstance (data , DataFrame ):
28
- raise Exception (
29
- RESPONSE_ERROR % type (data ).__name__
30
- )
28
+ raise Exception (RESPONSE_ERROR % type (data ).__name__ )
31
29
32
- name = getattr (self , ' function' , "to_%s" % self .format )
30
+ name = getattr (self , " function" , "to_%s" % self .format )
33
31
if not hasattr (data , name ):
34
32
raise Exception ("Data frame is missing %s property!" % name )
35
33
@@ -60,16 +58,17 @@ class PandasFileRenderer(PandasBaseRenderer):
60
58
"""
61
59
Renderer for output formats that absolutely must use a file (i.e. Excel)
62
60
"""
61
+
63
62
def init_output (self ):
64
- file , filename = mkstemp (suffix = '.' + self .format )
63
+ file , filename = mkstemp (suffix = "." + self .format )
65
64
self .filename = filename
66
65
os .close (file )
67
66
68
67
def get_pandas_args (self , data ):
69
68
return [self .filename ]
70
69
71
70
def get_output (self ):
72
- file = open (self .filename , 'rb' )
71
+ file = open (self .filename , "rb" )
73
72
result = file .read ()
74
73
file .close ()
75
74
os .unlink (self .filename )
@@ -82,59 +81,66 @@ class PandasHTMLRenderer(TemplateHTMLRenderer, PandasBaseRenderer):
82
81
83
82
def render (self , data , accepted_media_type = None , renderer_context = None ):
84
83
table = PandasBaseRenderer .render (
85
- self , data , accepted_media_type , renderer_context ,
84
+ self ,
85
+ data ,
86
+ accepted_media_type ,
87
+ renderer_context ,
86
88
)
87
89
88
90
return TemplateHTMLRenderer .render (
89
- self , {'table' : table }, accepted_media_type , renderer_context ,
91
+ self ,
92
+ {"table" : table },
93
+ accepted_media_type ,
94
+ renderer_context ,
90
95
)
91
96
92
97
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" ]
95
100
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" , "" )
99
104
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"
105
109
]
106
110
107
111
chart_type = view .pandas_serializer_class .wq_chart_type
108
112
if chart_type :
109
- data [' wq_chart_type' ] = chart_type
113
+ data [" wq_chart_type" ] = chart_type
110
114
111
- if hasattr (view , ' get_template_context' ):
115
+ if hasattr (view , " get_template_context" ):
112
116
data .update (view .get_template_context (data ))
113
117
114
118
return data
115
119
116
120
def get_pandas_kwargs (self , data , renderer_context ):
117
121
return {
118
- ' classes' : ' ui-table table-stripe' ,
119
- ' na_rep' : '' ,
122
+ " classes" : " ui-table table-stripe" ,
123
+ " na_rep" : "" ,
120
124
}
121
125
122
126
123
127
class PandasCSVRenderer (PandasBaseRenderer ):
124
128
"""
125
129
Renders data frame as CSV
126
130
"""
131
+
127
132
media_type = "text/csv"
128
133
format = "csv"
129
134
130
135
def get_pandas_kwargs (self , data , renderer_context ):
131
- return {' encoding' : self .charset }
136
+ return {" encoding" : self .charset }
132
137
133
138
134
139
class PandasTextRenderer (PandasCSVRenderer ):
135
140
"""
136
141
Renders data frame as CSV, but uses text/plain as media type
137
142
"""
143
+
138
144
media_type = "text/plain"
139
145
format = "txt"
140
146
function = "to_csv"
@@ -144,52 +150,52 @@ class PandasJSONRenderer(PandasBaseRenderer):
144
150
"""
145
151
Renders data frame as JSON
146
152
"""
153
+
147
154
media_type = "application/json"
148
155
format = "json"
149
156
150
157
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" ,
158
165
}
159
- default_orient = ' records-index'
166
+ default_orient = " records-index"
160
167
161
- date_format_choices = {' epoch' , ' iso' }
162
- default_date_format = ' iso'
168
+ date_format_choices = {" epoch" , " iso" }
169
+ default_date_format = " iso"
163
170
164
171
def get_pandas_kwargs (self , data , renderer_context ):
165
- request = renderer_context [' request' ]
172
+ request = renderer_context [" request" ]
166
173
167
- orient = request .GET .get (' orient' , '' )
174
+ orient = request .GET .get (" orient" , "" )
168
175
if orient not in self .orient_choices :
169
176
orient = self .default_orient
170
177
171
- date_format = request .GET .get (' date_format' , '' )
178
+ date_format = request .GET .get (" date_format" , "" )
172
179
if date_format not in self .date_format_choices :
173
180
date_format = self .default_date_format
174
181
175
182
return {
176
- ' orient' : orient ,
177
- ' date_format' : date_format ,
183
+ " orient" : orient ,
184
+ " date_format" : date_format ,
178
185
}
179
186
180
187
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"
183
190
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 )
187
192
188
193
189
194
class PandasExcelRenderer (PandasFileRenderer ):
190
195
"""
191
196
Renders data frame as Excel (.xlsx)
192
197
"""
198
+
193
199
media_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" # noqa
194
200
format = "xlsx"
195
201
function = "to_excel"
@@ -199,6 +205,7 @@ class PandasOldExcelRenderer(PandasFileRenderer):
199
205
"""
200
206
Renders data frame as Excel (.xls)
201
207
"""
208
+
202
209
media_type = "application/vnd.ms-excel"
203
210
format = "xls"
204
211
function = "to_excel"
@@ -208,21 +215,24 @@ class PandasImageRenderer(PandasBaseRenderer):
208
215
"""
209
216
Renders dataframe using built-in plot() function
210
217
"""
218
+
211
219
function = "plot"
212
- matplotlib_backend = ' Agg'
220
+ matplotlib_backend = " Agg"
213
221
214
222
def init_output (self ):
215
223
import matplotlib
224
+
216
225
matplotlib .use (self .matplotlib_backend )
217
226
import matplotlib .pyplot as plt
227
+
218
228
self .fig = plt .figure ()
219
229
self .ax = self .fig .add_subplot (111 )
220
230
221
231
def get_pandas_args (self , data ):
222
232
return []
223
233
224
234
def get_pandas_kwargs (self , data , renderer_context ):
225
- return {'ax' : self .ax }
235
+ return {"ax" : self .ax }
226
236
227
237
def get_output (self ):
228
238
data = BytesIO ()
0 commit comments