From 18362c38e7ce131cd24c20cd8a9f223ebbc459c9 Mon Sep 17 00:00:00 2001 From: zhangx1n Date: Mon, 31 Mar 2025 17:26:08 +0800 Subject: [PATCH] feat(license): refactor available team members handling in feature service. - add tenant_id support to info request methods --- api/controllers/console/workspace/members.py | 4 +++- api/services/account_service.py | 2 +- api/services/feature_service.py | 12 +++++++++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/api/controllers/console/workspace/members.py b/api/controllers/console/workspace/members.py index 667c215582..564af9a83f 100644 --- a/api/controllers/console/workspace/members.py +++ b/api/controllers/console/workspace/members.py @@ -17,6 +17,7 @@ from libs.login import login_required from models.account import Account, TenantAccountRole from services.account_service import RegisterService, TenantService from services.errors.account import AccountAlreadyInTenantError +from services.feature_service import FeatureService class MemberListApi(Resource): @@ -55,7 +56,7 @@ class MemberInviteEmailApi(Resource): invitation_results = [] console_web_url = dify_config.CONSOLE_WEB_URL if (FeatureService.get_system_features().license.product_id == "DIFY_ENTERPRISE_STANDARD" and - len(invitee_emails) > FeatureService.get_system_features().available_team_members): + len(invitee_emails) > FeatureService.get_features(tenant_id=inviter.current_tenant.id).available_team_members): return { "code": "limit-exceeded", "message": "Limit exceeded", @@ -80,6 +81,7 @@ class MemberInviteEmailApi(Resource): ) break except Exception as e: + print(str(e)) invitation_results.append({"status": "failed", "email": invitee_email, "message": str(e)}) return { diff --git a/api/services/account_service.py b/api/services/account_service.py index 49d1c937c7..d3852eee9a 100644 --- a/api/services/account_service.py +++ b/api/services/account_service.py @@ -585,7 +585,7 @@ class TenantService: if not FeatureService.get_system_features().is_allow_create_workspace and not is_setup: raise WorkSpaceNotAllowedCreateError() - if FeatureService.get_system_features().license.product_id == "DIFY_ENTERPRISE_STANDARD" and FeatureService.get_system_features().available_workspaces == 0: + if FeatureService.get_system_features().license.product_id == "DIFY_ENTERPRISE_STANDARD" and FeatureService.get_system_features().available_workspaces <= 0: raise WorkSpaceNotAllowedCreateError() if name: diff --git a/api/services/feature_service.py b/api/services/feature_service.py index 66555e78d1..83381eb33c 100644 --- a/api/services/feature_service.py +++ b/api/services/feature_service.py @@ -35,7 +35,6 @@ class LicenseModel(BaseModel): status: LicenseStatus = LicenseStatus.NONE expired_at: str = "" product_id: str = "" - available_team_members: int = 0 available_workspaces: int = 0 @@ -59,6 +58,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 # pydantic configs model_config = ConfigDict(protected_namespaces=()) @@ -92,6 +92,7 @@ class FeatureService: if dify_config.ENTERPRISE_ENABLED: features.webapp_copyright_enabled = True + cls._fulfill_parms_from_license(features, tenant_id) return features @@ -123,6 +124,11 @@ class FeatureService: features.model_load_balancing_enabled = dify_config.MODEL_LB_ENABLED features.dataset_operator_enabled = dify_config.DATASET_OPERATOR_ENABLED + @classmethod + def _fulfill_parms_from_license(cls, features: FeatureModel, tenant_id: str): + license_info = EnterpriseService.get_info(tenant_id)["License"] + features.available_team_members = license_info["availableTeamMembers"] + @classmethod def _fulfill_params_from_billing_api(cls, features: FeatureModel, tenant_id: str): billing_info = BillingService.get_info(tenant_id) @@ -209,8 +215,8 @@ 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 "availableTeamMembers" in license_info: + # features.license.available_team_members = license_info["availableTeamMembers"] if "availableWorkspaces" in license_info: features.license.available_workspaces = license_info["availableWorkspaces"]