1
0
mirror of https://github.com/taigaio/taiga-back synced 2025-10-06 00:02:52 +02:00
Files
taiga-back/taiga/projects/services/invitations.py
2021-07-27 16:47:11 +02:00

81 lines
2.4 KiB
Python

# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# Copyright (c) 2021-present Kaleidos Ventures SL
from django.apps import apps
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import transaction as tx
from django.db import IntegrityError
from django.utils.translation import ugettext as _
from taiga.base import exceptions as exc
from taiga.base.mails import mail_builder
def send_invitation(invitation):
"""Send an invitation email"""
if invitation.user:
template = mail_builder.membership_notification
email = template(invitation.user, {"membership": invitation})
else:
template = mail_builder.membership_invitation
email = template(invitation.email, {"membership": invitation})
email.send()
def find_invited_user(email, 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.
TODO: only used by importer/exporter and should be moved here
:return: The user if it's found, othwerwise return `default`.
"""
user_model = apps.get_model(settings.AUTH_USER_MODEL)
try:
return user_model.objects.get(email=email)
except user_model.DoesNotExist:
return default
def get_membership_by_token(token:str):
"""
Given an invitation token, returns a membership instance
that matches with specified token.
If not matches with any membership NotFound exception
is raised.
"""
membership_model = apps.get_model("projects", "Membership")
qs = membership_model.objects.filter(token=token)
if len(qs) == 0:
raise exc.NotFound(_("Token does not match any valid invitation."))
return qs[0]
@tx.atomic
def accept_invitation_by_existing_user(token:str, user_id:int):
user_model = get_user_model()
try:
user = user_model.objects.get(id=user_id)
except user_model.DoesNotExist:
raise exc.NotFound(_("User does not exist."))
membership = get_membership_by_token(token)
try:
membership.user = user
membership.save(update_fields=["user"])
except IntegrityError:
raise exc.IntegrityError(_("This user is already a member of the project."))
return user