Feat/transfer workspace onwer (#22352)

pull/22493/head
zyssyz123 10 months ago committed by GitHub
parent 6575edd01b
commit bcd112c74f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -415,7 +415,6 @@ class ChangeEmailSendEmailApi(Resource):
if user_email != current_user.email: if user_email != current_user.email:
raise InvalidEmailError() raise InvalidEmailError()
else: else:
with Session(db.engine) as session: with Session(db.engine) as session:
account = session.execute(select(Account).filter_by(email=args["email"])).scalar_one_or_none() account = session.execute(select(Account).filter_by(email=args["email"])).scalar_one_or_none()

@ -175,7 +175,7 @@ class SendOwnerTransferEmailApi(Resource):
@login_required @login_required
@account_initialization_required @account_initialization_required
@is_allow_transfer_owner @is_allow_transfer_owner
def post(self, member_id): def post(self):
parser = reqparse.RequestParser() parser = reqparse.RequestParser()
parser.add_argument("language", type=str, required=False, location="json") parser.add_argument("language", type=str, required=False, location="json")
args = parser.parse_args() args = parser.parse_args()
@ -187,31 +187,18 @@ class SendOwnerTransferEmailApi(Resource):
if not TenantService.is_owner(current_user, current_user.current_tenant): if not TenantService.is_owner(current_user, current_user.current_tenant):
raise NotOwnerError() raise NotOwnerError()
if current_user.id == str(member_id):
raise CannotTransferOwnerToSelfError()
if args["language"] is not None and args["language"] == "zh-Hans": if args["language"] is not None and args["language"] == "zh-Hans":
language = "zh-Hans" language = "zh-Hans"
else: else:
language = "en-US" language = "en-US"
email = current_user.email 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( token = AccountService.send_owner_transfer_email(
account=current_user, account=current_user,
email=email, email=email,
language=language, language=language,
workspace_name=current_user.current_tenant.name, workspace_name=current_user.current_tenant.name,
member_name=member_name,
) )
return {"result": "success", "data": token} return {"result": "success", "data": token}
@ -324,7 +311,7 @@ api.add_resource(MemberUpdateRoleApi, "/workspaces/current/members/<uuid:member_
api.add_resource(DatasetOperatorMemberListApi, "/workspaces/current/dataset-operators") api.add_resource(DatasetOperatorMemberListApi, "/workspaces/current/dataset-operators")
# owner transfer # owner transfer
api.add_resource( api.add_resource(
SendOwnerTransferEmailApi, "/workspaces/current/members/<uuid:member_id>/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(OwnerTransferCheckApi, "/workspaces/current/members/owner-transfer-check")
api.add_resource(OwnerTransfer, "/workspaces/current/members/<uuid:member_id>/owner-transfer") api.add_resource(OwnerTransfer, "/workspaces/current/members/<uuid:member_id>/owner-transfer")

@ -467,7 +467,6 @@ class AccountService:
email: Optional[str] = None, email: Optional[str] = None,
language: Optional[str] = "en-US", language: Optional[str] = "en-US",
workspace_name: Optional[str] = "", workspace_name: Optional[str] = "",
member_name: Optional[str] = "",
): ):
account_email = account.email if account else email account_email = account.email if account else email
if account_email is None: if account_email is None:
@ -485,7 +484,6 @@ class AccountService:
to=account_email, to=account_email,
code=code, code=code,
workspace=workspace_name, workspace=workspace_name,
member=member_name,
) )
cls.owner_transfer_rate_limiter.increment_rate_limit(account_email) cls.owner_transfer_rate_limiter.increment_rate_limit(account_email)
return token return token

@ -230,7 +230,6 @@ class FeatureService:
if features.billing.subscription.plan != "sandbox": if features.billing.subscription.plan != "sandbox":
features.webapp_copyright_enabled = True features.webapp_copyright_enabled = True
features.is_allow_transfer_workspace = True
else: else:
features.is_allow_transfer_workspace = False features.is_allow_transfer_workspace = False

