From 3f8af102ab2ff8d330d3f7809434f638ee75cead Mon Sep 17 00:00:00 2001 From: Anler Hp Date: Fri, 25 Jul 2014 12:40:50 +0200 Subject: [PATCH] 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. --- taiga/projects/api.py | 2 ++ taiga/projects/services/__init__.py | 1 + taiga/projects/services/invitations.py | 20 ++++++++++++++++++- .../membership_notification-body-html.jinja | 12 +++++++++++ .../membership_notification-body-text.jinja | 3 +++ .../membership_notification-subject.jinja | 1 + tests/integration/test_memberships.py | 19 ++++++++++++++++++ 7 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 taiga/projects/templates/emails/membership_notification-body-html.jinja create mode 100644 taiga/projects/templates/emails/membership_notification-body-text.jinja create mode 100644 taiga/projects/templates/emails/membership_notification-subject.jinja diff --git a/taiga/projects/api.py b/taiga/projects/api.py index 3f256081..28ae6099 100644 --- a/taiga/projects/api.py +++ b/taiga/projects/api.py @@ -190,6 +190,8 @@ class MembershipViewSet(ModelCrudViewSet): if not object.token: object.token = str(uuid.uuid1()) + object.user = services.find_invited_user(object, default=object.user) + super().pre_save(object) def post_save(self, object, created=False): diff --git a/taiga/projects/services/__init__.py b/taiga/projects/services/__init__.py index 4f46c6af..236bbf54 100644 --- a/taiga/projects/services/__init__.py +++ b/taiga/projects/services/__init__.py @@ -35,3 +35,4 @@ from .members import create_members_in_bulk from .members import get_members_from_bulk from .invitations import send_invitation +from .invitations import find_invited_user diff --git a/taiga/projects/services/invitations.py b/taiga/projects/services/invitations.py index 34e23010..13ca2743 100644 --- a/taiga/projects/services/invitations.py +++ b/taiga/projects/services/invitations.py @@ -4,5 +4,23 @@ from djmail.template_mail import MagicMailBuilder def send_invitation(invitation): """Send an invitation email""" 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() + + +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 diff --git a/taiga/projects/templates/emails/membership_notification-body-html.jinja b/taiga/projects/templates/emails/membership_notification-body-html.jinja new file mode 100644 index 00000000..efb01532 --- /dev/null +++ b/taiga/projects/templates/emails/membership_notification-body-html.jinja @@ -0,0 +1,12 @@ +{% extends "emails/base.jinja" %} + +{% block body %} + + + + +
+

Hi,

+

you have been added to the project '{{ membership.project }}'.

+
+{% endblock %} diff --git a/taiga/projects/templates/emails/membership_notification-body-text.jinja b/taiga/projects/templates/emails/membership_notification-body-text.jinja new file mode 100644 index 00000000..ada8a450 --- /dev/null +++ b/taiga/projects/templates/emails/membership_notification-body-text.jinja @@ -0,0 +1,3 @@ +Hi, + +you have been added to the project '{{ membership.project }}'. diff --git a/taiga/projects/templates/emails/membership_notification-subject.jinja b/taiga/projects/templates/emails/membership_notification-subject.jinja new file mode 100644 index 00000000..1e45591b --- /dev/null +++ b/taiga/projects/templates/emails/membership_notification-subject.jinja @@ -0,0 +1 @@ +[Taiga] Added to the project '{{ membership.project|safe }}' diff --git a/tests/integration/test_memberships.py b/tests/integration/test_memberships.py index 148dccfd..2a2f5b35 100644 --- a/tests/integration/test_memberships.py +++ b/tests/integration/test_memberships.py @@ -63,3 +63,22 @@ def test_api_resend_invitation(client, outbox): assert response.status_code == 204 assert len(outbox) == 1 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