oodviewer/app.py

90 lines
2.3 KiB
Python

from flask import Flask, g, render_template, Response
import psycopg2
import urllib
import random
import json
from markupsafe import Markup
app = Flask(__name__)
app.config.from_object('config')
@app.before_request
def before_request():
g.db = psycopg2.connect(app.config['DB'])
@app.teardown_request
def teardown_request(exception):
g.db.close()
@app.route('/robots.txt')
def robots():
return """User-agent: *
Disallow: /
"""
@app.template_filter('urlencode')
def urlencode_filter(s):
if type(s) == 'Markup':
s = s.unescape()
s = s.encode('utf8')
s = urllib.quote_plus(s)
return Markup(s)
def _get_terms():
cur = g.db.cursor()
cur.execute("select _term._name, count(_entry._text) from _term left join _entry on _entry._term_oid = _term._oid group by _term._oid order by _term._name")
terms = [(t[0].decode('utf-8'), t[1]) for t in cur.fetchall()]
cur.close()
return terms
def _get_entries(term):
cur = g.db.cursor()
cur.execute('select _entry._text, _entry._added_at, _entry._added_by from _term left join _entry on _entry._term_oid = _term._oid where lower(_term._name) = lower(%s) order by _entry._added_at', [term,])
entries = [(e[0].decode('utf-8'), e[1], e[2]) for e in cur.fetchall()]
cur.close()
return entries
@app.route('/terms')
@app.route('/')
def list_terms():
terms = _get_terms()
return render_template('terms.html', terms=terms)
@app.route('/terms.json')
def list_terms_json():
terms = _get_terms()
return Response(response=json.dumps(terms), mimetype="application/json")
@app.route('/term/<path:term>')
def show_term(term):
entries = _get_entries(term)
return render_template('term.html', entries=entries, term=term)
@app.route('/term.json/<path:term>')
def show_term_json(term):
entries = _get_entries(term)
entries = [{'entry': e[0], 'added': e[1].strftime("%s"), 'author': e[2]} for e in entries]
return Response(response=json.dumps(entries), mimetype="application/json")
@app.route('/randomterm.json/<path:term>')
def show_term_random_json(term):
entries = _get_entries(term)
entries = [{'entry': e[0], 'added': e[1].strftime("%s"), 'author': e[2]} for e in entries]
entry = random.choice(entries)
return Response(response=json.dumps(entry), mimetype="application/json")
if __name__ == "__main__":
app.run(debug=True)