diff options
Diffstat (limited to 'app/views/utils.py')
-rw-r--r-- | app/views/utils.py | 64 |
1 files changed, 63 insertions, 1 deletions
diff --git a/app/views/utils.py b/app/views/utils.py index 488e32e..f22e874 100644 --- a/app/views/utils.py +++ b/app/views/utils.py @@ -1,4 +1,7 @@ -from flask import request, flash +from flask import request, flash, abort +from flask_user import * +from flask_login import login_user, logout_user +from app.models import * from app import app import random, string, os @@ -29,3 +32,62 @@ def doFileUpload(file, allowedExtensions, fileTypeName): filename = randomString(10) + "." + ext file.save(os.path.join(app.config["UPLOAD_FOLDER"], filename)) return "/uploads/" + filename + + +def _do_login_user(user, remember_me=False): + def _call_or_get(v): + if callable(v): + return v() + else: + return v + + # User must have been authenticated + if not user: + return False + + user.active = True + if not user.rank.atLeast(UserRank.NEW_MEMBER): + user.rank = UserRank.NEW_MEMBER + + db.session.commit() + + # Check if user account has been disabled + if not _call_or_get(user.is_active): + flash("Your account has not been enabled.", "error") + return False + + # Check if user has a confirmed email address + user_manager = current_app.user_manager + if user_manager.enable_email and user_manager.enable_confirm_email \ + and not current_app.user_manager.enable_login_without_confirm_email \ + and not user.has_confirmed_email(): + url = url_for("user.resend_confirm_email") + flash("Your email address has not yet been confirmed", "error") + return False + + # Use Flask-Login to sign in user + login_user(user, remember=remember_me) + signals.user_logged_in.send(current_app._get_current_object(), user=user) + + flash("You have signed in successfully.", "success") + + return True + +def loginUser(user): + user_mixin = None + if user_manager.enable_username: + user_mixin = user_manager.find_user_by_username(user.username) + + return _do_login_user(user_mixin, False) + +def rank_required(rank): + def decorator(f): + @wraps(f) + def decorated_function(*args, **kwargs): + if not current_user.rank.atLeast(rank): + abort(403) + + return f(*args, **kwargs) + + return decorated_function + return decorator |