service class for making and sending invitations

This commit is contained in:
dandds 2019-01-03 13:40:21 -05:00
parent cceb6bf868
commit c3cd11cb9a
3 changed files with 65 additions and 6 deletions

View File

@ -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)

View 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)

View 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