2017-01-08 19:22:39 +00:00
from flask import Flask , g , render_template , Response
2014-03-27 15:19:30 +00:00
import psycopg2
2014-03-29 11:53:48 +00:00
import urllib
2017-01-08 19:22:39 +00:00
import random
import json
2014-03-29 11:53:48 +00:00
from markupsafe import Markup
2014-03-27 15:19:30 +00:00
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 ( )
2014-03-27 15:43:56 +00:00
@app.route ( ' /robots.txt ' )
def robots ( ) :
2014-03-27 15:45:16 +00:00
return """ User-agent: *
Disallow : /
"""
2014-03-27 15:43:56 +00:00
2014-03-29 11:53:48 +00:00
@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 )
2017-01-08 19:22:39 +00:00
def _get_terms ( ) :
2014-03-27 15:19:30 +00:00
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 ( )
2017-01-08 19:22:39 +00:00
return terms
2014-03-27 15:19:30 +00:00
2017-01-08 19:22:39 +00:00
def _get_entries ( term ) :
2014-03-27 15:19:30 +00:00
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 ( )
2017-01-08 19:22:39 +00:00
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 )
2014-03-27 15:19:30 +00:00
return render_template ( ' term.html ' , entries = entries , term = term )
2017-01-08 19:22:39 +00:00
@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 " )
2014-03-27 15:19:30 +00:00
if __name__ == " __main__ " :
app . run ( debug = True )