aboutsummaryrefslogtreecommitdiff
path: root/newspipe/web/views/common.py
blob: c286888fad34c70b9d5e37b506dd74c7e49e917f (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
54
55
56
57
58
59
60
61
62
63
64
65
import json
from datetime import datetime
from functools import wraps

from flask import Response, current_app
from flask_login import login_user
from flask_principal import (
    Identity,
    Permission,
    RoleNeed,
    identity_changed,
    session_identity_loader,
)

from newspipe.controllers import UserController
from newspipe.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