diff --git a/docker/Dockerfile b/docker/Dockerfile index 3a5ef95..d57ac7a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -6,7 +6,7 @@ RUN apt-get install -y software-properties-common python-software-properties rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* RUN ln -s /usr/bin/nodejs /usr/bin/node && \ - npm install -g bower + npm install -g bower clean-css RUN useradd -ms /bin/bash wiki @@ -44,4 +44,3 @@ CMD . .venv/bin/activate && \ --bind 0.0.0.0:5000 \ --chdir /home/wiki/realms-wiki \ 'realms:create_app()' - diff --git a/realms/__init__.py b/realms/__init__.py index c8183c7..79b1eeb 100644 --- a/realms/__init__.py +++ b/realms/__init__.py @@ -13,10 +13,10 @@ import httplib import traceback import click from flask import Flask, request, render_template, url_for, redirect, g -from flask.ext.cache import Cache -from flask.ext.login import LoginManager, current_user -from flask.ext.sqlalchemy import SQLAlchemy -from flask.ext.assets import Environment, Bundle +from flask_cache import Cache +from flask_login import LoginManager, current_user +from flask_sqlalchemy import SQLAlchemy +from flask_assets import Environment, Bundle from flask_ldap_login import LDAPLoginManager from functools import update_wrapper from werkzeug.routing import BaseConverter @@ -180,9 +180,7 @@ def create_app(config=None): db.Model = declarative_base(metaclass=HookModelMeta, cls=HookMixin) - for status_code in httplib.responses: - if status_code >= 400: - app.register_error_handler(status_code, error_handler) + app.register_error_handler(HTTPException, error_handler) @app.before_request def init_g(): diff --git a/realms/commands.py b/realms/commands.py index ac228c9..c7ca43c 100644 --- a/realms/commands.py +++ b/realms/commands.py @@ -425,7 +425,7 @@ def clear_cache(): def test(): """ Run tests """ - for mod in [('flask.ext.testing', 'Flask-Testing'), ('nose', 'nose'), ('blinker', 'blinker')]: + for mod in [('flask_testing', 'Flask-Testing'), ('nose', 'nose'), ('blinker', 'blinker')]: if not module_exists(mod[0]): pip.main(['install', mod[1]]) diff --git a/realms/config/__init__.py b/realms/config/__init__.py index 4150a3d..32172f3 100644 --- a/realms/config/__init__.py +++ b/realms/config/__init__.py @@ -139,6 +139,7 @@ class Config(object): DEBUG = False ASSETS_DEBUG = False SQLALCHEMY_ECHO = False + SQLALCHEMY_TRACK_MODIFICATIONS = False MODULES = ['wiki', 'search', 'auth'] diff --git a/realms/lib/hook.py b/realms/lib/hook.py index 0327263..a607b54 100644 --- a/realms/lib/hook.py +++ b/realms/lib/hook.py @@ -1,4 +1,4 @@ -from flask.ext.sqlalchemy import DeclarativeMeta +from flask_sqlalchemy import DeclarativeMeta from functools import wraps diff --git a/realms/lib/test.py b/realms/lib/test.py index dd5b683..465b6f4 100644 --- a/realms/lib/test.py +++ b/realms/lib/test.py @@ -1,7 +1,7 @@ import os import shutil import tempfile -from flask.ext.testing import TestCase +from flask_testing import TestCase from realms.lib.util import random_string from realms import create_app diff --git a/realms/modules/auth/__init__.py b/realms/modules/auth/__init__.py index a33ffda..b8421e7 100644 --- a/realms/modules/auth/__init__.py +++ b/realms/modules/auth/__init__.py @@ -1,6 +1,6 @@ from realms import login_manager from flask import request, flash, redirect -from flask.ext.login import login_url +from flask_login import login_url modules = set() diff --git a/realms/modules/auth/ldap/models.py b/realms/modules/auth/ldap/models.py index c1c7176..1574eb8 100644 --- a/realms/modules/auth/ldap/models.py +++ b/realms/modules/auth/ldap/models.py @@ -1,5 +1,5 @@ from flask import render_template -from flask.ext.login import login_user +from flask_login import login_user from realms import ldap from flask_ldap_login import LDAPLoginForm from ..models import BaseUser diff --git a/realms/modules/auth/ldap/views.py b/realms/modules/auth/ldap/views.py index 7ab82f4..4a16cfa 100644 --- a/realms/modules/auth/ldap/views.py +++ b/realms/modules/auth/ldap/views.py @@ -1,4 +1,4 @@ -from flask import current_app, request, redirect, Blueprint, flash, url_for +from flask import current_app, request, redirect, Blueprint, flash, url_for, session from ..ldap.models import User from flask_ldap_login import LDAPLoginForm @@ -14,6 +14,6 @@ def login(): return redirect(url_for('auth.login')) if User.auth(form.user, request.form['password']): - return redirect(request.args.get("next") or url_for(current_app.config['ROOT_ENDPOINT'])) + return redirect(session.get("next_url") or url_for(current_app.config['ROOT_ENDPOINT'])) else: return redirect(url_for('auth.login')) diff --git a/realms/modules/auth/local/models.py b/realms/modules/auth/local/models.py index 695ce63..9e14ec8 100644 --- a/realms/modules/auth/local/models.py +++ b/realms/modules/auth/local/models.py @@ -1,5 +1,5 @@ from flask import current_app, render_template -from flask.ext.login import logout_user, login_user +from flask_login import logout_user, login_user from realms import login_manager, db from realms.lib.model import Model from ..models import BaseUser diff --git a/realms/modules/auth/local/views.py b/realms/modules/auth/local/views.py index c863d0e..e4b02e6 100644 --- a/realms/modules/auth/local/views.py +++ b/realms/modules/auth/local/views.py @@ -1,4 +1,4 @@ -from flask import current_app, render_template, request, redirect, Blueprint, flash, url_for +from flask import current_app, render_template, request, redirect, Blueprint, flash, url_for, session from realms.modules.auth.local.models import User from realms.modules.auth.local.forms import LoginForm, RegistrationForm @@ -46,6 +46,6 @@ def register(): User.create(request.form['username'], request.form['email'], request.form['password']) User.auth(request.form['email'], request.form['password']) - return redirect(request.args.get("next") or url_for(current_app.config['ROOT_ENDPOINT'])) + return redirect(session.get("next_url") or url_for(current_app.config['ROOT_ENDPOINT'])) return render_template("auth/register.html", form=form) diff --git a/realms/modules/auth/models.py b/realms/modules/auth/models.py index f62b736..f5a0ec7 100644 --- a/realms/modules/auth/models.py +++ b/realms/modules/auth/models.py @@ -1,5 +1,5 @@ from flask import current_app -from flask.ext.login import UserMixin, logout_user, AnonymousUserMixin +from flask_login import UserMixin, logout_user, AnonymousUserMixin from realms import login_manager from realms.lib.util import gravatar_url from itsdangerous import URLSafeSerializer, BadSignature diff --git a/realms/modules/auth/oauth/views.py b/realms/modules/auth/oauth/views.py index 3eb99e4..45222e5 100644 --- a/realms/modules/auth/oauth/views.py +++ b/realms/modules/auth/oauth/views.py @@ -16,7 +16,7 @@ def login(provider): @blueprint.route('/login/oauth//callback') def callback(provider): - next_url = request.args.get('next') or url_for(current_app.config['ROOT_ENDPOINT']) + next_url = session.get('next_url') or url_for(current_app.config['ROOT_ENDPOINT']) try: remote_app = User.get_app(provider) resp = remote_app.authorized_response() diff --git a/realms/templates/auth/ldap/login.html b/realms/modules/auth/templates/auth/ldap/login.html similarity index 100% rename from realms/templates/auth/ldap/login.html rename to realms/modules/auth/templates/auth/ldap/login.html diff --git a/realms/templates/auth/local/login.html b/realms/modules/auth/templates/auth/local/login.html similarity index 100% rename from realms/templates/auth/local/login.html rename to realms/modules/auth/templates/auth/local/login.html diff --git a/realms/templates/auth/login.html b/realms/modules/auth/templates/auth/login.html similarity index 100% rename from realms/templates/auth/login.html rename to realms/modules/auth/templates/auth/login.html diff --git a/realms/templates/auth/register.html b/realms/modules/auth/templates/auth/register.html similarity index 100% rename from realms/templates/auth/register.html rename to realms/modules/auth/templates/auth/register.html diff --git a/realms/templates/auth/settings.html b/realms/modules/auth/templates/auth/settings.html similarity index 100% rename from realms/templates/auth/settings.html rename to realms/modules/auth/templates/auth/settings.html diff --git a/realms/modules/auth/views.py b/realms/modules/auth/views.py index 8ca607f..2589fc6 100644 --- a/realms/modules/auth/views.py +++ b/realms/modules/auth/views.py @@ -1,12 +1,14 @@ -from flask import current_app, render_template, request, redirect, Blueprint, flash, url_for -from flask.ext.login import logout_user +from flask import current_app, render_template, request, redirect, Blueprint, flash, url_for, session +from flask_login import logout_user from realms.modules.auth.models import Auth -blueprint = Blueprint('auth', __name__) +blueprint = Blueprint('auth', __name__, template_folder='templates') @blueprint.route("/login", methods=['GET', 'POST']) def login(): + next_url = request.args.get('next') or url_for(current_app.config['ROOT_ENDPOINT']) + session['next_url'] = next_url return render_template("auth/login.html", forms=Auth.login_forms()) diff --git a/realms/modules/search/models.py b/realms/modules/search/models.py index 5a1a559..2935db7 100644 --- a/realms/modules/search/models.py +++ b/realms/modules/search/models.py @@ -14,7 +14,7 @@ def whoosh(app): def elasticsearch(app): - from flask.ext.elastic import Elastic + from flask_elastic import Elastic fields = app.config.get('ELASTICSEARCH_FIELDS') return ElasticSearch(Elastic(app), fields) diff --git a/realms/templates/search/search.html b/realms/modules/search/templates/search/search.html similarity index 100% rename from realms/templates/search/search.html rename to realms/modules/search/templates/search/search.html diff --git a/realms/modules/search/views.py b/realms/modules/search/views.py index f94d27e..4172039 100644 --- a/realms/modules/search/views.py +++ b/realms/modules/search/views.py @@ -1,10 +1,14 @@ -from flask import render_template, request, Blueprint +from flask import render_template, request, Blueprint, current_app +from flask.ext.login import current_user from realms import search as search_engine -blueprint = Blueprint('search', __name__) +blueprint = Blueprint('search', __name__, template_folder='templates') @blueprint.route('/_search') def search(): + if current_app.config.get('PRIVATE_WIKI') and current_user.is_anonymous(): + return current_app.login_manager.unauthorized() + results = search_engine.wiki(request.args.get('q')) return render_template('search/search.html', results=results) diff --git a/realms/modules/wiki/assets.py b/realms/modules/wiki/assets.py index 8b2162d..8f20b42 100644 --- a/realms/modules/wiki/assets.py +++ b/realms/modules/wiki/assets.py @@ -7,4 +7,4 @@ assets.register('editor.js', 'vendor/ace-builds/src/mode-markdown.js', 'vendor/ace-builds/src/ext-keybinding_menu.js', 'vendor/keymaster/keymaster.js', - 'js/aced.js') + 'wiki/js/aced.js') diff --git a/realms/static/js/aced.js b/realms/modules/wiki/static/js/aced.js similarity index 100% rename from realms/static/js/aced.js rename to realms/modules/wiki/static/js/aced.js diff --git a/realms/static/js/collaboration/firepad.js b/realms/modules/wiki/static/js/collaboration/firepad.js similarity index 100% rename from realms/static/js/collaboration/firepad.js rename to realms/modules/wiki/static/js/collaboration/firepad.js diff --git a/realms/static/js/collaboration/main.js b/realms/modules/wiki/static/js/collaboration/main.js similarity index 100% rename from realms/static/js/collaboration/main.js rename to realms/modules/wiki/static/js/collaboration/main.js diff --git a/realms/static/js/collaboration/togetherjs.js b/realms/modules/wiki/static/js/collaboration/togetherjs.js similarity index 100% rename from realms/static/js/collaboration/togetherjs.js rename to realms/modules/wiki/static/js/collaboration/togetherjs.js diff --git a/realms/static/js/editor.js b/realms/modules/wiki/static/js/editor.js similarity index 100% rename from realms/static/js/editor.js rename to realms/modules/wiki/static/js/editor.js diff --git a/realms/templates/wiki/compare.html b/realms/modules/wiki/templates/wiki/compare.html similarity index 100% rename from realms/templates/wiki/compare.html rename to realms/modules/wiki/templates/wiki/compare.html diff --git a/realms/templates/wiki/edit.html b/realms/modules/wiki/templates/wiki/edit.html similarity index 95% rename from realms/templates/wiki/edit.html rename to realms/modules/wiki/templates/wiki/edit.html index 398cbae..aef6a3b 100644 --- a/realms/templates/wiki/edit.html +++ b/realms/modules/wiki/templates/wiki/edit.html @@ -6,7 +6,7 @@ var PAGE_NAME = '{{ name }}'; - + {% if partials %} + {% endif %} {% if config.get('COLLABORATION') == 'firepad' %} @@ -34,11 +34,11 @@ - + {% endif %} {% if config.get('COLLABORATION') == 'togetherjs' %} - + {% endif %} diff --git a/realms/templates/wiki/history.html b/realms/modules/wiki/templates/wiki/history.html similarity index 100% rename from realms/templates/wiki/history.html rename to realms/modules/wiki/templates/wiki/history.html diff --git a/realms/templates/wiki/index.html b/realms/modules/wiki/templates/wiki/index.html similarity index 100% rename from realms/templates/wiki/index.html rename to realms/modules/wiki/templates/wiki/index.html diff --git a/realms/templates/wiki/page.html b/realms/modules/wiki/templates/wiki/page.html similarity index 100% rename from realms/templates/wiki/page.html rename to realms/modules/wiki/templates/wiki/page.html diff --git a/realms/modules/wiki/views.py b/realms/modules/wiki/views.py index c851741..70c5def 100644 --- a/realms/modules/wiki/views.py +++ b/realms/modules/wiki/views.py @@ -2,16 +2,17 @@ import itertools import sys from datetime import datetime from flask import abort, g, render_template, request, redirect, Blueprint, flash, url_for, current_app -from flask.ext.login import login_required, current_user +from flask_login import login_required, current_user from realms.lib.util import to_canonical, remove_ext, gravatar_url from .models import PageNotFound -blueprint = Blueprint('wiki', __name__) +blueprint = Blueprint('wiki', __name__, template_folder='templates', + static_folder='static', static_url_path='/static/wiki') @blueprint.route("/_commit//") def commit(name, sha): - if current_app.config.get('PRIVATE_WIKI') and current_user.is_anonymous(): + if current_app.config.get('PRIVATE_WIKI') and current_user.is_anonymous: return current_app.login_manager.unauthorized() cname = to_canonical(name) @@ -26,7 +27,7 @@ def commit(name, sha): @blueprint.route(r"/_compare//") def compare(name, fsha, dots, lsha): - if current_app.config.get('PRIVATE_WIKI') and current_user.is_anonymous(): + if current_app.config.get('PRIVATE_WIKI') and current_user.is_anonymous: return current_app.login_manager.unauthorized() diff = g.current_wiki.get_page(name, sha=lsha).compare(fsha) @@ -41,7 +42,7 @@ def revert(): commit = request.form.get('commit') message = request.form.get('message', "Reverting %s" % cname) - if not current_app.config.get('ALLOW_ANON') and current_user.is_anonymous(): + if not current_app.config.get('ALLOW_ANON') and current_user.is_anonymous: return dict(error=True, message="Anonymous posting not allowed"), 403 if cname in current_app.config.get('WIKI_LOCKED_PAGES'): @@ -63,7 +64,7 @@ def revert(): @blueprint.route("/_history/") def history(name): - if current_app.config.get('PRIVATE_WIKI') and current_user.is_anonymous(): + if current_app.config.get('PRIVATE_WIKI') and current_user.is_anonymous: return current_app.login_manager.unauthorized() return render_template('wiki/history.html', name=name) @@ -165,7 +166,7 @@ def _tree_index(items, path=""): @blueprint.route("/_index", defaults={"path": ""}) @blueprint.route("/_index/") def index(path): - if current_app.config.get('PRIVATE_WIKI') and current_user.is_anonymous(): + if current_app.config.get('PRIVATE_WIKI') and current_user.is_anonymous: return current_app.login_manager.unauthorized() items = g.current_wiki.get_index() @@ -186,7 +187,7 @@ def page_write(name): if not cname: return dict(error=True, message="Invalid name") - if not current_app.config.get('ALLOW_ANON') and current_user.is_anonymous(): + if not current_app.config.get('ALLOW_ANON') and current_user.is_anonymous: return dict(error=True, message="Anonymous posting not allowed"), 403 if request.method == 'POST': @@ -229,7 +230,7 @@ def page_write(name): @blueprint.route("/", defaults={'name': 'home'}) @blueprint.route("/") def page(name): - if current_app.config.get('PRIVATE_WIKI') and current_user.is_anonymous(): + if current_app.config.get('PRIVATE_WIKI') and current_user.is_anonymous: return current_app.login_manager.unauthorized() cname = to_canonical(name) diff --git a/realms/templates/layout.html b/realms/templates/layout.html index 4eb1717..fbe097f 100644 --- a/realms/templates/layout.html +++ b/realms/templates/layout.html @@ -58,7 +58,7 @@ - {% if current_user.is_authenticated() %} + {% if current_user.is_authenticated %} {% else %} -
  •  Login
  • +
  •  Login
  • {% if config.REGISTRATION_ENABLED and 'auth.local' in config.MODULES %}
  •  Register
  • {% endif %} @@ -109,7 +109,7 @@ {% endfor %} var User = {}; - User.is_authenticated = {{ current_user.is_authenticated()|tojson }}; + User.is_authenticated = {{ current_user.is_authenticated|tojson }}; {% for attr in ['username', 'email'] %} User.{{ attr }} = {{ current_user[attr]|tojson }}; {% endfor %} diff --git a/setup.py b/setup.py index 50ecce4..3b8ab06 100644 --- a/setup.py +++ b/setup.py @@ -23,14 +23,14 @@ setup(name='realms-wiki', version=__version__, packages=find_packages(), install_requires=[ - 'Flask==0.10.1', - 'Flask-Assets==0.10', + 'Flask==0.11.1', + 'Flask-Assets==0.11', 'Flask-Cache==0.13.1', 'Flask-Elastic==0.2', - 'Flask-Login==0.2.11', - 'Flask-OAuthlib==0.9.1', - 'Flask-SQLAlchemy==2.0', - 'Flask-WTF==0.10.2', + 'Flask-Login==0.3.2', + 'Flask-OAuthlib==0.9.3', + 'Flask-SQLAlchemy==2.1', + 'Flask-WTF==0.12', 'PyYAML==3.11', 'bcrypt==1.0.2', 'beautifulsoup4==4.3.2',