Page Menu
Home
Software Heritage
Search
Configure Global Search
Log In
Files
F9311601
renderers.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
3 KB
Subscribers
None
renderers.py
View Options
# Copyright (C) 2015 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU Affero General Public License version 3, or any later version
# See top-level LICENSE file for more information
import
yaml
from
flask
import
make_response
,
request
from
flask.ext.api
import
renderers
,
parsers
from
flask_api.mediatypes
import
MediaType
from
swh.web.ui
import
utils
class
SWHFilterRenderer
():
"""Base renderer for swh's common behavior.
"""
def
filter_by_fields
(
self
,
data
):
fields
=
request
.
args
.
get
(
'fields'
)
if
fields
:
fields
=
set
(
fields
.
split
(
','
))
data
=
utils
.
filter_field_keys
(
data
,
fields
)
return
data
class
PlainRenderer
(
renderers
.
BaseRenderer
):
"""Renderer for plain/text, do nothing but send the data as is.
"""
media_type
=
'text/plain'
def
render
(
self
,
data
,
media_type
,
**
options
):
return
data
class
YAMLRenderer
(
renderers
.
BaseRenderer
,
SWHFilterRenderer
):
"""Renderer for application/yaml.
Orchestrate from python data structure to yaml.
"""
media_type
=
'application/yaml'
def
render
(
self
,
data
,
media_type
,
**
options
):
data
=
self
.
filter_by_fields
(
data
)
return
yaml
.
dump
(
data
,
encoding
=
self
.
charset
)
class
JSONPEnricher
():
"""JSONP rendering.
Defines a jsonp function that extracts a potential 'callback'
request parameter holding the function name and wraps the data
inside a call to such function
e.g:
GET /blah/foo/bar renders: {'output': 'wrapped'}
GET /blah/foo/bar?callback=fn renders: fn({'output': 'wrapped'})
"""
def
enrich
(
self
,
data
):
jsonp
=
request
.
args
.
get
(
'callback'
)
if
jsonp
:
return
'
%s
(
%s
)'
%
(
jsonp
,
data
)
return
data
class
SWHJSONRenderer
(
renderers
.
JSONRenderer
,
SWHFilterRenderer
,
JSONPEnricher
):
"""Renderer for application/json.
Serializes in json the data and returns it.
Also deals with jsonp. If callback is found in request parameter,
wrap the result as a function with name the value of the parameter
query 'callback'.
"""
def
render
(
self
,
data
,
media_type
,
**
options
):
data
=
self
.
filter_by_fields
(
data
)
res
=
super
()
.
render
(
data
,
media_type
,
**
options
)
return
self
.
enrich
(
res
)
RENDERERS
=
[
'swh.web.ui.renderers.SWHJSONRenderer'
,
'flask.ext.api.renderers.BrowsableAPIRenderer'
,
'flask.ext.api.parsers.URLEncodedParser'
,
'swh.web.ui.renderers.YAMLRenderer'
,
'swh.web.ui.renderers.PlainRenderer'
,
]
RENDERERS_INSTANCE
=
[
SWHJSONRenderer
(),
renderers
.
BrowsableAPIRenderer
(),
parsers
.
URLEncodedParser
(),
YAMLRenderer
(),
]
RENDERERS_BY_TYPE
=
{
r
.
media_type
:
r
for
r
in
RENDERERS_INSTANCE
}
def
error_response
(
default_error_msg
,
error_code
,
error
):
"""Private function to create a custom error response.
"""
# if nothing is requested by client, use json
default_application_type
=
'application/json'
accept_type
=
request
.
headers
.
get
(
'Accept'
,
default_application_type
)
renderer
=
RENDERERS_BY_TYPE
.
get
(
accept_type
,
RENDERERS_BY_TYPE
[
default_application_type
])
# for edge cases, use the elected renderer's media type
accept_type
=
renderer
.
media_type
response
=
make_response
(
default_error_msg
,
error_code
)
response
.
headers
[
'Content-Type'
]
=
accept_type
response
.
data
=
renderer
.
render
({
"error"
:
str
(
error
)},
media_type
=
MediaType
(
accept_type
),
status
=
error_code
,
headers
=
{
'Content-Type'
:
accept_type
})
return
response
File Metadata
Details
Attached
Mime Type
text/x-python
Expires
Thu, Jul 3, 10:23 AM (2 w, 4 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3451592
Attached To
rDWAPPS Web applications
Event Timeline
Log In to Comment