| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | import jsonfrom functools import wrapsfrom flask import abort, current_app, requestfrom flask_login import current_userfrom controllers.console.workspace.error import AccountNotInitializedErrorfrom services.feature_service import FeatureServicefrom services.operation_service import OperationServicedef 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 interceptordef cloud_utm_record(view):    @wraps(view)    def decorated(*args, **kwargs):        try:            features = FeatureService.get_features(current_user.current_tenant_id)            if features.billing.enabled:                utm_info = request.cookies.get('utm_info')                if utm_info:                    utm_info = json.loads(utm_info)                    OperationService.record_utm(current_user.current_tenant_id, utm_info)        except Exception as e:            pass        return view(*args, **kwargs)    return decorated
 |