feat(license): update workspaces and workspace_members limits

This commit is contained in:
zhangx1n 2025-04-09 13:32:12 +08:00
parent 3a7ce5e27b
commit 6dd5d16998
3 changed files with 17 additions and 14 deletions

View File

@ -2,6 +2,7 @@ from urllib import parse
from flask_login import current_user # type: ignore from flask_login import current_user # type: ignore
from flask_restful import Resource, abort, marshal_with, reqparse # type: ignore from flask_restful import Resource, abort, marshal_with, reqparse # type: ignore
from shapely.speedups import available
import services import services
from configs import dify_config from configs import dify_config
@ -55,10 +56,11 @@ class MemberInviteEmailApi(Resource):
inviter = current_user inviter = current_user
invitation_results = [] invitation_results = []
console_web_url = dify_config.CONSOLE_WEB_URL console_web_url = dify_config.CONSOLE_WEB_URL
workspace_members = FeatureService.get_features(tenant_id=inviter.current_tenant.id).workspace_members
if ( if (
FeatureService.get_system_features().license.product_id == "DIFY_ENTERPRISE_STANDARD" FeatureService.get_system_features().license.product_id == "DIFY_ENTERPRISE_STANDARD"
and len(invitee_emails) and len(invitee_emails) > workspace_members.limit - workspace_members.size
> FeatureService.get_features(tenant_id=inviter.current_tenant.id).available_team_members
): ):
return { return {
"code": "limit-exceeded", "code": "limit-exceeded",

View File

@ -585,11 +585,12 @@ class TenantService:
if not FeatureService.get_system_features().is_allow_create_workspace and not is_setup: if not FeatureService.get_system_features().is_allow_create_workspace and not is_setup:
raise WorkSpaceNotAllowedCreateError() raise WorkSpaceNotAllowedCreateError()
workspaces = FeatureService.get_system_features().license.workspaces
if ( if (
FeatureService.get_system_features().license.product_id == "DIFY_ENTERPRISE_STANDARD" 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: if name:
tenant = TenantService.create_tenant(name=name, is_setup=is_setup) tenant = TenantService.create_tenant(name=name, is_setup=is_setup)

View File

@ -35,7 +35,8 @@ class LicenseModel(BaseModel):
status: LicenseStatus = LicenseStatus.NONE status: LicenseStatus = LicenseStatus.NONE
expired_at: str = "" expired_at: str = ""
product_id: str = "" product_id: str = ""
available_workspaces: int = 0 workspaces: LimitationModel = LimitationModel(size=0, limit=0)
class BrandingModel(BaseModel): class BrandingModel(BaseModel):
@ -58,7 +59,7 @@ class FeatureModel(BaseModel):
model_load_balancing_enabled: bool = False model_load_balancing_enabled: bool = False
dataset_operator_enabled: bool = False dataset_operator_enabled: bool = False
webapp_copyright_enabled: bool = False webapp_copyright_enabled: bool = False
available_team_members: int = 0 workspace_members: LimitationModel = LimitationModel(size=0, limit=0)
# pydantic configs # pydantic configs
model_config = ConfigDict(protected_namespaces=()) model_config = ConfigDict(protected_namespaces=())
@ -92,7 +93,7 @@ class FeatureService:
if dify_config.ENTERPRISE_ENABLED: if dify_config.ENTERPRISE_ENABLED:
features.webapp_copyright_enabled = True features.webapp_copyright_enabled = True
cls._fulfill_parms_from_license(features, tenant_id) cls._fulfill_parms_from_license_info(features, tenant_id)
return features return features
@ -125,9 +126,10 @@ class FeatureService:
features.dataset_operator_enabled = dify_config.DATASET_OPERATOR_ENABLED features.dataset_operator_enabled = dify_config.DATASET_OPERATOR_ENABLED
@classmethod @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"] 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 @classmethod
def _fulfill_params_from_billing_api(cls, features: FeatureModel, tenant_id: str): def _fulfill_params_from_billing_api(cls, features: FeatureModel, tenant_id: str):
@ -215,8 +217,6 @@ class FeatureService:
if "productId" in license_info: if "productId" in license_info:
features.license.product_id = license_info["productId"] features.license.product_id = license_info["productId"]
# if "availableTeamMembers" in license_info: if "workspaces" in license_info:
# features.license.available_team_members = license_info["availableTeamMembers"] features.license.workspaces.limit = license_info["workspaces"]["limit"]
features.license.workspaces.size = license_info["workspaces"]["used"]
if "availableWorkspaces" in license_info:
features.license.available_workspaces = license_info["availableWorkspaces"]