From bcd112c74f77056327016fe0199bae715f5f404e Mon Sep 17 00:00:00 2001 From: zyssyz123 <916125788@qq.com> Date: Mon, 14 Jul 2025 16:52:59 +0800 Subject: [PATCH] Feat/transfer workspace onwer (#22352) --- api/controllers/console/workspace/account.py | 1 - api/controllers/console/workspace/members.py | 17 ++--------------- api/services/account_service.py | 2 -- api/services/feature_service.py | 1 - api/tasks/mail_owner_transfer_task.py | 11 +++++------ ..._workspace_owner_confirm_template_en-US.html | 3 +-- ..._workspace_owner_confirm_template_zh-CN.html | 2 +- ..._workspace_owner_confirm_template_en-US.html | 4 ++++ ..._workspace_owner_confirm_template_zh-CN.html | 4 ++++ 9 files changed, 17 insertions(+), 28 deletions(-) diff --git a/api/controllers/console/workspace/account.py b/api/controllers/console/workspace/account.py index c392404abd..913f820b59 100644 --- a/api/controllers/console/workspace/account.py +++ b/api/controllers/console/workspace/account.py @@ -415,7 +415,6 @@ class ChangeEmailSendEmailApi(Resource): if user_email != current_user.email: raise InvalidEmailError() - else: with Session(db.engine) as session: account = session.execute(select(Account).filter_by(email=args["email"])).scalar_one_or_none() diff --git a/api/controllers/console/workspace/members.py b/api/controllers/console/workspace/members.py index 9574945ffd..ec44300559 100644 --- a/api/controllers/console/workspace/members.py +++ b/api/controllers/console/workspace/members.py @@ -175,7 +175,7 @@ class SendOwnerTransferEmailApi(Resource): @login_required @account_initialization_required @is_allow_transfer_owner - def post(self, member_id): + def post(self): parser = reqparse.RequestParser() parser.add_argument("language", type=str, required=False, location="json") args = parser.parse_args() @@ -187,31 +187,18 @@ class SendOwnerTransferEmailApi(Resource): if not TenantService.is_owner(current_user, current_user.current_tenant): raise NotOwnerError() - if current_user.id == str(member_id): - raise CannotTransferOwnerToSelfError() - if args["language"] is not None and args["language"] == "zh-Hans": language = "zh-Hans" else: language = "en-US" email = current_user.email - member = db.session.get(Account, str(member_id)) - if not member: - abort(404) - else: - member_name = member.name - member_account = member - # check the member is in the workspace - if not TenantService.is_member(member_account, current_user.current_tenant): - raise MemberNotInTenantError() token = AccountService.send_owner_transfer_email( account=current_user, email=email, language=language, workspace_name=current_user.current_tenant.name, - member_name=member_name, ) return {"result": "success", "data": token} @@ -324,7 +311,7 @@ api.add_resource(MemberUpdateRoleApi, "/workspaces/current/members//send-owner-transfer-confirm-email" + SendOwnerTransferEmailApi, "/workspaces/current/members/send-owner-transfer-confirm-email" ) api.add_resource(OwnerTransferCheckApi, "/workspaces/current/members/owner-transfer-check") api.add_resource(OwnerTransfer, "/workspaces/current/members//owner-transfer") diff --git a/api/services/account_service.py b/api/services/account_service.py index fd796e6cb0..79ae19b13b 100644 --- a/api/services/account_service.py +++ b/api/services/account_service.py @@ -467,7 +467,6 @@ class AccountService: email: Optional[str] = None, language: Optional[str] = "en-US", workspace_name: Optional[str] = "", - member_name: Optional[str] = "", ): account_email = account.email if account else email if account_email is None: @@ -485,7 +484,6 @@ class AccountService: to=account_email, code=code, workspace=workspace_name, - member=member_name, ) cls.owner_transfer_rate_limiter.increment_rate_limit(account_email) return token diff --git a/api/services/feature_service.py b/api/services/feature_service.py index 9a9acb340f..1441e6ce16 100644 --- a/api/services/feature_service.py +++ b/api/services/feature_service.py @@ -230,7 +230,6 @@ class FeatureService: if features.billing.subscription.plan != "sandbox": features.webapp_copyright_enabled = True - features.is_allow_transfer_workspace = True else: features.is_allow_transfer_workspace = False diff --git a/api/tasks/mail_owner_transfer_task.py b/api/tasks/mail_owner_transfer_task.py index d0642c916f..8d05c6dc0f 100644 --- a/api/tasks/mail_owner_transfer_task.py +++ b/api/tasks/mail_owner_transfer_task.py @@ -10,13 +10,12 @@ from services.feature_service import FeatureService @shared_task(queue="mail") -def send_owner_transfer_confirm_task(language: str, to: str, code: str, workspace: str, member: str): +def send_owner_transfer_confirm_task(language: str, to: str, code: str, workspace: str): """ Async Send owner transfer confirm mail :param language: Language in which the email should be sent (e.g., 'en', 'zh') :param to: Recipient email address :param workspace: Workspace name - :param member: Member name """ if not mail.is_inited(): return @@ -30,20 +29,20 @@ def send_owner_transfer_confirm_task(language: str, to: str, code: str, workspac system_features = FeatureService.get_system_features() if system_features.branding.enabled: template = "without-brand/transfer_workspace_owner_confirm_template_zh-CN.html" - html_content = render_template(template, to=to, code=code, WorkspaceName=workspace, NewOwner=member) + html_content = render_template(template, to=to, code=code, WorkspaceName=workspace) mail.send(to=to, subject="验证您转移工作空间所有权的请求", html=html_content) else: - html_content = render_template(template, to=to, code=code, WorkspaceName=workspace, NewOwner=member) + html_content = render_template(template, to=to, code=code, WorkspaceName=workspace) mail.send(to=to, subject="验证您转移工作空间所有权的请求", html=html_content) else: template = "transfer_workspace_owner_confirm_template_en-US.html" system_features = FeatureService.get_system_features() if system_features.branding.enabled: template = "without-brand/transfer_workspace_owner_confirm_template_en-US.html" - html_content = render_template(template, to=to, code=code, WorkspaceName=workspace, NewOwner=member) + html_content = render_template(template, to=to, code=code, WorkspaceName=workspace) mail.send(to=to, subject="Verify Your Request to Transfer Workspace Ownership", html=html_content) else: - html_content = render_template(template, to=to, code=code, WorkspaceName=workspace, NewOwner=member) + html_content = render_template(template, to=to, code=code, WorkspaceName=workspace) mail.send(to=to, subject="Verify Your Request to Transfer Workspace Ownership", html=html_content) end_at = time.perf_counter() diff --git a/api/templates/transfer_workspace_owner_confirm_template_en-US.html b/api/templates/transfer_workspace_owner_confirm_template_en-US.html index 6aadae8aef..46538325d4 100644 --- a/api/templates/transfer_workspace_owner_confirm_template_en-US.html +++ b/api/templates/transfer_workspace_owner_confirm_template_en-US.html @@ -74,8 +74,7 @@ Dify Logo

Verify Your Request to Transfer Workspace Ownership

-

We received a request to transfer ownership of your workspace “{{WorkspaceName}}” to the - member {{NewOwner}}. +

We received a request to transfer ownership of your workspace “{{WorkspaceName}}”. To confirm this action, please use the verification code below. This code will only be valid for the next 5 minutes:

diff --git a/api/templates/transfer_workspace_owner_confirm_template_zh-CN.html b/api/templates/transfer_workspace_owner_confirm_template_zh-CN.html index c8a519fe1e..942667daea 100644 --- a/api/templates/transfer_workspace_owner_confirm_template_zh-CN.html +++ b/api/templates/transfer_workspace_owner_confirm_template_zh-CN.html @@ -74,7 +74,7 @@ Dify Logo

验证您的工作空间所有权转移请求

-

我们收到了将您的工作空间“{{WorkspaceName}}”的所有权转移给成员{{NewOwner}}的请求。 +

我们收到了将您的工作空间“{{WorkspaceName}}”的所有权转移的请求。 为了确认此操作,请使用以下验证码。 此验证码仅在5分钟内有效:

diff --git a/api/templates/without-brand/transfer_workspace_owner_confirm_template_en-US.html b/api/templates/without-brand/transfer_workspace_owner_confirm_template_en-US.html index 013739284f..281bb62943 100644 --- a/api/templates/without-brand/transfer_workspace_owner_confirm_template_en-US.html +++ b/api/templates/without-brand/transfer_workspace_owner_confirm_template_en-US.html @@ -70,8 +70,12 @@

Verify Your Request to Transfer Workspace Ownership

+<<<<<<< HEAD +

We received a request to transfer ownership of your workspace “{{WorkspaceName}}”. +=======

We received a request to transfer ownership of your workspace “{{WorkspaceName}}” to the member {{NewOwner}}. +>>>>>>> 6575edd01b5edda692ec626c580b10ed6a1a8d02 To confirm this action, please use the verification code below. This code will only be valid for the next 5 minutes:

diff --git a/api/templates/without-brand/transfer_workspace_owner_confirm_template_zh-CN.html b/api/templates/without-brand/transfer_workspace_owner_confirm_template_zh-CN.html index 5831c1d742..0e062b4ba8 100644 --- a/api/templates/without-brand/transfer_workspace_owner_confirm_template_zh-CN.html +++ b/api/templates/without-brand/transfer_workspace_owner_confirm_template_zh-CN.html @@ -70,7 +70,11 @@

验证您的工作空间所有权转移请求

+<<<<<<< HEAD +

我们收到了将您的工作空间“{{WorkspaceName}}”的所有权转移的请求。 +=======

我们收到了将您的工作空间“{{WorkspaceName}}”的所有权转移给成员{{NewOwner}}的请求。 +>>>>>>> 6575edd01b5edda692ec626c580b10ed6a1a8d02 为了确认此操作,请使用以下验证码。 此验证码仅在5分钟内有效: