| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | # -*- coding:utf-8 -*-from functools import wrapsfrom flask import current_app, abortfrom flask_login import current_userfrom controllers.console.workspace.error import AccountNotInitializedErrorfrom services.feature_service import FeatureServicedef account_initialization_required(view):    @wraps(view)    def decorated(*args, **kwargs):        # check account initialization        account = current_user        if account.status == 'uninitialized':            raise AccountNotInitializedError()        return view(*args, **kwargs)    return decorateddef only_edition_cloud(view):    @wraps(view)    def decorated(*args, **kwargs):        if current_app.config['EDITION'] != 'CLOUD':            abort(404)        return view(*args, **kwargs)    return decorateddef only_edition_self_hosted(view):    @wraps(view)    def decorated(*args, **kwargs):        if current_app.config['EDITION'] != 'SELF_HOSTED':            abort(404)        return view(*args, **kwargs)    return decorateddef cloud_edition_billing_resource_check(resource: str,                                         error_msg: str = "You have reached the limit of your subscription."):    def interceptor(view):        @wraps(view)        def decorated(*args, **kwargs):            features = FeatureService.get_features(current_user.current_tenant_id)            if features.billing.enabled:                members = features.members                apps = features.apps                vector_space = features.vector_space                annotation_quota_limit = features.annotation_quota_limit                if resource == 'members' and 0 < members.limit <= members.size:                    abort(403, error_msg)                elif resource == 'apps' and 0 < apps.limit <= apps.size:                    abort(403, error_msg)                elif resource == 'vector_space' and 0 < vector_space.limit <= vector_space.size:                    abort(403, error_msg)                elif resource == 'workspace_custom' and not features.can_replace_logo:                    abort(403, error_msg)                elif resource == 'annotation' and 0 < annotation_quota_limit.limit < annotation_quota_limit.size:                    abort(403, error_msg)                else:                    return view(*args, **kwargs)            return view(*args, **kwargs)        return decorated    return interceptor
 |