Skip to content
This repository has been archived by the owner on Nov 10, 2017. It is now read-only.

Commit

Permalink
handle database errors; pep8 improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
Chris AtLee committed Feb 2, 2013
1 parent cfcbaf7 commit 6d3cb3e
Showing 1 changed file with 38 additions and 12 deletions.
50 changes: 38 additions & 12 deletions treestatus/app.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,29 @@
import os, site
my_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
site.addsitedir(my_dir)
site.addsitedir(os.path.join(my_dir, "vendor/lib/python"))

import os
import site
import time
from datetime import datetime
import urllib
from binascii import b2a_base64

my_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
site.addsitedir(my_dir)
site.addsitedir(os.path.join(my_dir, "vendor/lib/python"))

from simplejson import dumps, loads
import memcache
from repoze.who.config import make_middleware_with_config
import sqlalchemy as sa

import treestatus.model as model

import flask
from flask import Flask, request, make_response, render_template, jsonify

import logging
log = logging.getLogger(__name__)

class Status:

class Status:
memcachePrefix = 'treestatus'
defaultLogCache = 100

Expand Down Expand Up @@ -270,30 +275,33 @@ def set_motd(self, who, tree, message):

status = Status()

import flask
from flask import Flask, request, make_response, render_template, jsonify
app = Flask(__name__)


@app.template_filter('urlencode')
def urlencode(s):
return urllib.quote(s, '')


def urldecode(s):
return urllib.unquote(s)


def is_json():
if 'application/json' in request.headers.get('Accept', ''):
return True
if request.args.get('format') == 'json':
return True
return False


def wrap_json_headers(data):
response = jsonify(data)
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Cache-Control'] = 'no-cache'
return response


def validate_write_request():
who = request.environ.get('REMOTE_USER')
if who is None:
Expand All @@ -313,11 +321,13 @@ def validate_write_request():
log.info("User isn't allowed to do that")
flask.abort(403)


def get_token():
if 'REMOTE_USER' in request.environ:
return status.get_token(request.environ['REMOTE_USER'])
return ''


@app.route('/')
def index():
if is_json():
Expand All @@ -340,12 +350,14 @@ def index():
resp.headers['Cache-Control'] = 'no-cache'
return resp


@app.route('/help')
def help():
resp = make_response(render_template('help.html'))
resp.headers['Cache-Control'] = 'max-age=600'
return resp


@app.route('/login')
def login():
who = request.environ.get('REMOTE_USER')
Expand All @@ -372,6 +384,7 @@ def login():
resp.headers['X-Treestatus-Token'] = token
return resp


@app.route('/logout')
def logout():
if 'REMOTE_USER' in request.environ:
Expand All @@ -387,6 +400,7 @@ def logout():
flask.abort(401)
return flask.redirect('/?nc', 303)


@app.route('/<path:tree>', methods=['GET'])
def get_tree(tree):
tree = urldecode(tree)
Expand All @@ -398,13 +412,14 @@ def get_tree(tree):
return wrap_json_headers(t)

resp = make_response(render_template('tree.html', tree=t, logs=status.get_logs(tree),
loads=loads, token=get_token()))
loads=loads, token=get_token()))
resp.headers['Cache-Control'] = 'max-age=30'
resp.headers['Vary'] = 'Cookie'
if '?nc' in request.url:
resp.headers['Cache-Control'] = 'no-cache'
return resp


@app.route('/<path:tree>/logs', methods=['GET'])
def get_logs(tree):
t = status.get_tree(tree)
Expand All @@ -424,6 +439,7 @@ def get_logs(tree):
resp.headers['Cache-Control'] = 'max-age=30'
return resp


@app.route('/users', methods=['GET'])
def show_users():
if 'REMOTE_USER' not in request.environ:
Expand All @@ -443,6 +459,7 @@ def show_users():
resp.headers['Cache-Control'] = 'no-cache'
return resp


@app.route('/users', methods=['POST'])
def modify_users():
if 'REMOTE_USER' not in request.environ:
Expand Down Expand Up @@ -515,6 +532,7 @@ def modify_users():

return flask.redirect('/users?nc', 303)


@app.route('/', methods=['POST'])
def add_or_set_trees():
validate_write_request()
Expand Down Expand Up @@ -544,6 +562,7 @@ def add_or_set_trees():
status.add_tree(request.environ['REMOTE_USER'], request.form['newtree'])
return flask.redirect('/?nc', 303)


@app.route('/<path:tree>', methods=['POST'])
def update_tree(tree):
validate_write_request()
Expand All @@ -568,6 +587,7 @@ def update_tree(tree):

return flask.redirect("/%s?nc" % tree, 303)


@app.route('/<path:tree>', methods=['DELETE'])
def delete_tree(tree):
validate_write_request()
Expand All @@ -585,23 +605,29 @@ def delete_tree(tree):
status.del_tree(request.environ['REMOTE_USER'], tree, request.form['reason'])
return flask.redirect("/" + tree, 303)


@app.before_request
def create_session():
request.session = model.Session()

import os, time
_started = time.asctime()


@app.after_request
def close_session(response):
request.session.close()
response.headers['x-pid'] = str(os.getpid())
response.headers['x-started'] = str(_started)
return response

@app.errorhandler(sa.exc.InvalidRequestError)

@app.errorhandler(sa.exc.SQLAlchemyError)
def handle_db_error(e):
# Try again?
log.warning("Unhandled DB error; trying request again", exc_info=True)
request.session.close()
raise e
return app.dispatch_request()


def wsgiapp(config, **kwargs):
config.update(kwargs)
Expand Down

0 comments on commit 6d3cb3e

Please sign in to comment.