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

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

app = Flask(__name__)

8

Dylan Jones's avatar
app.py  
Dylan Jones committed
9 10
@app.route('/')
def index():
Dylan Jones's avatar
no slug  
Dylan Jones committed
11 12 13 14 15 16 17 18 19 20 21 22
    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')
23 24 25 26 27 28 29 30 31 32 33 34
@with_session
def test_data(session):
    # session = 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()
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
    # 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()

50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
    # 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()
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80

    # 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
81 82 83 84 85 86
    fn = Point()
    fn.name = None
    fn.lat = 38.829791
    fn.lon = -77.307043
    # fn.category_id = wf.id
    fn.category = wf
87
    fn.parent = jc
88 89 90 91 92 93 94
    fn.attributes = {
        "coldness": {
            "num_reviews": 32,
            "average_rating": 0.5
        },
        "bottle_filler": {
            "value": True
Dylan Jones's avatar
Dylan Jones committed
95
        }
96
    }
97 98
    

99 100 101
    session.add(fn)
    session.commit()
    return redirect('/')
Dylan Jones's avatar
Dylan Jones committed
102 103 104


@app.route('/category/<id>')
105 106 107 108 109 110 111
@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
112 113 114


@app.route('/point/<id>')
115 116 117 118 119 120 121
@with_session
def get_point(session, id):
    result = session.query(Point).filter_by(id=id).first()
    if result:
        return jsonify(result.as_json())
    else:
        abort(404)
Dylan Jones's avatar
app.py  
Dylan Jones committed
122

123
@app.route('/query_points', methods=['POST'])
124
@with_session
125 126 127 128 129 130 131 132 133 134 135 136 137
def query_points(session):
    data = request.get_json()
    q = session.query(Point)
    
    if 'category' in data:
        q = q.filter(Point.category_id == data['category'])
    
    if 'parent' in data:
        q = q.filter(Point.parent_id == data['parent'])

    return jsonify(list(map(lambda p: p.as_json(), q.all())))
    

138
        
Dylan Jones's avatar
app.py  
Dylan Jones committed
139 140 141

if __name__ == '__main__':
    app.run()