@ -10,13 +10,12 @@ from services.feature_service import FeatureService
@shared_task(queue="mail") @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 Async Send owner transfer confirm mail
:param language: Language in which the email should be sent (e.g., 'en', 'zh') :param language: Language in which the email should be sent (e.g., 'en', 'zh')
:param to: Recipient email address :param to: Recipient email address
:param workspace: Workspace name :param workspace: Workspace name
:param member: Member name
""" """
if not mail.is_inited(): if not mail.is_inited():
return return
@ -30,20 +29,20 @@ def send_owner_transfer_confirm_task(language: str, to: str, code: str, workspac
system_features = FeatureService.get_system_features() system_features = FeatureService.get_system_features()
if system_features.branding.enabled: if system_features.branding.enabled:
template = "without-brand/transfer_workspace_owner_confirm_template_zh-CN.html" 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) mail.send(to=to, subject="验证您转移工作空间所有权的请求", html=html_content)
else: 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) mail.send(to=to, subject="验证您转移工作空间所有权的请求", html=html_content)
else: else:
template = "transfer_workspace_owner_confirm_template_en-US.html" template = "transfer_workspace_owner_confirm_template_en-US.html"
system_features = FeatureService.get_system_features() system_features = FeatureService.get_system_features()
if system_features.branding.enabled: if system_features.branding.enabled:
template = "without-brand/transfer_workspace_owner_confirm_template_en-US.html" 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) mail.send(to=to, subject="Verify Your Request to Transfer Workspace Ownership", html=html_content)
else: 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) mail.send(to=to, subject="Verify Your Request to Transfer Workspace Ownership", html=html_content)
end_at = time.perf_counter() end_at = time.perf_counter()

@ -74,8 +74,7 @@
<img src="https://assets.dify.ai/images/logo.png" alt="Dify Logo" /> <img src="https://assets.dify.ai/images/logo.png" alt="Dify Logo" />
</div> </div>
<p class="title">Verify Your Request to Transfer Workspace Ownership</p> <p class="title">Verify Your Request to Transfer Workspace Ownership</p>
<p class="description">We received a request to transfer ownership of your workspace “{{WorkspaceName}}” to the <p class="description">We received a request to transfer ownership of your workspace “{{WorkspaceName}}”.
member {{NewOwner}}.
To confirm this action, please use the verification code below. To confirm this action, please use the verification code below.
This code will only be valid for the next 5 minutes:</p> This code will only be valid for the next 5 minutes:</p>

@ -74,7 +74,7 @@
<img src="https://assets.dify.ai/images/logo.png" alt="Dify Logo" /> <img src="https://assets.dify.ai/images/logo.png" alt="Dify Logo" />
</div> </div>
<p class="title">验证您的工作空间所有权转移请求</p> <p class="title">验证您的工作空间所有权转移请求</p>
<p class="description">我们收到了将您的工作空间“{{WorkspaceName}}”的所有权转移给成员{{NewOwner}}的请求。 <p class="description">我们收到了将您的工作空间“{{WorkspaceName}}”的所有权转移的请求。
为了确认此操作,请使用以下验证码。 为了确认此操作,请使用以下验证码。
此验证码仅在5分钟内有效</p> 此验证码仅在5分钟内有效</p>

@ -70,8 +70,12 @@
<body> <body>
<div class="container"> <div class="container">
<p class="title">Verify Your Request to Transfer Workspace Ownership</p> <p class="title">Verify Your Request to Transfer Workspace Ownership</p>
<<<<<<< HEAD
<p class="description">We received a request to transfer ownership of your workspace “{{WorkspaceName}}”.
=======
<p class="description">We received a request to transfer ownership of your workspace “{{WorkspaceName}}” to the <p class="description">We received a request to transfer ownership of your workspace “{{WorkspaceName}}” to the
member {{NewOwner}}. member {{NewOwner}}.
>>>>>>> 6575edd01b5edda692ec626c580b10ed6a1a8d02
To confirm this action, please use the verification code below. To confirm this action, please use the verification code below.
This code will only be valid for the next 5 minutes:</p> This code will only be valid for the next 5 minutes:</p>

@ -70,7 +70,11 @@
<body> <body>
<div class="container"> <div class="container">
<p class="title">验证您的工作空间所有权转移请求</p> <p class="title">验证您的工作空间所有权转移请求</p>
<<<<<<< HEAD
<p class="description">我们收到了将您的工作空间“{{WorkspaceName}}”的所有权转移的请求。
=======
<p class="description">我们收到了将您的工作空间“{{WorkspaceName}}”的所有权转移给成员{{NewOwner}}的请求。 <p class="description">我们收到了将您的工作空间“{{WorkspaceName}}”的所有权转移给成员{{NewOwner}}的请求。
>>>>>>> 6575edd01b5edda692ec626c580b10ed6a1a8d02
为了确认此操作,请使用以下验证码。 为了确认此操作,请使用以下验证码。
此验证码仅在5分钟内有效</p> 此验证码仅在5分钟内有效</p>

Loading…
Cancel
Save