diff --git a/taiga/base/utils/db.py b/taiga/base/utils/db.py index 3ef8ba6e..f1d59adb 100644 --- a/taiga/base/utils/db.py +++ b/taiga/base/utils/db.py @@ -62,7 +62,7 @@ def save_in_bulk(instances, callback=None, precall=None, **save_options): precall(instance) instance.save(**save_options) - callback(instance, created=True) + callback(instance) @transaction.atomic diff --git a/taiga/projects/api.py b/taiga/projects/api.py index 9b623739..07a5bb7c 100644 --- a/taiga/projects/api.py +++ b/taiga/projects/api.py @@ -205,6 +205,15 @@ class MembershipViewSet(ModelCrudViewSet): services.send_invitation(invitation=invitation) 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: + 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): super().post_save(object, created=created) diff --git a/taiga/projects/models.py b/taiga/projects/models.py index 317ef5e2..6f943491 100644 --- a/taiga/projects/models.py +++ b/taiga/projects/models.py @@ -15,7 +15,6 @@ # along with this program. If not, see . import itertools -import uuid from django.core.exceptions import ValidationError from django.db import models @@ -32,7 +31,7 @@ from djorm_pgarray.fields import TextArrayField from taiga.permissions.permissions import ANON_PERMISSIONS, USER_PERMISSIONS from taiga.base.tags import TaggedMixin -from taiga.users.models import User, Role +from taiga.users.models import Role from taiga.base.utils.slug import slugify_uniquely from taiga.base.utils.dicts import dict_sum from taiga.base.utils.sequence import arithmetic_progression @@ -74,14 +73,6 @@ class Membership(models.Model): if self.user and memberships.count() > 0 and memberships[0].id != self.id: raise ValidationError(_('The user is already member of the project')) - def save(self, *args, **kwargs): - if not self.token: - self.token = str(uuid.uuid1()) - - self.user = User.objects.filter(email=self.email).first() - - super().save(*args, **kwargs) - class Meta: verbose_name = "membership" verbose_name_plural = "membershipss" diff --git a/taiga/projects/services/__init__.py b/taiga/projects/services/__init__.py index 54a9a343..cd394f9a 100644 --- a/taiga/projects/services/__init__.py +++ b/taiga/projects/services/__init__.py @@ -35,5 +35,6 @@ 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 from .tags_colors import update_project_tags_colors_handler diff --git a/taiga/projects/services/invitations.py b/taiga/projects/services/invitations.py index c9531eb7..13ca2743 100644 --- a/taiga/projects/services/invitations.py +++ b/taiga/projects/services/invitations.py @@ -10,3 +10,17 @@ def send_invitation(invitation): 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