refactor: add `enabled` field to LicenseLimitationModel

pull/17683/head
zhangx1n 1 year ago
parent ba33f4c2a4
commit f8026c1db8

@ -91,11 +91,7 @@ class LoginApi(Resource):
if len(tenants) == 0: if len(tenants) == 0:
system_features = FeatureService.get_system_features() system_features = FeatureService.get_system_features()
if ( if system_features.is_allow_create_workspace and not system_features.license.workspaces.is_available():
system_features.is_allow_create_workspace
and system_features.license.workspaces.limit != 0
and system_features.license.workspaces.limit - system_features.license.workspaces.size <= 0
):
raise WorkspacesLimitExceeded() raise WorkspacesLimitExceeded()
else: else:
return { return {
@ -209,11 +205,7 @@ class EmailCodeLoginApi(Resource):
tenant = TenantService.get_join_tenants(account) tenant = TenantService.get_join_tenants(account)
if not tenant: if not tenant:
workspaces = FeatureService.get_system_features().license.workspaces workspaces = FeatureService.get_system_features().license.workspaces
if ( if not workspaces.is_available():
FeatureService.get_system_features().license.product_id == "DIFY_ENTERPRISE_STANDARD"
and workspaces.limit != 0 # if limit == 0 means unlimited
and workspaces.limit - workspaces.size <= 0
):
raise WorkspacesLimitExceeded() raise WorkspacesLimitExceeded()
if not FeatureService.get_system_features().is_allow_create_workspace: if not FeatureService.get_system_features().is_allow_create_workspace:
raise NotAllowedCreateWorkspace() raise NotAllowedCreateWorkspace()

@ -58,11 +58,8 @@ class MemberInviteEmailApi(Resource):
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 workspace_members = FeatureService.get_features(tenant_id=inviter.current_tenant.id).workspace_members
if (
FeatureService.get_system_features().license.product_id == "DIFY_ENTERPRISE_STANDARD" if not workspace_members.is_available(len(invitee_emails)):
and workspace_members.limit != 0 # if limit == 0, it means unlimited
and len(invitee_emails) > workspace_members.limit - workspace_members.size
):
raise WorkspaceMembersLimitExceeded() raise WorkspaceMembersLimitExceeded()
for invitee_email in invitee_emails: for invitee_email in invitee_emails:

@ -53,9 +53,10 @@ from services.errors.workspace import WorkSpaceNotAllowedCreateError, Workspaces
from services.feature_service import FeatureService from services.feature_service import FeatureService
from tasks.delete_account_task import delete_account_task from tasks.delete_account_task import delete_account_task
from tasks.mail_account_deletion_task import send_account_deletion_verification_code from tasks.mail_account_deletion_task import send_account_deletion_verification_code
from tasks.mail_email_code_login import send_email_code_login_mail_task
from tasks.mail_invite_member_task import send_invite_member_mail_task from tasks.mail_invite_member_task import send_invite_member_mail_task
from tasks.mail_reset_password_task import send_reset_password_mail_task from tasks.mail_reset_password_task import send_reset_password_mail_task
from tasks.mail_email_code_login import send_email_code_login_mail_task
class TokenPair(BaseModel): class TokenPair(BaseModel):
access_token: str access_token: str
@ -599,11 +600,7 @@ class TenantService:
raise WorkSpaceNotAllowedCreateError() raise WorkSpaceNotAllowedCreateError()
workspaces = FeatureService.get_system_features().license.workspaces workspaces = FeatureService.get_system_features().license.workspaces
if ( if not workspaces.is_available():
FeatureService.get_system_features().license.product_id == "DIFY_ENTERPRISE_STANDARD"
and workspaces.limit != 0 # if limit == 0, it means unlimited
and workspaces.limit - workspaces.size <= 0
):
raise WorkspacesLimitExceededError() raise WorkspacesLimitExceededError()
if name: if name:

@ -16,6 +16,5 @@ class EnterpriseRequest:
def send_request(cls, method, endpoint, json=None, params=None): def send_request(cls, method, endpoint, json=None, params=None):
headers = {"Content-Type": "application/json", "Enterprise-Api-Secret-Key": cls.secret_key} headers = {"Content-Type": "application/json", "Enterprise-Api-Secret-Key": cls.secret_key}
url = f"{cls.base_url}{endpoint}" url = f"{cls.base_url}{endpoint}"
print("url: ", url)
response = requests.request(method, url, json=json, params=params, headers=headers, proxies=cls.proxies) response = requests.request(method, url, json=json, params=params, headers=headers, proxies=cls.proxies)
return response.json() return response.json()

@ -1,6 +1,6 @@
from enum import StrEnum from enum import StrEnum
from pydantic import BaseModel, ConfigDict from pydantic import BaseModel, ConfigDict, Field
from configs import dify_config from configs import dify_config
from services.billing_service import BillingService from services.billing_service import BillingService
@ -22,6 +22,32 @@ class LimitationModel(BaseModel):
limit: int = 0 limit: int = 0
class LicenseLimitationModel(BaseModel):
"""
- enabled: whether this limit is enforced
- size: current usage count
- limit: maximum allowed count; 0 means unlimited
"""
enabled: bool = Field(False, description="Whether this limit is currently active")
size: int = Field(0, description="Number of resources already consumed")
limit: int = Field(0, description="Maximum number of resources allowed; 0 means no limit")
def is_available(self, required: int = 1) -> bool:
"""
Determine whether the requested amount can be allocated.
Returns True if:
- this limit is not active, or
- the limit is zero (unlimited), or
- there is enough remaining quota.
"""
if not self.enabled or self.limit == 0:
return True
return (self.limit - self.size) >= required
class LicenseStatus(StrEnum): class LicenseStatus(StrEnum):
NONE = "none" NONE = "none"
INACTIVE = "inactive" INACTIVE = "inactive"
@ -35,6 +61,8 @@ class LicenseModel(BaseModel):
status: LicenseStatus = LicenseStatus.NONE status: LicenseStatus = LicenseStatus.NONE
expired_at: str = "" expired_at: str = ""
product_id: str = "" product_id: str = ""
workspaces: LicenseLimitationModel = LicenseLimitationModel(enabled=False, size=0, limit=0)
class BrandingModel(BaseModel): class BrandingModel(BaseModel):
enabled: bool = False enabled: bool = False
@ -68,7 +96,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
workspace_members: LimitationModel = LimitationModel(size=0, limit=0) workspace_members: LicenseLimitationModel = LicenseLimitationModel(enabled=False, size=0, limit=0)
# pydantic configs # pydantic configs
model_config = ConfigDict(protected_namespaces=()) model_config = ConfigDict(protected_namespaces=())
@ -84,7 +112,6 @@ class SystemFeatureModel(BaseModel):
is_allow_create_workspace: bool = False is_allow_create_workspace: bool = False
is_email_setup: bool = False is_email_setup: bool = False
license: LicenseModel = LicenseModel() license: LicenseModel = LicenseModel()
workspaces: LimitationModel = LimitationModel(size=0, limit=0)
branding: BrandingModel = BrandingModel() branding: BrandingModel = BrandingModel()
webapp_auth: WebAppAuthModel = WebAppAuthModel() webapp_auth: WebAppAuthModel = WebAppAuthModel()
@ -101,7 +128,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_params_from_workspaces_quota(features, tenant_id) cls._fulfill_params_from_workspace_info(features, tenant_id)
return features return features
@ -134,10 +161,12 @@ class FeatureService:
features.dataset_operator_enabled = dify_config.DATASET_OPERATOR_ENABLED features.dataset_operator_enabled = dify_config.DATASET_OPERATOR_ENABLED
@classmethod @classmethod
def _fulfill_params_from_workspaces_quota(cls, features: FeatureModel, tenant_id: str): def _fulfill_params_from_workspace_info(cls, features: FeatureModel, tenant_id: str):
workspace_members_quota = EnterpriseService.get_workspace_info(tenant_id)["WorkspaceMembersQuota"] workspace_info = EnterpriseService.get_workspace_info(tenant_id)
features.workspace_members.limit = workspace_members_quota["limit"] if "WorkspaceMembers" in workspace_info:
features.workspace_members.size = workspace_members_quota["used"] features.workspace_members.size = workspace_info["WorkspaceMembers"]["used"]
features.workspace_members.limit = workspace_info["WorkspaceMembers"]["limit"]
features.workspace_members.enabled = workspace_info["WorkspaceMembers"]["enabled"]
@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):
@ -229,7 +258,7 @@ 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 "WorkspacesQuota" in enterprise_info: if "workspaces" in license_info:
features.workspaces.limit =enterprise_info["WorkspacesQuota"]["limit"] features.license.workspaces.enabled = license_info["workspaces"]["enabled"]
features.workspaces.size = enterprise_info["WorkspacesQuota"]["used"] features.license.workspaces.limit = license_info["workspaces"]["limit"]
features.license.workspaces.size = license_info["workspaces"]["used"]

Loading…
Cancel
Save