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 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()})
|