Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
80 lines (62 sloc) 2.2 KB
import flask
from flask.ext.cache import Cache
from siren import util, crime_tracker
from siren.decorators import jsonp
app = flask.Flask(__name__)
app.config.from_envvar('SIREN_SETTINGS', silent=True)
cache = Cache(app)
crime_db = crime_tracker.PortlandCrimeTracker()
# Save profiling data if running in debug mode.
if app.config['DEBUG']:
from werkzeug.contrib.profiler import ProfilerMiddleware
f = open('/tmp/profiler.log', 'a')
app.wsgi_app = ProfilerMiddleware(app.wsgi_app, f)
def get_point(latitude, longitude):
Return ``latitude`` and ``longitude`` coerced to floats.
Fail the request with a 400 status if one or both are not coercible.
latitude = float(latitude)
longitude = float(longitude)
except ValueError:
return latitude, longitude
def get_crimes(latitude, longitude):
Return all crimes found within 1/2 mile of ``latitude`` and ``longitude``.
point = get_point(latitude, longitude)
ignore = ['callback', '_']
filters = {k: v for k, v in flask.request.args.items() if k not in ignore}
return crime_db.get_crimes_nearby(point, filters)
def crime_stats(latitude, longitude):
Return statistics -- right now, only sums by category -- about crimes
within 1/2 mile of ``latitude`` and ``longitude``.
nearby_crimes, errors = get_crimes(latitude, longitude)
stats = crime_db.get_stats_for_crimes(nearby_crimes)
data = {'stats': stats}
if errors:
data['errors'] = errors
return flask.jsonify(result=data)
def crimes(latitude, longitude):
Return raw crime data for all crimes within 1/2 mile of ``latitude`` and
crimes, errors = get_crimes(latitude, longitude)
# JSON requires that object keys be strings, so convert tuples to strings
# like "37.785834,-122.406417"
crimes = [dict(crime=c, point=','.join(str(p))) for p, c in crimes.items()]
data = {'crimes': crimes}
if errors:
data['errors'] = errors
return flask.jsonify(result=data)