# # hosts dashboard webpage on flask # dashboard.py contains web interface to clue DB + router # from flask import Flask, flash, request, redirect, render_template, send_from_directory import db app = Flask(__name__) # # BIKE APP API # # called by making a post request to hh.acetyl.net/ with expected JSON attached # enable eligibility to receive routes. can be disabled either in app or on dashboard, so before a trip must be re-enabled. # responds with your next route @app.route("/enableTeam", methods=['POST']) # Expected JSON # {"team_name" : "XXXX", str # "longitude" : xx.xxxxxx, float //current team location # "latitude" : xx.xxxxxx, float } # Returns JSON # {"team_name" : "XXXX", str # "status" : "OK"/"ERROR XX", str # "clue_name" : "XXXX", str # "clue_long" : xx.xxxxxx, float # "clue_lat" : xx.xxxxxx, float # "clue_info" : "Xxxx xxx xxx", str # "route" : {...}, JSON } expect something like: http://acetyl.net:5000/route/v1/bike/-71.0553792,42.3688272;-71.0688746,42.3576234 without the waypoints section # ERROR CODES: 1 = missing fields, 2 = invalid field types, 3 = invalid coordinates, 4 = team does not exist, 5 = could not find route, 10 = other/network error def enableTeam(): pass # disable eligibility to receive routes, e.g. if team is done while another is not. can be re-enabled either in app or on dashboard # responds with your next route @app.route("/disableTeam", methods=['POST']) # Expected JSON # {"team_name" : "XXXX", str # "longitude" : xx.xxxxxx, float //current team location # "latitude" : xx.xxxxxx, float } # Returns JSON # {"team_name" : "XXXX", str # "status" : "OK"/"ERROR XX", str } # ERROR CODES: 1 = missing fields, 2 = invalid field types, 3 = invalid coordinates, 4 = team does not exist, 10 = other/network error def disableTeam(): pass # requests a route to the best clue given the team's current coordinates @app.route("/requestRoute", methods=['POST']) # Expected JSON # {"team_name" : "XXXX", str # "longitude" : xx.xxxxxx, float //current team location # "latitude" : xx.xxxxxx, float } # Returns JSON # {"team_name" : "XXXX", str # "status" : "OK"/"ERROR XX", str # "clue_name" : "XXXX", str # "clue_long" : xx.xxxxxx, float # "clue_lat" : xx.xxxxxx, float # "clue_info" : "Xxxx xxx xxx", str # "route" : {...}, JSON } expect something like: http://acetyl.net:5000/route/v1/bike/-71.0553792,42.3688272;-71.0688746,42.3576234 without the waypoints section # ERROR CODES: 1 = missing fields, 2 = invalid field types, 3 = invalid coordinates, 5 = could not find route, 10 = other/network error def requestRoute(): pass # periodically called to update team location in the management dashboard @app.route("/updateTeamLocation", methods=['POST']) # Expected JSON # {"team_name" : "XXXX", str # "longitude" : xx.xxxxxx, float # "latitude" : xx.xxxxxx, float } # Returns JSON # {"team_name" : "XXXX", str # "status" : "OK"/"ERROR XX" } # ERROR CODES: 1 = missing fields, 2 = invalid field types, 3 = invalid coordinates, 10 = other/network error def updateTeamLocation(): pass # # WEB PAGES # # main page # GET = get main page # POST = request clue/bike updates @app.route("/", methods=['GET', 'POST']) def siteIndex(): if request.method == "GET": #clues = db.getClues(); bikes = db.getBikes() return render_template("index.html", homebase=db.getHomeBaseJSON(), clues=db.getCluesJSON(), bikes=[])#, clues=clues, bikes=bikes) else: return if __name__ == "__main__": app.config['SESSION_TYPE'] = 'filesystem' app.secret_key = 'hf8f3sd0zmqpmhss7dr3' # local test app.run(host="127.0.0.1", port=5001, debug=True) # production #app.run(host="96.126.106.128", port=5001, debug=True)