You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
3.7 KiB
132 lines
3.7 KiB
from flask import Flask, make_response, request, current_app |
|
from simplejson import dumps |
|
from pymongo import MongoClient |
|
import datetime |
|
import dateutil.parser |
|
import bson |
|
|
|
from datetime import timedelta |
|
from functools import update_wrapper |
|
|
|
|
|
def crossdomain(origin=None, methods=None, headers=None, |
|
max_age=21600, attach_to_all=True, |
|
automatic_options=True): |
|
if methods is not None: |
|
methods = ', '.join(sorted(x.upper() for x in methods)) |
|
if headers is not None and not isinstance(headers, basestring): |
|
headers = ', '.join(x.upper() for x in headers) |
|
if not isinstance(origin, basestring): |
|
origin = ', '.join(origin) |
|
if isinstance(max_age, timedelta): |
|
max_age = max_age.total_seconds() |
|
|
|
def get_methods(): |
|
if methods is not None: |
|
return methods |
|
|
|
options_resp = current_app.make_default_options_response() |
|
return options_resp.headers['allow'] |
|
|
|
def decorator(f): |
|
def wrapped_function(*args, **kwargs): |
|
if automatic_options and request.method == 'OPTIONS': |
|
resp = current_app.make_default_options_response() |
|
else: |
|
resp = make_response(f(*args, **kwargs)) |
|
if not attach_to_all and request.method != 'OPTIONS': |
|
return resp |
|
|
|
h = resp.headers |
|
|
|
h['Access-Control-Allow-Origin'] = origin |
|
h['Access-Control-Allow-Methods'] = get_methods() |
|
h['Access-Control-Max-Age'] = str(max_age) |
|
if headers is not None: |
|
h['Access-Control-Allow-Headers'] = headers |
|
return resp |
|
|
|
f.provide_automatic_options = False |
|
return update_wrapper(wrapped_function, f) |
|
return decorator |
|
|
|
|
|
app = Flask(__name__) |
|
client = MongoClient(**{'host': 'localhost', 'port': 27017}) |
|
db = client.showtimes |
|
|
|
miscObjHandler = lambda obj: ( |
|
obj.isoformat() if isinstance(obj, datetime.datetime) |
|
or isinstance(obj, datetime.date) |
|
else str(obj) if isinstance(obj, bson.objectid.ObjectId) else None) |
|
|
|
|
|
@app.route('/flask/') |
|
@crossdomain(origin='*') |
|
def hello_world(): |
|
return 'This comes from Flask ^_^' |
|
|
|
|
|
@app.route('/groups/', methods=['GET']) |
|
@crossdomain(origin='*') |
|
def groups(): |
|
known_groups = ['sf', 'major'] |
|
json_dict = { |
|
'meta': { |
|
'total_count': len(known_groups) |
|
}, |
|
'objects': known_groups |
|
} |
|
r = make_response(dumps(json_dict)) |
|
r.mimetype = 'application/json' |
|
return r |
|
|
|
|
|
@app.route('/theaters/', methods=['GET']) |
|
@app.route('/theaters/<group>/', methods=['GET']) |
|
@crossdomain(origin='*') |
|
def list_theaters(group=None): |
|
if not group: |
|
result = db.theater.find() |
|
else: |
|
result = db.theater.find({'group': group}) |
|
items = [i for i in result] |
|
json_dict = { |
|
'meta': { |
|
'total_count': len(items) |
|
}, |
|
'objects': items |
|
} |
|
r = make_response(dumps(json_dict, default=miscObjHandler)) |
|
r.mimetype = 'application/json' |
|
return r |
|
|
|
|
|
@app.route('/showtimes/<group>/', methods=['GET']) |
|
@app.route('/showtimes/<group>/<code>/', methods=['GET']) |
|
@crossdomain(origin='*') |
|
def list_showtimes(group=None, code=None): |
|
day = request.args.get('d', '') |
|
q = {} |
|
if day: |
|
q['date'] = dateutil.parser.parse(day) |
|
if group: |
|
q['group'] = group |
|
if code: |
|
q['theater'] = code |
|
|
|
result = db.showtimes.find(q) |
|
items = [i for i in result] |
|
json_dict = { |
|
'meta': { |
|
'total_count': len(items) |
|
}, |
|
'objects': items |
|
} |
|
r = make_response(dumps(json_dict, default=miscObjHandler)) |
|
r.mimetype = 'application/json' |
|
return r |
|
|
|
|
|
if __name__ == '__main__': |
|
app.run(debug=True)
|
|
|