canaille-globuzma/canaille/app/session.py

50 lines
1.2 KiB
Python

from flask import current_app
from flask import g
from flask import session
from canaille.app import models
def current_user():
if "user" in g:
return g.user
for user_id in session.get("user_id", [])[::-1]:
user = current_app.backend.instance.get(models.User, user_id)
if user and (
not current_app.backend.has_account_lockability() or not user.locked
):
g.user = user
return g.user
session["user_id"].remove(user_id)
if "user_id" in session and not session["user_id"]:
del session["user_id"]
return None
def login_user(user):
"""Open a session for the user."""
g.user = user
try:
previous = (
session["user_id"]
if isinstance(session["user_id"], list)
else [session["user_id"]]
)
session["user_id"] = previous + [user.id]
except KeyError:
session["user_id"] = [user.id]
def logout_user():
"""Close the user session."""
try:
session["user_id"].pop()
del g.user
if not session["user_id"]:
del session["user_id"]
except (IndexError, KeyError):
pass