| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | from functools import wrapsfrom flask_login import current_userfrom flask_restful import Resourcefrom werkzeug.exceptions import NotFoundfrom controllers.console.wraps import account_initialization_requiredfrom extensions.ext_database import dbfrom libs.login import login_requiredfrom models import InstalledAppdef installed_app_required(view=None):    def decorator(view):        @wraps(view)        def decorated(*args, **kwargs):            if not kwargs.get("installed_app_id"):                raise ValueError("missing installed_app_id in path parameters")            installed_app_id = kwargs.get("installed_app_id")            installed_app_id = str(installed_app_id)            del kwargs["installed_app_id"]            installed_app = (                db.session.query(InstalledApp)                .filter(                    InstalledApp.id == str(installed_app_id), InstalledApp.tenant_id == current_user.current_tenant_id                )                .first()            )            if installed_app is None:                raise NotFound("Installed app not found")            if not installed_app.app:                db.session.delete(installed_app)                db.session.commit()                raise NotFound("Installed app not found")            return view(installed_app, *args, **kwargs)        return decorated    if view:        return decorator(view)    return decoratorclass InstalledAppResource(Resource):    # must be reversed if there are multiple decorators    method_decorators = [installed_app_required, account_initialization_required, login_required]
 |