app.py 4.1 KB
Newer Older
1
from flask import Flask, redirect, jsonify, abort, request, url_for, make_response
Dylan Jones's avatar
no slug    
Dylan Jones committed
2

3
from where.model import with_session, Point, Category, Field
Dylan Jones's avatar
Dylan Jones committed
4
from where.model.field_types import FieldType
Dylan Jones's avatar
app.py    
Dylan Jones committed
5
6
7

app = Flask(__name__)

8

9
10
11
12
13
14
15
16
def create_resource(session, model_cls, data, get_function):
    model = model_cls(**data)
    session.add(model)
    session.commit()
    response = make_response(jsonify(model.as_json()), 201)
    response.headers['Location'] = url_for(get_function, id=model.id)
    return response

17

18
19
20
21
22
23
24
def search_resource(session, model_cls, data):
    query = session.query(model_cls).filter_by(**data)
    results = list(map(lambda m: m.as_json(), query.limit(100).all()))
    response = make_response(jsonify(results), 200)
    return response


Dylan Jones's avatar
app.py    
Dylan Jones committed
25
26
@app.route('/')
def index():
Dylan Jones's avatar
no slug    
Dylan Jones committed
27
28
29
30
31
32
33
34
35
36
37
38
    return """
<head>
</head>
<body>
    <h1>W H E R E</h1>
    <p>This is the WHERE project.</p>
    <a href='/test_data'>Click here to nuke the database and make it all be test data.</a>
</body>
    """


@app.route('/test_data')
39
40
41
42
43
44
45
46
47
48
49
@with_session
def test_data(session):
    session.query(Point).delete()
    session.query(Field).delete()
    session.query(Category).delete()
    # Water Fountain, the class.
    wf = Category()
    wf.name = "Water Fountain"
    wf.icon = "https://karel.pw/water.png"
    session.add(wf)
    session.commit()
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
    # Building
    bd = Category()
    bd.name = "Building"
    bd.icon = "https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/basket-building-news-photo-1572015168.jpg?resize=980:*"
    session.add(bd)
    session.commit()
    # Radius (Really the simplest metric we can have for building size)
    rd = Field()
    rd.name = "Radius"
    rd.slug = "radius"
    rd.type = FieldType.FLOAT
    rd.category_id = bd.id
    session.add(rd)
    session.commit()

65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
    # coldness
    cd = Field()
    cd.name = "Coldness"
    cd.slug = "coldness"
    cd.type = FieldType.RATING
    cd.category_id = wf.id
    # filler
    fl = Field()
    fl.slug = "bottle_filler"
    fl.name = "Has Bottle Filler"
    fl.type = FieldType.BOOLEAN
    fl.category_id = wf.id
    session.add(cd)
    session.add(fl)
    session.commit()
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

    # The johnson center
    jc = Point()
    jc.category = bd
    jc.name = "Johnson Center"
    jc.lat = 38
    jc.lon = -77
    jc.parent = None
    jc.attributes = {
        "radius": {
            "value": 2.0
        }
    }
    session.add(jc)

    # A water fountain inside the JC
96
97
98
99
100
101
    fn = Point()
    fn.name = None
    fn.lat = 38.829791
    fn.lon = -77.307043
    # fn.category_id = wf.id
    fn.category = wf
102
    fn.parent = jc
103
104
105
106
107
108
109
    fn.attributes = {
        "coldness": {
            "num_reviews": 32,
            "average_rating": 0.5
        },
        "bottle_filler": {
            "value": True
Dylan Jones's avatar
Dylan Jones committed
110
        }
111
    }
112

113
114
115
    session.add(fn)
    session.commit()
    return redirect('/')
Dylan Jones's avatar
Dylan Jones committed
116
117
118


@app.route('/category/<id>')
119
120
121
122
123
124
125
@with_session
def get_category(session, id):
    result = session.query(Category).filter_by(id=id).first()
    if result:
        return jsonify(result.as_json())
    else:
        abort(404)
Dylan Jones's avatar
Dylan Jones committed
126
127


128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
@app.route('/category/<id>/children')
@with_session
def get_category_children(session, id):
    data = dict(request.args)
    data['parent_id'] = id
    return search_resource(session, Point, data)


@app.route('/point', methods=['GET', 'POST'])
@with_session
def handle_point(session):
    if request.method == 'GET':
        return search_resource(session, Point, dict(request.args))
    elif request.method == 'POST':
        data = request.get_json()
        data['category'] = session.query(Category).get(data['category'])
        data['parent_id'] = data.pop('parent', None)

        return create_resource(session, Point, data, 'get_point')
   

@app.route('/point/<id>', methods=['GET', 'PUT', 'DELETE'])
150
151
@with_session
def get_point(session, id):
152
    result = session.query(Point).get(id)
153
154
155
156
    if result:
        return jsonify(result.as_json())
    else:
        abort(404)
Dylan Jones's avatar
app.py    
Dylan Jones committed
157

Zach Perkins's avatar
Zach Perkins committed
158

159
@app.route('/point/<id>/children', methods=['GET'])
Zach Perkins's avatar
Zach Perkins committed
160
@with_session
161
162
163
164
def get_point_children(session, id):
    data = dict(request.args)
    data['parent_id'] = id
    return search_resource(session, Point, data)
Zach Perkins's avatar
Zach Perkins committed
165

Dylan Jones's avatar
app.py    
Dylan Jones committed
166
if __name__ == '__main__':
167
    app.run()