realms-wiki/reimagine/__init__.py

119 lines
3.1 KiB
Python
Raw Normal View History

2013-09-26 16:51:15 +03:00
import config
import redis
import logging
import rethinkdb as rdb
2013-09-30 17:34:16 +03:00
import os
from flask import Flask, request, render_template, url_for, redirect
2013-09-26 16:51:15 +03:00
from flask.ext.bcrypt import Bcrypt
from flask.ext.login import LoginManager
from flask.ext.assets import Environment
from session import RedisSessionInterface
from wiki import Wiki
2013-10-01 07:10:10 +03:00
from util import to_canonical, remove_ext
2013-09-26 16:51:15 +03:00
app = Flask(__name__)
app.config.update(config.flask)
app.debug = (config.ENV is not 'PROD')
app.secret_key = config.secret_key
2013-09-30 17:34:16 +03:00
app.static_path = os.sep + 'static'
2013-09-26 16:51:15 +03:00
app.session_interface = RedisSessionInterface()
bcrypt = Bcrypt(app)
login_manager = LoginManager()
login_manager.init_app(app)
assets = Environment(app)
assets.url = app.static_url_path
assets.directory = app.static_folder
cache = redis.StrictRedis(host=config.cache['host'], port=config.cache['port'])
2013-09-30 17:34:16 +03:00
conn = rdb.connect(config.db['host'], config.db['port'], db=config.db['dbname'])
2013-09-30 17:34:16 +03:00
if not config.db['dbname'] in rdb.db_list().run(conn) and config.ENV is not 'PROD':
# Create default db and repo
print "Creating DB %s" % config.db['dbname']
rdb.db_create(config.db['dbname']).run(conn)
for tbl in ['sites', 'users', 'pages']:
rdb.table_create(tbl).run(conn)
2013-10-01 07:10:10 +03:00
repo_dir = config.repo['dir']
2013-09-30 17:34:16 +03:00
from models import Site
2013-09-30 17:34:16 +03:00
w = Wiki(repo_dir)
2013-09-26 16:51:15 +03:00
def redirect_url():
return request.args.get('next') or request.referrer or url_for('index')
@app.errorhandler(404)
def page_not_found(e):
return render_template('errors/404.html'), 404
@app.errorhandler(500)
def page_error(e):
logging.exception(e)
return render_template('errors/500.html'), 500
2013-09-26 16:51:15 +03:00
@app.route("/")
def root():
return redirect('/Home')
2013-10-01 07:10:10 +03:00
@app.route("/edit/<name>", methods=['GET', 'POST'])
def edit(name):
data = w.get_page(name)
cname = to_canonical(name)
if request.method == 'POST':
edit_cname = to_canonical(request.form['name'])
if edit_cname != cname:
w.rename_page(cname, edit_cname)
w.write_page(edit_cname, request.form['content'])
return redirect("/" + edit_cname)
2013-09-29 00:33:00 +03:00
else:
2013-10-01 07:10:10 +03:00
if data:
name = remove_ext(data['name'])
content = data['data']
return render_template('page/edit.html', name=name, content=content)
else:
return redirect('/create/'+cname)
2013-10-01 07:10:10 +03:00
@app.route("/delete/<name>", methods=['POST'])
def delete(name):
pass
2013-10-01 07:10:10 +03:00
@app.route("/create/<name>", methods=['GET', 'POST'])
def create(name):
cname = to_canonical(name)
if w.get_page(cname):
# Page exists, edit instead
return redirect("/edit/" + cname)
if request.method == 'POST':
w.write_page(request.form['name'], request.form['content'], create=True)
return redirect("/" + cname)
else:
return render_template('page/create.html', name=cname)
2013-09-26 16:51:15 +03:00
2013-10-01 07:10:10 +03:00
@app.route("/<name>")
def render(name):
cname = to_canonical(name)
if cname != name:
return redirect('/' + cname)
2013-10-01 07:10:10 +03:00
data = w.get_page(cname)
2013-09-29 00:33:00 +03:00
if data:
return render_template('page/page.html', page=data)
else:
2013-10-01 07:10:10 +03:00
return redirect('/create/'+cname)
2013-09-26 16:51:15 +03:00
import ratelimit