service class for making and sending invitations
This commit is contained in:
parent
cceb6bf868
commit
c3cd11cb9a
@ -3,13 +3,13 @@ import re
|
|||||||
from flask import render_template, request as http_request, g, redirect, url_for
|
from flask import render_template, request as http_request, g, redirect, url_for
|
||||||
|
|
||||||
from . import workspaces_bp
|
from . import workspaces_bp
|
||||||
from atst.routes.workspaces.invitations import send_invite_email
|
|
||||||
from atst.domain.exceptions import AlreadyExistsError
|
from atst.domain.exceptions import AlreadyExistsError
|
||||||
from atst.domain.projects import Projects
|
from atst.domain.projects import Projects
|
||||||
from atst.domain.workspaces import Workspaces
|
from atst.domain.workspaces import Workspaces
|
||||||
from atst.domain.workspace_roles import WorkspaceRoles, MEMBER_STATUS_CHOICES
|
from atst.domain.workspace_roles import WorkspaceRoles, MEMBER_STATUS_CHOICES
|
||||||
from atst.domain.environments import Environments
|
from atst.domain.environments import Environments
|
||||||
from atst.domain.environment_roles import EnvironmentRoles
|
from atst.domain.environment_roles import EnvironmentRoles
|
||||||
|
from atst.services.invitation import Invitation as InvitationService
|
||||||
from atst.forms.new_member import NewMemberForm
|
from atst.forms.new_member import NewMemberForm
|
||||||
from atst.forms.edit_member import EditMemberForm
|
from atst.forms.edit_member import EditMemberForm
|
||||||
from atst.forms.data import (
|
from atst.forms.data import (
|
||||||
@ -19,7 +19,6 @@ from atst.forms.data import (
|
|||||||
)
|
)
|
||||||
from atst.domain.authz import Authorization
|
from atst.domain.authz import Authorization
|
||||||
from atst.models.permissions import Permissions
|
from atst.models.permissions import Permissions
|
||||||
from atst.domain.invitations import Invitations
|
|
||||||
|
|
||||||
from atst.utils.flash import formatted_flash as flash
|
from atst.utils.flash import formatted_flash as flash
|
||||||
|
|
||||||
@ -68,13 +67,11 @@ def new_member(workspace_id):
|
|||||||
def create_member(workspace_id):
|
def create_member(workspace_id):
|
||||||
workspace = Workspaces.get(g.current_user, workspace_id)
|
workspace = Workspaces.get(g.current_user, workspace_id)
|
||||||
form = NewMemberForm(http_request.form)
|
form = NewMemberForm(http_request.form)
|
||||||
user = g.current_user
|
|
||||||
|
|
||||||
if form.validate():
|
if form.validate():
|
||||||
try:
|
try:
|
||||||
new_member = Workspaces.create_member(user, workspace, form.data)
|
invite_service = InvitationService(g.current_user, workspace, form.data)
|
||||||
invite = Invitations.create(user, new_member, form.data["email"])
|
invite_service.invite()
|
||||||
send_invite_email(g.current_user.full_name, invite.token, invite.email)
|
|
||||||
|
|
||||||
flash("new_workspace_member", new_member=new_member, workspace=workspace)
|
flash("new_workspace_member", new_member=new_member, workspace=workspace)
|
||||||
|
|
||||||
|
45
atst/services/invitation.py
Normal file
45
atst/services/invitation.py
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
# send invite to KO
|
||||||
|
# create KO user (Workspaces.create_member)
|
||||||
|
# needs workspace role name
|
||||||
|
# new_member = Workspaces.create_member(user, workspace, ws_role_name)
|
||||||
|
# invite = Invitations.create(user, new_member, form.data["email"])
|
||||||
|
# send_invite_email(g.current_user.full_name, invite.token, invite.email)
|
||||||
|
from flask import render_template
|
||||||
|
|
||||||
|
from atst.domain.workspaces import Workspaces
|
||||||
|
from atst.domain.invitations import Invitations
|
||||||
|
from atst.queue import queue
|
||||||
|
|
||||||
|
|
||||||
|
class Invitation:
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
inviter,
|
||||||
|
workspace,
|
||||||
|
user_info,
|
||||||
|
subject="{} has invited you to a JEDI Cloud Workspace",
|
||||||
|
email_template="emails/invitation.txt",
|
||||||
|
):
|
||||||
|
self.inviter = inviter
|
||||||
|
self.workspace = workspace
|
||||||
|
self.user_info = user_info
|
||||||
|
self.subject = subject
|
||||||
|
self.email_template = email_template
|
||||||
|
|
||||||
|
def invite(self):
|
||||||
|
member = self._create_member()
|
||||||
|
email = self.user_info.get("email")
|
||||||
|
invite = self._create_invite(member, email)
|
||||||
|
self._send_invite_email(invite.token, email)
|
||||||
|
|
||||||
|
return invite
|
||||||
|
|
||||||
|
def _create_member(self):
|
||||||
|
return Workspaces.create_member(self.inviter, self.workspace, self.user_info)
|
||||||
|
|
||||||
|
def _create_invite(self, member, email):
|
||||||
|
return Invitations.create(self.inviter, member, email)
|
||||||
|
|
||||||
|
def _send_invite_email(self, token, email):
|
||||||
|
body = render_template(self.email_template, owner=self.inviter, token=token)
|
||||||
|
queue.send_mail([email], self.subject.format(self.inviter), body)
|
17
tests/services/test_invitation.py
Normal file
17
tests/services/test_invitation.py
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
from tests.factories import UserFactory, WorkspaceFactory
|
||||||
|
|
||||||
|
from atst.services.invitation import Invitation
|
||||||
|
|
||||||
|
|
||||||
|
def test_invite_member(queue):
|
||||||
|
inviter = UserFactory.create()
|
||||||
|
new_member = UserFactory.create()
|
||||||
|
workspace = WorkspaceFactory.create(owner=inviter)
|
||||||
|
invite_service = Invitation(
|
||||||
|
inviter,
|
||||||
|
workspace,
|
||||||
|
{**new_member.to_dictionary(), "workspace_role": "developer"},
|
||||||
|
)
|
||||||
|
new_invitation = invite_service.invite()
|
||||||
|
assert new_invitation == new_member.invitations[0]
|
||||||
|
assert len(queue.get_queue()) == 1
|
Loading…
x
Reference in New Issue
Block a user