From c3cd11cb9ad84b152cf777f2249a7177d30a0400 Mon Sep 17 00:00:00 2001 From: dandds Date: Thu, 3 Jan 2019 13:40:21 -0500 Subject: [PATCH] service class for making and sending invitations --- atst/routes/workspaces/members.py | 9 +++---- atst/services/invitation.py | 45 +++++++++++++++++++++++++++++++ tests/services/test_invitation.py | 17 ++++++++++++ 3 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 atst/services/invitation.py create mode 100644 tests/services/test_invitation.py diff --git a/atst/routes/workspaces/members.py b/atst/routes/workspaces/members.py index f3f06d4e..7b463d03 100644 --- a/atst/routes/workspaces/members.py +++ b/atst/routes/workspaces/members.py @@ -3,13 +3,13 @@ import re from flask import render_template, request as http_request, g, redirect, url_for from . import workspaces_bp -from atst.routes.workspaces.invitations import send_invite_email from atst.domain.exceptions import AlreadyExistsError from atst.domain.projects import Projects from atst.domain.workspaces import Workspaces from atst.domain.workspace_roles import WorkspaceRoles, MEMBER_STATUS_CHOICES from atst.domain.environments import Environments 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.edit_member import EditMemberForm from atst.forms.data import ( @@ -19,7 +19,6 @@ from atst.forms.data import ( ) from atst.domain.authz import Authorization from atst.models.permissions import Permissions -from atst.domain.invitations import Invitations from atst.utils.flash import formatted_flash as flash @@ -68,13 +67,11 @@ def new_member(workspace_id): def create_member(workspace_id): workspace = Workspaces.get(g.current_user, workspace_id) form = NewMemberForm(http_request.form) - user = g.current_user if form.validate(): try: - new_member = Workspaces.create_member(user, workspace, form.data) - invite = Invitations.create(user, new_member, form.data["email"]) - send_invite_email(g.current_user.full_name, invite.token, invite.email) + invite_service = InvitationService(g.current_user, workspace, form.data) + invite_service.invite() flash("new_workspace_member", new_member=new_member, workspace=workspace) diff --git a/atst/services/invitation.py b/atst/services/invitation.py new file mode 100644 index 00000000..1df4cefb --- /dev/null +++ b/atst/services/invitation.py @@ -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) diff --git a/tests/services/test_invitation.py b/tests/services/test_invitation.py new file mode 100644 index 00000000..ef15db02 --- /dev/null +++ b/tests/services/test_invitation.py @@ -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