aboutsummaryrefslogtreecommitdiff
path: root/src/web/views/common.py
blob: f9613c0103638cca8f332ae70cccafafb1497954 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import json
from functools import wraps
from datetime import datetime
from flask import current_app, Response
from flask_login import login_user
from flask_principal import (Identity, Permission, RoleNeed,
                                 session_identity_loader, identity_changed)
from web.controllers import UserController
from web.lib.utils import default_handler

admin_role = RoleNeed('admin')
api_role = RoleNeed('api')

admin_permission = Permission(admin_role)
api_permission = Permission(api_role)


def scoped_default_handler():
    if admin_permission.can():
        role = 'admin'
    elif api_permission.can():
        role = 'api'
    else:
        role = 'user'

    @wraps(default_handler)
    def wrapper(obj):
        return default_handler(obj, role=role)
    return wrapper


def jsonify(func):
    """Will cast results of func as a result, and try to extract
    a status_code for the Response object"""
    @wraps(func)
    def wrapper(*args, **kwargs):
        status_code = 200
        result = func(*args, **kwargs)
        if isinstance(result, Response):
            return result
        elif isinstance(result, tuple):
            result, status_code = result
        return Response(json.dumps(result, default=scoped_default_handler()),
                        mimetype='application/json', status=status_code)
    return wrapper


def login_user_bundle(user):
    login_user(user)
    identity_changed.send(current_app, identity=Identity(user.id))
    session_identity_loader()
    UserController(user.id).update(
                {'id': user.id}, {'last_seen': datetime.utcnow()})
bgstack15