server/sbin/hypothesis_proxy.py
author ymh <ymh.work@gmail.com>
Fri, 14 Sep 2018 17:57:34 +0200
changeset 0 5f4fcbc80b37
permissions -rw-r--r--
Create new repository to host all dashboard developments This project contains the commons components and all the dashboard instances

'''
Proxy server for getting hyperthesis annotation
'''
import os

import bottle
import requests
from bottle import route, response

app = application = bottle.Bottle()

config_file_path = os.getenv('CONFIG_PATH', "hypothesis_proxy.conf")

app.config.load_config(config_file_path)

# From https://stackoverflow.com/a/17262900
class EnableCors(object):
    name = 'enable_cors'
    api = 2

    def apply(self, fn, context):
        def _enable_cors(*args, **kwargs):
            # set CORS headers
            response.headers['Access-Control-Allow-Origin'] = '*'
            response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, OPTIONS'
            response.headers['Access-Control-Allow-Headers'] = 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token'

            if bottle.request.method != 'OPTIONS':
                # actual request; reply with the actual response
                return fn(*args, **kwargs)

        return _enable_cors

app.install(EnableCors())

@app.route('/annotations')
def query_hypothesis():
    '''
    query hypothesis
    '''

    annotations_json = app.config.get('proxy.annotations_json', None)

    if annotations_json and os.path.isfile(annotations_json):
        import json
        with open(annotations_json, 'r') as f:
            return json.load(f)

    url = app.config.get('proxy.url', 'https://h.projet-episteme.org/api/search')
    headers = {}
    token = app.config.get('proxy.token')
    if token is not None:
        headers["Authorization"] = "Bearer " + token

    params = {}
    for config_tag in ['group', 'user', 'tag', 'limit']:
        config_val = app.config.get('proxy.%s' % config_tag)
        if config_val is not None:
            params[config_tag] = config_val

    offset = 0
    total = -1

    rows = []

    while total < 0 or offset < total:
        #TODO: handle errors
        res = requests.get(url, params=params, headers=headers)
        res_json = res.json()
        total = int(res_json['total'])
        rows += res_json['rows']
        offset = len(rows)
        params['offset'] = offset

    return {
        'rows': rows,
        'total': len(rows)
    }


if __name__ == "__main__":
    app.run(
        host=app.config.get('proxy.host', '127.0.0.1'),
        port=int(app.config.get('proxy.port', 8888))
    )