| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 | 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                documents_upload_quota = features.documents_upload_quota                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 == 'documents' and 0 < documents_upload_quota.limit <= documents_upload_quota.size:                    # The api of file upload is used in the multiple places, so we need to check the source of the request from datasets                    source = request.args.get('source')                    if source == 'datasets':                        abort(403, error_msg)                    else:                        return view(*args, **kwargs)                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_edition_billing_knowledge_limit_check(resource: str,                                                error_msg: str = "To unlock this feature and elevate your Dify experience, please upgrade to a paid plan."):    def interceptor(view):        @wraps(view)        def decorated(*args, **kwargs):            features = FeatureService.get_features(current_user.current_tenant_id)            if features.billing.enabled:                if resource == 'add_segment':                    if features.billing.subscription.plan == 'sandbox':                        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
 |