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
parent
ff3269c22c
commit
8eed0d03e5
|
@ -22,3 +22,5 @@ SOUTH_TESTS_MIGRATE = False
|
||||||
CELERY_ALWAYS_EAGER = True
|
CELERY_ALWAYS_EAGER = True
|
||||||
|
|
||||||
MEDIA_ROOT = "/tmp"
|
MEDIA_ROOT = "/tmp"
|
||||||
|
|
||||||
|
EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend"
|
||||||
|
|
|
@ -25,8 +25,6 @@ from rest_framework.exceptions import ParseError
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
|
|
||||||
from djmail.template_mail import MagicMailBuilder
|
|
||||||
|
|
||||||
from taiga.base import filters
|
from taiga.base import filters
|
||||||
from taiga.base import exceptions as exc
|
from taiga.base import exceptions as exc
|
||||||
from taiga.base.decorators import list_route
|
from taiga.base.decorators import list_route
|
||||||
|
@ -182,6 +180,11 @@ class MembershipViewSet(ModelCrudViewSet):
|
||||||
members_serialized = self.serializer_class(members, many=True)
|
members_serialized = self.serializer_class(members, many=True)
|
||||||
return Response(data=members_serialized.data)
|
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):
|
def pre_save(self, object):
|
||||||
# Only assign new token if a current token value is empty.
|
# Only assign new token if a current token value is empty.
|
||||||
if not object.token:
|
if not object.token:
|
||||||
|
@ -196,9 +199,7 @@ class MembershipViewSet(ModelCrudViewSet):
|
||||||
return
|
return
|
||||||
|
|
||||||
# Send email only if a new membership is created
|
# Send email only if a new membership is created
|
||||||
mbuilder = MagicMailBuilder()
|
services.send_invitation(invitation=object)
|
||||||
email = mbuilder.membership_invitation(object.email, {"membership": object})
|
|
||||||
email.send()
|
|
||||||
|
|
||||||
|
|
||||||
class InvitationViewSet(ModelListViewSet):
|
class InvitationViewSet(ModelListViewSet):
|
||||||
|
|
|
@ -33,3 +33,5 @@ from .stats import get_stats_for_project
|
||||||
|
|
||||||
from .members import create_members_in_bulk
|
from .members import create_members_in_bulk
|
||||||
from .members import get_members_from_bulk
|
from .members import get_members_from_bulk
|
||||||
|
|
||||||
|
from .invitations import send_invitation
|
||||||
|
|
|
@ -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()
|
|
@ -348,6 +348,23 @@ def create_membership(**kwargs):
|
||||||
return MembershipFactory.create(**defaults)
|
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):
|
def create_userstory(**kwargs):
|
||||||
"Create an user story along with its dependencies"
|
"Create an user story along with its dependencies"
|
||||||
project = kwargs.pop("project", ProjectFactory())
|
project = kwargs.pop("project", ProjectFactory())
|
||||||
|
|
|
@ -32,3 +32,10 @@ def client():
|
||||||
from testclient_extensions import Client
|
from testclient_extensions import Client
|
||||||
|
|
||||||
return Client()
|
return Client()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def outbox():
|
||||||
|
from django.core import mail
|
||||||
|
|
||||||
|
return mail.outbox
|
||||||
|
|
|
@ -51,3 +51,15 @@ def test_api_create_bulk_members(client):
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
assert response.data[0]["email"] == john.email
|
assert response.data[0]["email"] == john.email
|
||||||
assert response.data[1]["email"] == joseph.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]
|
||||||
|
|
Loading…
Reference in New Issue