Project

General

Profile

1
#!/usr/bin/python
2
#
3
# Flask server, woo!
4
#
5
import json
6

    
7
from flask import Flask, jsonify, request
8
from flask.json import JSONEncoder
9

    
10
from DLIObject import DLIObject, DLIRelation
11
from DLIQueryResolver import QueryResolver
12
from logger import dlilogger
13

    
14

    
15
class MyJSONEncoder(JSONEncoder):
16
    def default(self, obj):
17
        if isinstance(obj, DLIObject):
18
            return obj.__dict__
19
        if isinstance(obj, DLIRelation):
20
            return obj.__dict__
21
        return super(MyJSONEncoder, self).default(obj)
22

    
23

    
24
app = Flask(__name__)
25
app.debug = False
26
app.json_encoder = MyJSONEncoder
27

    
28
host = "http://node0-p-dli.d4science.org:8983/solr/DLIF-index-cleaned_shard1_replica1"
29

    
30

    
31
# q = QueryResolver("http://localhost:8983/solr/DLIF-index-cleaned_shard1_replica1")
32

    
33
class InvalidUsage(Exception):
34
    status_code = 400
35

    
36
    def __init__(self, message, status_code=None, payload=None):
37
        Exception.__init__(self)
38
        self.message = message
39
        if status_code is not None:
40
            self.status_code = status_code
41
        self.payload = payload
42

    
43
    def to_dict(self):
44
        rv = dict(self.payload or ())
45
        rv['message'] = self.message
46
        return rv
47

    
48

    
49
# Routes
50
@app.route('/')
51
def root():
52
    return app.send_static_file('index.html')
53

    
54

    
55
@app.route('/<path:path>')
56
def static_proxy(path):
57
    # send_static_file will guess the correct MIME type
58
    return app.send_static_file(path)
59

    
60

    
61
@app.route('/api/item/<path:identifier>', methods=['post', 'get'])
62
def getItem(identifier):
63
    if identifier:
64
        q = QueryResolver(host)
65
        return jsonify(result=q.get_item(identifier))
66
    else:
67
        raise InvalidUsage('This view is gone', status_code=410)
68

    
69

    
70
@app.route('/api/stats/', methods=['post', 'get'])
71
def stats():
72
    q = QueryResolver(host)
73
    return jsonify(stats=q.get_stats())
74

    
75

    
76
@app.route('/api/stats_detail/', methods=['post', 'get'])
77
def stats_detail():
78
    q = QueryResolver(host)
79
    return jsonify(stats=q.get_stats_detail())
80

    
81

    
82
@app.route('/api/post/', methods=['post', 'get'])
83
def query_post():
84
    action = None
85
    query = None
86
    only_result = False
87
    filter_query = None
88
    start = 0
89
    if 'action' in request.form:
90
        action = request.form['action']
91
    if 'query' in request.form:
92
        query = request.form['query']
93
    if 'only_result' in request.form:
94
        only_result = True
95

    
96
    if 'browse_field' in request.form:
97
        try:
98
            filter_query = json.loads(request.form['browse_field'])
99
        except:
100
            app.logger.error("Unable to parse browse_field, current value %s" % request.form['browse_field'])
101

    
102
    if 'start' in request.form:
103
        start = int(request.form['start'])
104

    
105
    if action == 'query' and query is not None:
106
        q = QueryResolver(host)
107
        result = q.query(q=query, browse_fields=["entitytype", "provenance"], start=start, only_result=only_result,
108
                         filter_query=filter_query)
109
        return jsonify(result=result)
110
    else:
111
        return jsonify(error={'error_code': 'an error occur during query on server'})
112

    
113

    
114
if __name__ == '__main__':
115
    app.logger.addHandler(dlilogger)
116
    app.run(debug=False, host='0.0.0.0', processes=5)
(1-1/8)