taiga-back/taiga/projects/services/transfer.py

115 lines
3.5 KiB
Python

# Copyright (C) 2014-2016 Andrey Antukh <niwi@niwi.nz>
# Copyright (C) 2014-2016 Jesús Espino <jespinog@gmail.com>
# Copyright (C) 2014-2016 David Barragán <bameda@dbarragan.com>
# Copyright (C) 2014-2016 Alejandro Alonso <alejandro.alonso@kaleidos.net>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.core import signing
from django.utils.translation import ugettext as _
import datetime
from taiga.base.mails import mail_builder
from taiga.base import exceptions as exc
def request_project_transfer(project, user):
template = mail_builder.transfer_request
email = template(project.owner, {"project": project, "requester": user})
email.send()
def start_project_transfer(project, user, reason):
"""Generates the transfer token for a project transfer and notify to the destination user
:param project: Project trying to transfer
:param user: Destination user
:param reason: Reason to transfer the project
"""
signer = signing.TimestampSigner()
token = signer.sign(user.id)
project.transfer_token = token
project.save()
template = mail_builder.transfer_start
context = {
"project": project,
"receiver": user,
"token": token,
"reason": reason
}
email = template(project.owner, context)
email.send()
def validate_project_transfer_token(token, project, user):
signer = signing.TimestampSigner()
if project.transfer_token != token:
raise exc.WrongArguments(_("Token is invalid"))
try:
value = signer.unsign(token, max_age=datetime.timedelta(days=7))
except signing.SignatureExpired:
raise exc.WrongArguments(_("Token has expired"))
except signing.BadSignature:
raise exc.WrongArguments(_("Token is invalid"))
if str(value) != str(user.id):
raise exc.WrongArguments(_("Token is invalid"))
def reject_project_transfer(project, user, token, reason):
validate_project_transfer_token(token, project, user)
project.transfer_token = None
project.save()
template = mail_builder.transfer_reject
context = {
"project": project,
"rejecter": user,
"reason": reason
}
email = template(project.owner, context)
email.send()
def accept_project_transfer(project, user, token, reason):
validate_project_transfer_token(token, project, user)
# Set new owner as project admin
membership = project.memberships.get(user=user)
if not membership.is_admin:
membership.is_admin = True
membership.save()
# Change the owner of the project
old_owner = project.owner
project.transfer_token = None
project.owner = user
project.save()
# Send mail
template = mail_builder.transfer_accept
context = {
"project": project,
"old_owner": old_owner,
"new_owner": user,
"reason": reason
}
email = template(old_owner, context)
email.send()