Task #399 - Memberships' resend-invitation handler

In order to resend and invitation email you just POST to detail-url
`memberships-resend-invitation`
remotes/origin/enhancement/email-actions
Anler Hp 2014-07-25 10:50:30 +02:00
parent ff3269c22c
commit 8eed0d03e5
7 changed files with 54 additions and 5 deletions

View File

@ -22,3 +22,5 @@ SOUTH_TESTS_MIGRATE = False
CELERY_ALWAYS_EAGER = True
MEDIA_ROOT = "/tmp"
EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend"

View File

@ -25,8 +25,6 @@ from rest_framework.exceptions import ParseError
from rest_framework import viewsets
from rest_framework import status
from djmail.template_mail import MagicMailBuilder
from taiga.base import filters
from taiga.base import exceptions as exc
from taiga.base.decorators import list_route
@ -182,6 +180,11 @@ class MembershipViewSet(ModelCrudViewSet):
members_serialized = self.serializer_class(members, many=True)
return Response(data=members_serialized.data)
@detail_route(methods=["POST"])
def resend_invitation(self, request, **kwargs):
services.send_invitation(invitation=self.get_object())
return Response(status=status.HTTP_204_NO_CONTENT)
def pre_save(self, object):
# Only assign new token if a current token value is empty.
if not object.token:
@ -196,9 +199,7 @@ class MembershipViewSet(ModelCrudViewSet):
return
# Send email only if a new membership is created
mbuilder = MagicMailBuilder()
email = mbuilder.membership_invitation(object.email, {"membership": object})
email.send()
services.send_invitation(invitation=object)
class InvitationViewSet(ModelListViewSet):

View File

@ -33,3 +33,5 @@ from .stats import get_stats_for_project
from .members import create_members_in_bulk
from .members import get_members_from_bulk
from .invitations import send_invitation

View File

@ -0,0 +1,8 @@
from djmail.template_mail import MagicMailBuilder
def send_invitation(invitation):
"""Send an invitation email"""
mbuilder = MagicMailBuilder()
email = mbuilder.membership_invitation(invitation.email, {"membership": invitation})
email.send()

View File

@ -348,6 +348,23 @@ def create_membership(**kwargs):
return MembershipFactory.create(**defaults)
def create_invitation(**kwargs):
"Create an invitation along with its dependencies"
project = kwargs.pop("project", ProjectFactory())
project.points.add(PointsFactory.create(project=project, value=None))
defaults = {
"project": project,
"role": RoleFactory.create(project=project),
"email": "invited-user@email.com",
"token": "tokenvalue",
"invited_by_id": project.owner.id
}
defaults.update(kwargs)
return MembershipFactory.create(**defaults)
def create_userstory(**kwargs):
"Create an user story along with its dependencies"
project = kwargs.pop("project", ProjectFactory())

View File

@ -32,3 +32,10 @@ def client():
from testclient_extensions import Client
return Client()
@pytest.fixture
def outbox():
from django.core import mail
return mail.outbox

View File

@ -51,3 +51,15 @@ def test_api_create_bulk_members(client):
assert response.status_code == 200
assert response.data[0]["email"] == john.email
assert response.data[1]["email"] == joseph.email
def test_api_resend_invitation(client, outbox):
invitation = f.create_invitation()
url = reverse("memberships-resend-invitation", kwargs={"pk": invitation.pk})
client.login(invitation.project.owner)
response = client.post(url)
assert response.status_code == 204
assert len(outbox) == 1
assert outbox[0].to == [invitation.email]