2012-06-01 23:15:41 +00:00
|
|
|
from jinja2 import Environment, FileSystemLoader, environmentfilter
|
2012-06-01 21:15:42 +00:00
|
|
|
from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash, send_from_directory, safe_join
|
|
|
|
import os.path
|
2012-06-01 23:15:41 +00:00
|
|
|
import os
|
2012-06-01 21:15:42 +00:00
|
|
|
import fileinput
|
2012-06-01 23:15:41 +00:00
|
|
|
import codecs
|
2012-06-01 21:15:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
TEMPLATE_DIR = os.path.join(os.path.dirname(__file__), 'pages')
|
2012-06-01 23:15:41 +00:00
|
|
|
STATIC_DIR = os.path.join(os.path.dirname(__file__), 'static')
|
|
|
|
|
2012-06-01 21:15:42 +00:00
|
|
|
MEETINGS_DIR = os.path.join(os.path.dirname(__file__), 'meetings')
|
|
|
|
|
2012-06-01 23:15:41 +00:00
|
|
|
app = application = Flask(__name__, template_folder=TEMPLATE_DIR, static_url_path='/_static', static_folder=STATIC_DIR)
|
2012-06-01 21:15:42 +00:00
|
|
|
app.debug = bool(os.environ.get('APP_DEBUG', 'False'))
|
|
|
|
|
2011-10-05 21:35:41 +00:00
|
|
|
|
2012-06-01 23:15:41 +00:00
|
|
|
@app.template_filter('restructuredtext')
|
|
|
|
def restructuredtext(env, value):
|
|
|
|
try:
|
|
|
|
from docutils.core import publish_parts
|
|
|
|
except ImportError:
|
|
|
|
print u"Install docutils!!11"
|
|
|
|
raise
|
|
|
|
parts = publish_parts(source=value, writer_name="html")
|
|
|
|
return parts['html_body']
|
|
|
|
|
2011-10-05 21:35:41 +00:00
|
|
|
|
|
|
|
@app.url_value_preprocessor
|
|
|
|
def pull_lang(endpoint, values):
|
|
|
|
if not values:
|
|
|
|
return
|
|
|
|
g.lang=values.pop('lang', None)
|
|
|
|
|
2012-06-01 23:15:41 +00:00
|
|
|
#@app.url_value_preprocessor
|
|
|
|
#def fix_theme(endpoint, values):
|
|
|
|
# pass
|
|
|
|
|
2012-06-01 21:15:42 +00:00
|
|
|
@app.route('/')
|
2011-10-05 21:35:41 +00:00
|
|
|
def main_index():
|
2012-06-01 21:15:42 +00:00
|
|
|
return redirect(url_for('site_show', lang='en'))
|
2011-10-05 21:35:41 +00:00
|
|
|
|
2012-06-01 21:15:42 +00:00
|
|
|
@app.route('/<string:lang>/site/')
|
|
|
|
@app.route('/<string:lang>/site/<path:page>')
|
2011-10-05 21:35:41 +00:00
|
|
|
def site_show(page=''):
|
|
|
|
# TODO: set content_type
|
2012-06-01 21:15:42 +00:00
|
|
|
pass
|
2011-10-05 21:35:41 +00:00
|
|
|
|
2012-06-01 21:15:42 +00:00
|
|
|
@app.route('/<string:lang>/meetings/')
|
2011-10-05 21:35:41 +00:00
|
|
|
def meetings_index():
|
|
|
|
return render_template('meetings/index.html')
|
|
|
|
|
2012-06-01 21:15:42 +00:00
|
|
|
@app.route('/<string:lang>/meetings/<int:id>')
|
2012-06-01 23:15:41 +00:00
|
|
|
def meetings_show(id, log=False, rst=False):
|
2012-06-01 21:15:42 +00:00
|
|
|
"""
|
|
|
|
Render the meeting X.
|
|
|
|
Either display the raw IRC .log or render as html and include .rst as header if it exists
|
|
|
|
"""
|
|
|
|
# generate file name for the raw meeting file(and header)
|
|
|
|
lname = str(id) + '.log'
|
|
|
|
hname = str(id) + '.rst'
|
|
|
|
lfile = safe_join(MEETINGS_DIR, lname)
|
|
|
|
hfile = safe_join(MEETINGS_DIR, hname)
|
|
|
|
|
|
|
|
# check if meeting file exists and throw error if it does not..
|
|
|
|
if not os.path.exists(lfile):
|
|
|
|
abort(404)
|
|
|
|
|
2012-06-01 23:15:41 +00:00
|
|
|
# if the user just wanted the .log
|
|
|
|
if log:
|
|
|
|
# hmm... maybe replace with something non-render_template like?
|
|
|
|
# return render_template('meetings/show_raw.html', log=log)
|
|
|
|
return send_from_directory(MEETINGS_DIR, lname, mimetype='text/plain')
|
|
|
|
|
2012-06-01 21:15:42 +00:00
|
|
|
log=''
|
|
|
|
header=None
|
2012-06-01 23:15:41 +00:00
|
|
|
|
|
|
|
# try to load header if that makes sense
|
2012-06-01 21:15:42 +00:00
|
|
|
if os.path.exists(hfile):
|
2012-06-01 23:15:41 +00:00
|
|
|
# if the user just wanted the .rst...
|
|
|
|
if rst:
|
|
|
|
return send_from_directory(MEETINGS_DIR, hname, mimetype='text/plain')
|
|
|
|
|
|
|
|
# open the file as utf-8 file
|
|
|
|
with codecs.open(hfile, encoding='utf-8') as fd:
|
2012-06-01 21:15:42 +00:00
|
|
|
header = fd.read()
|
2012-06-01 23:15:41 +00:00
|
|
|
elif rst:
|
|
|
|
abort(404)
|
2012-06-01 21:15:42 +00:00
|
|
|
|
2012-06-01 23:15:41 +00:00
|
|
|
# load log
|
|
|
|
with codecs.open(lfile, encoding='utf-8') as fd:
|
|
|
|
log = fd.read()
|
2012-06-01 21:15:42 +00:00
|
|
|
|
2012-06-01 23:15:41 +00:00
|
|
|
return render_template('meetings/show.html', log=log, header=header, id=id)
|
2012-06-01 21:15:42 +00:00
|
|
|
|
|
|
|
|
2012-06-01 23:15:41 +00:00
|
|
|
@app.route('/<string:lang>/meetings/<int:id>.log')
|
|
|
|
def meetings_show_log(id):
|
|
|
|
return meetings_show(id, log=True)
|
|
|
|
|
|
|
|
@app.route('/<string:lang>/meetings/<int:id>.rst')
|
|
|
|
def meetings_show_rst(id):
|
|
|
|
return meetings_show(id, rst=True)
|
2011-10-05 21:35:41 +00:00
|
|
|
|
2012-06-01 21:15:42 +00:00
|
|
|
@app.route('/<string:lang>/download')
|
2011-10-05 21:35:41 +00:00
|
|
|
def downloads_list():
|
|
|
|
# TODO: implement
|
2012-06-01 21:15:42 +00:00
|
|
|
pass
|
2011-10-05 21:35:41 +00:00
|
|
|
|
2012-06-01 21:15:42 +00:00
|
|
|
@app.route('/<string:lang>/download/<path:file>')
|
2011-10-05 21:35:41 +00:00
|
|
|
def downloads_select(file):
|
|
|
|
# TODO: implement
|
2012-06-01 21:15:42 +00:00
|
|
|
pass
|
2011-10-05 21:35:41 +00:00
|
|
|
|
2012-06-01 21:15:42 +00:00
|
|
|
@app.route('/download/<string:protocol>/any/<path:file>')
|
|
|
|
@app.route('/download/<string:protocol>/<string:mirror>/<path:file>')
|
2011-10-05 21:35:41 +00:00
|
|
|
def downloads_redirect(protocol, file, mirror=None):
|
|
|
|
# TODO: implement
|
2012-06-01 21:15:42 +00:00
|
|
|
pass
|
2011-10-05 21:35:41 +00:00
|
|
|
|
2012-06-01 21:15:42 +00:00
|
|
|
@app.route('/<string:lang>/blog/')
|
|
|
|
@app.route('/<string:lang>/blog/page/<int:page>')
|
2011-10-05 21:35:41 +00:00
|
|
|
def blog_index(page=0):
|
|
|
|
# TODO: implement
|
2012-06-01 21:15:42 +00:00
|
|
|
pass
|
2011-10-05 21:35:41 +00:00
|
|
|
|
2012-06-01 21:15:42 +00:00
|
|
|
@app.route('/<string:lang>/blog/entry/<path:slug>')
|
2011-10-05 21:35:41 +00:00
|
|
|
def blog_entry(slug):
|
|
|
|
# TODO: implement
|
2012-06-01 21:15:42 +00:00
|
|
|
pass
|
2011-10-05 21:35:41 +00:00
|
|
|
|
2012-06-01 21:15:42 +00:00
|
|
|
@app.route('/feed/blog/rss')
|
2011-10-05 21:35:41 +00:00
|
|
|
def blog_rss():
|
|
|
|
# TODO: implement
|
2012-06-01 21:15:42 +00:00
|
|
|
pass
|
2011-10-05 21:35:41 +00:00
|
|
|
|
2012-06-01 21:15:42 +00:00
|
|
|
@app.route('/feed/blog/atom')
|
2011-10-05 21:35:41 +00:00
|
|
|
def blog_atom():
|
|
|
|
# TODO: implement
|
2012-06-01 21:15:42 +00:00
|
|
|
pass
|
2011-10-05 21:35:41 +00:00
|
|
|
|
|
|
|
|
2012-06-01 21:15:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
## legacy stuff:
|
|
|
|
|
|
|
|
@app.route('/meeting<int:id>')
|
|
|
|
@app.route('/meeting<int:id>.html')
|
2011-10-05 21:35:41 +00:00
|
|
|
def legacy_meeting(id):
|
2012-06-01 23:15:41 +00:00
|
|
|
return redirect(url_for('meetings_show', id=id, lang='en'))
|
2011-10-05 21:35:41 +00:00
|
|
|
|
2012-06-01 21:15:42 +00:00
|
|
|
@app.route('/status-<int:year>-<int:month>-<int:day>')
|
|
|
|
@app.route('/status-<int:year>-<int:month>-<int:day>.html')
|
2011-10-05 21:35:41 +00:00
|
|
|
def legacy_status(year, month, day):
|
2012-06-01 23:15:41 +00:00
|
|
|
return redirect(url_for('blog_entry', lang='en', slug=('%s/%s/%s/status' % (year, month, day))))
|
2012-06-01 21:15:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
@app.route('/<string:f>')
|
|
|
|
def legacy_show(f):
|
|
|
|
# TODO: redirect to correct new url
|
|
|
|
pass
|