From 6dd5d169988f781ef9f12857f83668f093a19d2d Mon Sep 17 00:00:00 2001 From: zhangx1n Date: Wed, 9 Apr 2025 13:32:12 +0800 Subject: [PATCH] feat(license): update workspaces and workspace_members limits --- api/controllers/console/workspace/members.py | 6 ++++-- api/services/account_service.py | 5 +++-- api/services/feature_service.py | 20 ++++++++++---------- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/api/controllers/console/workspace/members.py b/api/controllers/console/workspace/members.py index 53bf3db95c..5738bc53d2 100644 --- a/api/controllers/console/workspace/members.py +++ b/api/controllers/console/workspace/members.py @@ -2,6 +2,7 @@ from urllib import parse from flask_login import current_user # type: ignore from flask_restful import Resource, abort, marshal_with, reqparse # type: ignore +from shapely.speedups import available import services from configs import dify_config @@ -55,10 +56,11 @@ class MemberInviteEmailApi(Resource): inviter = current_user invitation_results = [] console_web_url = dify_config.CONSOLE_WEB_URL + + workspace_members = FeatureService.get_features(tenant_id=inviter.current_tenant.id).workspace_members if ( FeatureService.get_system_features().license.product_id == "DIFY_ENTERPRISE_STANDARD" - and len(invitee_emails) - > FeatureService.get_features(tenant_id=inviter.current_tenant.id).available_team_members + and len(invitee_emails) > workspace_members.limit - workspace_members.size ): return { "code": "limit-exceeded", diff --git a/api/services/account_service.py b/api/services/account_service.py index e9d9cef6ce..4e2ec13375 100644 --- a/api/services/account_service.py +++ b/api/services/account_service.py @@ -585,11 +585,12 @@ class TenantService: if not FeatureService.get_system_features().is_allow_create_workspace and not is_setup: raise WorkSpaceNotAllowedCreateError() + workspaces = FeatureService.get_system_features().license.workspaces if ( FeatureService.get_system_features().license.product_id == "DIFY_ENTERPRISE_STANDARD" - and FeatureService.get_system_features().available_workspaces <= 0 + and workspaces.limit - workspaces.size <= 0 ): - raise WorkSpaceNotAllowedCreateError() + raise WorkSpaceNotAllowedCreateError("workspace creation limit exceeded") if name: tenant = TenantService.create_tenant(name=name, is_setup=is_setup) diff --git a/api/services/feature_service.py b/api/services/feature_service.py index 83381eb33c..9d735e1a40 100644 --- a/api/services/feature_service.py +++ b/api/services/feature_service.py @@ -35,7 +35,8 @@ class LicenseModel(BaseModel): status: LicenseStatus = LicenseStatus.NONE expired_at: str = "" product_id: str = "" - available_workspaces: int = 0 + workspaces: LimitationModel = LimitationModel(size=0, limit=0) + class BrandingModel(BaseModel): @@ -58,7 +59,7 @@ class FeatureModel(BaseModel): model_load_balancing_enabled: bool = False dataset_operator_enabled: bool = False webapp_copyright_enabled: bool = False - available_team_members: int = 0 + workspace_members: LimitationModel = LimitationModel(size=0, limit=0) # pydantic configs model_config = ConfigDict(protected_namespaces=()) @@ -92,7 +93,7 @@ class FeatureService: if dify_config.ENTERPRISE_ENABLED: features.webapp_copyright_enabled = True - cls._fulfill_parms_from_license(features, tenant_id) + cls._fulfill_parms_from_license_info(features, tenant_id) return features @@ -125,9 +126,10 @@ class FeatureService: features.dataset_operator_enabled = dify_config.DATASET_OPERATOR_ENABLED @classmethod - def _fulfill_parms_from_license(cls, features: FeatureModel, tenant_id: str): + def _fulfill_parms_from_license_info(cls, features: FeatureModel, tenant_id: str): license_info = EnterpriseService.get_info(tenant_id)["License"] - features.available_team_members = license_info["availableTeamMembers"] + features.workspace_members.limit = license_info["workspaceMembers"]["limit"] + features.workspace_members.size = license_info["workspaceMembers"]["used"] @classmethod def _fulfill_params_from_billing_api(cls, features: FeatureModel, tenant_id: str): @@ -215,8 +217,6 @@ class FeatureService: if "productId" in license_info: features.license.product_id = license_info["productId"] - # if "availableTeamMembers" in license_info: - # features.license.available_team_members = license_info["availableTeamMembers"] - - if "availableWorkspaces" in license_info: - features.license.available_workspaces = license_info["availableWorkspaces"] + if "workspaces" in license_info: + features.license.workspaces.limit = license_info["workspaces"]["limit"] + features.license.workspaces.size = license_info["workspaces"]["used"]