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
54
55
56
57
58
59
60
61
62
63
|
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()})
|