1
0
mirror of https://github.com/taigaio/taiga-back synced 2025-10-06 00:02:52 +02:00
Files
taiga-back/taiga/export_import/services/validations.py
David Barragán Merino e7fad0b5cc chore: migrate to django 3.2
2023-02-24 13:05:37 +01:00

50 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.utils.translation import gettext as _
def has_available_slot_for_new_project(owner, is_private, member_emails):
"""Return if user has enought slots to create a new projects.
:param owner: The new owner.
:param is_private: 'True' if new project will be private.
:param member_emails: A list of user ids for new members.
:return: (bool, error_mesage, int) return a tuple (can be duplicated, error message, total new project members).
"""
current_projects = owner.owned_projects.filter(is_private=is_private).count()
Membership = apps.get_model("projects", "Membership")
actual_emails_members = (Membership.objects.filter(project__is_private=is_private,
project__owner_id=owner.id,
user_id__isnull=False)
.order_by("user__email")
.distinct("user__email")
.values_list("user__email", flat=True))
total_memberships = len(set(list(actual_emails_members) + member_emails) - set([owner.email])) + 1
if is_private:
max_projects = owner.max_private_projects
max_memberships = owner.max_memberships_private_projects
error_project_exceeded = _("You can't have more private projects")
error_memberships_exceeded = _("This project reaches your current limit of memberships for private projects")
else:
max_projects = owner.max_public_projects
max_memberships = owner.max_memberships_public_projects
error_project_exceeded = _("You can't have more public projects")
error_memberships_exceeded = _("This project reaches your current limit of memberships for public projects")
if max_projects is not None and current_projects >= max_projects:
return (False, error_project_exceeded, total_memberships)
if max_memberships is not None and total_memberships > max_memberships:
return (False, error_memberships_exceeded, total_memberships)
return (True, None, total_memberships)