Source code for vulyk.bootstrap._social_login

# -*- coding: utf-8 -*-
"""Module contains stuff related to interoperability with PSA."""

import datetime
from typing import Dict, Optional

import flask_login as login
from flask import g
from social_flask.routes import social_auth
from social_flask.template_filters import backends
from social_flask_mongoengine.models import init_social

from vulyk.models.user import User

__all__ = [
    'init_social_login'
]


[docs]def init_social_login(app, db) -> None: """ Login manager initialisation. :param app: Main application instance :type app: flask.Flask :param db: MongoDB wrapper instance :type db: flask_mongoengine.MongoEngine """ app.register_blueprint(social_auth) init_social(app, db) login_manager = login.LoginManager() login_manager.login_view = 'index' login_manager.login_message = '' login_manager.init_app(app) @login_manager.user_loader def load_user(userid) -> Optional[User]: try: user = User.objects.get(id=userid) if user: user.last_login = datetime.datetime.now() user.save() return user except (TypeError, ValueError, User.DoesNotExist): return None @app.before_request def global_user() -> None: g.user = login.current_user._get_current_object() @app.context_processor def inject_user() -> Dict[str, Optional[User]]: try: return {'user': g.user} except AttributeError: return {'user': None} app.context_processor(backends) app.logger.info('Social login subsystem is initialized.')