Skip to content

Commit

Permalink
Adding html output type to biothings
Browse files Browse the repository at this point in the history
  • Loading branch information
Ubuntu committed Nov 28, 2017
1 parent 2a1305b commit 6135183
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 41 deletions.
12 changes: 6 additions & 6 deletions biothings/web/api/es/handlers/base_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,24 @@ def initialize(self, web_settings):
Elasticsearch-specific request handlers go here.'''
super(BaseESRequestHandler, self).initialize(web_settings)

def _return_data_and_track(self, data, ga_event_data={}, rawquery=False, status_code=200):
def _return_data_and_track(self, data, ga_event_data={}, rawquery=False, status_code=200, _format='json'):
''' Small function to return a chunk of data and send a google analytics tracking request.'''
if rawquery:
self.return_raw_query_json(data, status_code=status_code)
self.return_raw_query_json(data, status_code=status_code, _format=_format)
else:
self.return_json(data, status_code=status_code)
self.return_json(data, status_code=status_code, _format=_format)
self.ga_track(event=self.ga_event_object(ga_event_data))
self.self_track(data=self.ga_event_object_ret)
return

def return_raw_query_json(self, query, status_code=200):
def return_raw_query_json(self, query, status_code=200, _format='json'):
'''Return valid JSON if `rawquery` option is selected.
This is necessary as queries can span multiple lines (POST)'''
_ret = query.get('body', {'GET': query.get('bid')})
if is_str(_ret) and len(_ret.split('\n')) > 1:
self.return_json({'body': _ret}, status_code=status_code)
self.return_json({'body': _ret}, status_code=status_code, _format=_format)
else:
self.return_json(_ret, status_code=status_code)
self.return_json(_ret, status_code=status_code, _format=_format)

def _should_sanitize(self, param, kwargs):
return ((param in kwargs) and (param in self.kwarg_settings))
Expand Down
24 changes: 12 additions & 12 deletions biothings/web/api/es/handlers/biothing_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ def get(self, bid=None):

# return raw query, if requested
if options.control_kwargs.rawquery:
self._return_data_and_track(_query.get('body', {'GET': bid}), rawquery=True)
self._return_data_and_track(_query.get('body', {'GET': bid}), rawquery=True, _format=options.control_kwargs.out_format)
return

_query = self._pre_query_GET_hook(options, _query)
Expand All @@ -107,15 +107,15 @@ def get(self, bid=None):
res = _backend.annotation_GET_query(_query)
except Exception:
self.log_exceptions("Error executing query")
self.return_json({'success': False, 'error': self.web_settings.ID_NOT_FOUND_TEMPLATE.format(bid=bid)}, status_code=404)
self.return_json({'success': False, 'error': self.web_settings.ID_NOT_FOUND_TEMPLATE.format(bid=bid)}, status_code=404, _format=options.control_kwargs.out_format)
#raise HTTPError(404)
return

#logging.debug("Raw query result: {}".format(res))

# return raw result if requested
if options.control_kwargs.raw:
self._return_data_and_track(res)
self._return_data_and_track(res, _format=options.control_kwargs.out_format)
return

res = self._pre_transform_GET_hook(options, res)
Expand All @@ -129,19 +129,19 @@ def get(self, bid=None):
res = _result_transformer.clean_annotation_GET_response(res)
except Exception:
self.log_exceptions("Error transforming result")
self.return_json({'success': False, 'error': self.web_settings.ID_NOT_FOUND_TEMPLATE.format(bid=bid)}, status_code=404)
self.return_json({'success': False, 'error': self.web_settings.ID_NOT_FOUND_TEMPLATE.format(bid=bid)}, status_code=404, _format=options.control_kwargs.out_format)
#raise HTTPError(404)
return

# return result
if not res:
self.return_json({'success': False, 'error': self.web_settings.ID_NOT_FOUND_TEMPLATE.format(bid=bid)}, status_code=404)
self.return_json({'success': False, 'error': self.web_settings.ID_NOT_FOUND_TEMPLATE.format(bid=bid)}, status_code=404, _format=options.control_kwargs.out_format)
#raise HTTPError(404)
return

res = self._pre_finish_GET_hook(options, res)

self._return_data_and_track(res)
self._return_data_and_track(res, _format=options.control_kwargs.out_format)

###########################################################################

Expand Down Expand Up @@ -170,7 +170,7 @@ def post(self, ids=None):

if not options.control_kwargs.ids:
self._return_data_and_track({'success': False, 'error': "Missing required parameters."},
ga_event_data={'qsize': 0}, status_code=400)
ga_event_data={'qsize': 0}, status_code=400, _format=options.control_kwargs.out_format)
return

options = self._pre_query_builder_POST_hook(options)
Expand Down Expand Up @@ -202,7 +202,7 @@ def post(self, ids=None):
logging.debug("Request query: {}".format(_query))

if options.control_kwargs.rawquery:
self._return_data_and_track(_query, ga_event_data={'qsize': len(options.control_kwargs.ids)}, rawquery=True)
self._return_data_and_track(_query, ga_event_data={'qsize': len(options.control_kwargs.ids)}, rawquery=True, _format=options.control_kwargs.out_format)
return

_query = self._pre_query_POST_hook(options, _query)
Expand All @@ -216,17 +216,17 @@ def post(self, ids=None):
except TypeError as e:
self.log_exceptions("Error executing annotation POST query")
self._return_data_and_track({'success': False, 'error': 'Error executing query'},
ga_event_data={'qsize': len(options.control_kwargs.ids)}, status_code=400)
ga_event_data={'qsize': len(options.control_kwargs.ids)}, status_code=400, _format=options.control_kwargs.out_format)
return
except BiothingSearchError as e:
self._return_data_and_track({'success': False, 'error': '{0}'.format(e)}, ga_event_data={'qsize': len(options.control_kwargs.ids)}, status_code=400)
self._return_data_and_track({'success': False, 'error': '{0}'.format(e)}, ga_event_data={'qsize': len(options.control_kwargs.ids)}, status_code=400, _format=options.control_kwargs.out_format)
return

#logging.debug("Raw query result: {}".format(res))

# return raw result if requested
if options.control_kwargs.raw:
self._return_data_and_track(res, ga_event_data={'qsize': len(options.control_kwargs.ids)})
self._return_data_and_track(res, ga_event_data={'qsize': len(options.control_kwargs.ids)}, _format=options.control_kwargs.out_format)
return

res = self._pre_transform_POST_hook(options, res)
Expand All @@ -247,4 +247,4 @@ def post(self, ids=None):
res = self._pre_finish_POST_hook(options, res)

# return and track
self._return_data_and_track(res, ga_event_data={'qsize': len(options.control_kwargs.ids)})
self._return_data_and_track(res, ga_event_data={'qsize': len(options.control_kwargs.ids)}, _format=options.control_kwargs.out_format)
6 changes: 3 additions & 3 deletions biothings/web/api/es/handlers/metadata_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def get(self):

# return raw query, if requested
if options.control_kwargs.rawquery:
self.return_json({}, rawquery=True)
self.return_json({}, rawquery=True, _format=options.control_kwargs.out_format)
return

_query = self._pre_query_GET_hook(options, _query)
Expand All @@ -68,7 +68,7 @@ def get(self):

# return raw result if requested
if options.control_kwargs.raw:
self.return_json(res)
self.return_json(res, _format=options.control_kwargs.out_format)
return

res = self._pre_transform_GET_hook(options, res)
Expand All @@ -83,4 +83,4 @@ def get(self):

res = self._pre_finish_GET_hook(options, res)

self.return_json(res)
self.return_json(res, _format=options.control_kwargs.out_format)
26 changes: 13 additions & 13 deletions biothings/web/api/es/handlers/query_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def get(self):

if not options.control_kwargs.q and not options.control_kwargs.scroll_id:
self._return_data_and_track({'success': False, 'error': "Missing required parameters."},
ga_event_data={'total': 0}, status_code=400)
ga_event_data={'total': 0}, status_code=400, _format=options.control_kwargs.out_format)
return

options = self._pre_query_builder_GET_hook(options)
Expand Down Expand Up @@ -109,7 +109,7 @@ def get(self):
try:
res = _backend.scroll(_query)
except BiothingScrollError as e:
self._return_data_and_track({'success': False, 'error': '{}'.format(e)}, ga_event_data={'total': 0}, status_code=400)
self._return_data_and_track({'success': False, 'error': '{}'.format(e)}, ga_event_data={'total': 0}, status_code=400, _format=options.control_kwargs.out_format)
return
#except Exception as e:
# self.log_exceptions("Error getting scroll batch")
Expand All @@ -119,7 +119,7 @@ def get(self):
#logging.debug("Raw scroll query result: {}".format(res))

if options.control_kwargs.raw:
self._return_data_and_track(res, ga_event_data={'total': res.get('total', 0)})
self._return_data_and_track(res, ga_event_data={'total': res.get('total', 0)}, _format=options.control_kwargs.out_format)
return

res = self._pre_scroll_transform_GET_hook(options, res)
Expand All @@ -131,7 +131,7 @@ def get(self):
try:
res = _result_transformer.clean_scroll_response(res)
except ScrollIterationDone as e:
self._return_data_and_track({'success': False, 'error': '{}'.format(e)}, ga_event_data={'total': res.get('total', 0)}, status_code=200)
self._return_data_and_track({'success': False, 'error': '{}'.format(e)}, ga_event_data={'total': res.get('total', 0)}, status_code=200, _format=options.control_kwargs.out_format)
return
#except Exception as e:
# self.log_exceptions("Error transforming scroll batch")
Expand All @@ -152,7 +152,7 @@ def get(self):
# return

if options.control_kwargs.rawquery:
self._return_data_and_track(_query, ga_event_data={'total': 0}, rawquery=True)
self._return_data_and_track(_query, ga_event_data={'total': 0}, rawquery=True, _format=options.control_kwargs.out_format)
return

_query = self._pre_query_GET_hook(options, _query)
Expand All @@ -164,7 +164,7 @@ def get(self):
try:
res = _backend.query_GET_query(_query)
except BiothingSearchError as e:
self._return_data_and_track({'success': False, 'error': '{0}'.format(e)}, ga_event_data={'total': 0}, status_code=400)
self._return_data_and_track({'success': False, 'error': '{0}'.format(e)}, ga_event_data={'total': 0}, status_code=400, _format=options.control_kwargs.out_format)
return
#except Exception as e:
# self.log_exceptions("Error executing query")
Expand All @@ -177,7 +177,7 @@ def get(self):

# return raw result if requested
if options.control_kwargs.raw:
self._return_data_and_track(res, ga_event_data={'total': res.get('total', 0)})
self._return_data_and_track(res, ga_event_data={'total': res.get('total', 0)}, _format=options.control_kwargs.out_format)
return

res = self._pre_transform_GET_hook(options, res)
Expand All @@ -199,7 +199,7 @@ def get(self):
res = self._pre_finish_GET_hook(options, res)

# return and track
self.return_json(res)
self.return_json(res, _format=options.control_kwargs.out_format)
if options.control_kwargs.fetch_all:
self.ga_event_object_ret['action'] = 'fetch_all'
self.ga_track(event=self.ga_event_object({'total': res.get('total', 0)}))
Expand Down Expand Up @@ -231,7 +231,7 @@ def post(self):

if not options.control_kwargs.q:
self._return_data_and_track({'success': False, 'error': "Missing required parameters."},
ga_event_data={'qsize': 0}, status_code=400)
ga_event_data={'qsize': 0}, status_code=400, _format=options.control_kwargs.out_format)
return

options = self._pre_query_builder_POST_hook(options)
Expand Down Expand Up @@ -264,7 +264,7 @@ def post(self):
# return

if options.control_kwargs.rawquery:
self._return_data_and_track(_query, ga_event_data={'qsize': len(options.control_kwargs.q)}, rawquery=True)
self._return_data_and_track(_query, ga_event_data={'qsize': len(options.control_kwargs.q)}, rawquery=True, _format=options.control_kwargs.out_format)
return

_query = self._pre_query_POST_hook(options, _query)
Expand All @@ -276,7 +276,7 @@ def post(self):
try:
res = _backend.query_POST_query(_query)
except BiothingSearchError as e:
self._return_data_and_track({'success': False, 'error': '{0}'.format(e)}, ga_event_data={'qsize': len(options.control_kwargs.q)}, status_code=400)
self._return_data_and_track({'success': False, 'error': '{0}'.format(e)}, ga_event_data={'qsize': len(options.control_kwargs.q)}, status_code=400, _format=options.control_kwargs.out_format)
return
#except Exception as e:
# self.log_exceptions("Error executing POST query")
Expand All @@ -287,7 +287,7 @@ def post(self):

# return raw result if requested
if options.control_kwargs.raw:
self._return_data_and_track(res, ga_event_data={'qsize': len(options.control_kwargs.q)})
self._return_data_and_track(res, ga_event_data={'qsize': len(options.control_kwargs.q)}, _format=options.control_kwargs.out_format)
return

res = self._pre_transform_POST_hook(options, res)
Expand All @@ -309,4 +309,4 @@ def post(self):
res = self._pre_finish_POST_hook(options, res)

# return and track
self._return_data_and_track(res, ga_event_data={'qsize': len(options.control_kwargs.q)})
self._return_data_and_track(res, ga_event_data={'qsize': len(options.control_kwargs.q)}, _format=options.control_kwargs.out_format)
18 changes: 16 additions & 2 deletions biothings/web/api/helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,18 @@ def get_query_params(self):
_args = self._sanitize_params(_args)
return _args

def return_json(self, data, encode=True, indent=None, status_code=200):
def return_html(self, data, status_code=200):
self.set_status(status_code)
if not self.web_settings.DISABLE_CACHING:
#get etag if data is a dictionary and has "etag" attribute.
etag = data.get('etag', None) if isinstance(data, dict) else None
self.set_cacheable(etag=etag)
self.support_cors()
self.set_header("Content-Type", "text/html; charset=utf-8")
self.write(self.web_settings.HTML_OUT_TEMPLATE.format(json.dumps(data)))
return

def return_json(self, data, encode=True, indent=None, status_code=200, _format='json'):
'''Return passed data object as JSON response.
If **jsonp** parameter is set in the request, return a valid
`JSONP <https://en.wikipedia.org/wiki/JSONP>`_ response.
Expand All @@ -163,8 +174,11 @@ def return_json(self, data, encode=True, indent=None, status_code=200):
:param encode: if encode is False, assumes input data is already a JSON encoded string.
:param indent: number of indents per level in JSON string
:param status_code: HTTP status code for response
:param _format: output format - currently either "html" or "json"
'''
# call the recursive function to sort the data by keys and add the json-ld information
if _format == 'html':
self.return_html(data, status_code)
return
indent = indent or 2 # tmp settings
self.set_status(status_code)
if SUPPORT_MSGPACK and self.web_settings.ENABLE_MSGPACK and getattr(self, 'use_msgpack', False):
Expand Down
15 changes: 10 additions & 5 deletions biothings/web/settings/default.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from biothings.web.api.es.query import ESQuery as DefaultESQuery
from biothings.web.api.es.query_builder import ESQueryBuilder as DefaultESQueryBuilder
from biothings.web.api.es.transform import ESResultTransformer as DefaultESResultTransformer
from biothings.web.templates import HTML_OUT_TEMPLATE
import re

# *****************************************************************************
Expand Down Expand Up @@ -94,7 +95,8 @@

# For annotation GET endpoint
ANNOTATION_GET_CONTROL_KWARGS = {'raw': {'default': False, 'type': bool},
'rawquery': {'default': False, 'type': bool}}
'rawquery': {'default': False, 'type': bool},
'out_format': {'default': 'json', 'type': str}}
ANNOTATION_GET_ES_KWARGS = {'_source': {'default': None, 'type': list, 'max': 100, 'alias': ['fields', 'filter']}}
ANNOTATION_GET_ESQB_KWARGS = {}
ANNOTATION_GET_TRANSFORM_KWARGS = {'dotfield': {'default': False, 'type': bool},
Expand All @@ -104,7 +106,8 @@
# For annotation POST endpoint
ANNOTATION_POST_CONTROL_KWARGS = {'raw': {'default': False, 'type': bool},
'rawquery': {'default': False, 'type': bool},
'ids': {'default': None, 'type': list, 'max': 1000}}
'ids': {'default': None, 'type': list, 'max': 1000},
'out_format': {'default': 'json', 'type': str}}
ANNOTATION_POST_ES_KWARGS = {'_source': {'default': None, 'type': list, 'max': 100, 'alias': ['fields', 'filter']}}
ANNOTATION_POST_ESQB_KWARGS = {}
ANNOTATION_POST_TRANSFORM_KWARGS = {'dotfield': {'default': False, 'type': bool},
Expand All @@ -120,7 +123,8 @@
]
},
'scroll_id': {'default': None, 'type': str},
'fetch_all': {'default': False, 'type': bool}}
'fetch_all': {'default': False, 'type': bool},
'out_format': {'default': 'json', 'type': str}}
QUERY_GET_ES_KWARGS = {'_source': {'default': None, 'type': list, 'max': 100, 'alias': ['fields', 'filter']},
'from': {'default': None, 'type': int, 'alias': 'skip'},
'size': {'default': None, 'type': int, 'alias': 'limit'},
Expand All @@ -137,7 +141,8 @@
# For query POST endpoint
QUERY_POST_CONTROL_KWARGS = {'q': {'default': None, 'type': list},
'raw': {'default': False, 'type': bool},
'rawquery': {'default': False, 'type': bool}}
'rawquery': {'default': False, 'type': bool},
'out_format': {'default': 'json', 'type': str}}
QUERY_POST_ES_KWARGS = {'_source': {'default': None, 'type': list, 'max': 100, 'alias': ['fields', 'filter']},
'size': {'default': None, 'type': int}}
QUERY_POST_ESQB_KWARGS = {'scopes': {'default': None, 'type': list, 'max': 100,
Expand All @@ -149,7 +154,7 @@
'_sorted': {'default': True, 'type': bool}}

# For metadata GET endpoint
METADATA_GET_CONTROL_KWARGS = {}
METADATA_GET_CONTROL_KWARGS = {'out_format': {'default': 'json', 'type': str}}
METADATA_GET_ES_KWARGS = {}
METADATA_GET_ESQB_KWARGS = {}
METADATA_GET_TRANSFORM_KWARGS = {'dev': {'default': False, 'type': bool},
Expand Down

0 comments on commit 6135183

Please sign in to comment.