Task #400 - Autolink user to membership if exists
When inviting an user to a project, if the user is already registered, link her directly to the membership.remotes/origin/enhancement/email-actions
parent
aa117623e8
commit
3f8af102ab
|
@ -190,6 +190,8 @@ class MembershipViewSet(ModelCrudViewSet):
|
||||||
if not object.token:
|
if not object.token:
|
||||||
object.token = str(uuid.uuid1())
|
object.token = str(uuid.uuid1())
|
||||||
|
|
||||||
|
object.user = services.find_invited_user(object, default=object.user)
|
||||||
|
|
||||||
super().pre_save(object)
|
super().pre_save(object)
|
||||||
|
|
||||||
def post_save(self, object, created=False):
|
def post_save(self, object, created=False):
|
||||||
|
|
|
@ -35,3 +35,4 @@ 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
|
from .invitations import send_invitation
|
||||||
|
from .invitations import find_invited_user
|
||||||
|
|
|
@ -4,5 +4,23 @@ from djmail.template_mail import MagicMailBuilder
|
||||||
def send_invitation(invitation):
|
def send_invitation(invitation):
|
||||||
"""Send an invitation email"""
|
"""Send an invitation email"""
|
||||||
mbuilder = MagicMailBuilder()
|
mbuilder = MagicMailBuilder()
|
||||||
email = mbuilder.membership_invitation(invitation.email, {"membership": invitation})
|
if invitation.user:
|
||||||
|
template = mbuilder.membership_notification
|
||||||
|
else:
|
||||||
|
template = mbuilder.membership_invitation
|
||||||
|
email = template(invitation.email, {"membership": invitation})
|
||||||
email.send()
|
email.send()
|
||||||
|
|
||||||
|
|
||||||
|
def find_invited_user(invitation, default=None):
|
||||||
|
"""Check if the invited user is already a registered.
|
||||||
|
|
||||||
|
:param invitation: Invitation object.
|
||||||
|
:param default: Default object to return if user is not found.
|
||||||
|
|
||||||
|
:return: The user if it's found, othwerwise return `default`.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
return type(invitation).user.get_queryset().filter(email=invitation.email).all()[0]
|
||||||
|
except IndexError:
|
||||||
|
return default
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
{% extends "emails/base.jinja" %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
<table border="0" width="100%" cellpadding="0" cellspacing="0" class="table-body">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>Hi,</p>
|
||||||
|
<p>you have been added to the project '{{ membership.project }}'.</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,3 @@
|
||||||
|
Hi,
|
||||||
|
|
||||||
|
you have been added to the project '{{ membership.project }}'.
|
|
@ -0,0 +1 @@
|
||||||
|
[Taiga] Added to the project '{{ membership.project|safe }}'
|
|
@ -63,3 +63,22 @@ def test_api_resend_invitation(client, outbox):
|
||||||
assert response.status_code == 204
|
assert response.status_code == 204
|
||||||
assert len(outbox) == 1
|
assert len(outbox) == 1
|
||||||
assert outbox[0].to == [invitation.email]
|
assert outbox[0].to == [invitation.email]
|
||||||
|
|
||||||
|
|
||||||
|
def test_api_invite_existing_user(client, outbox):
|
||||||
|
"Should create the invitation linked to that user"
|
||||||
|
user = f.UserFactory.create()
|
||||||
|
role = f.RoleFactory.create()
|
||||||
|
url = reverse("memberships-list")
|
||||||
|
data = {"role": role.pk, "project": role.project.pk, "email": user.email}
|
||||||
|
|
||||||
|
response = client.json.post(url, data)
|
||||||
|
|
||||||
|
assert response.status_code == 201, response.data
|
||||||
|
assert len(outbox) == 1
|
||||||
|
assert user.memberships.count() == 1
|
||||||
|
|
||||||
|
message = outbox[0]
|
||||||
|
|
||||||
|
assert message.to == [user.email]
|
||||||
|
assert "Added to the project" in message.subject
|
||||||
|
|
Loading…
Reference in New Issue