Merge pull request #665 from taigaio/fix/change-max_members-to-max_memberships-in-user-model
Change max_members_*_projects to max_memberships_*_projectsremotes/origin/issue/4795/notification_even_they_are_disabled
commit
2176e9a0af
|
@ -527,8 +527,8 @@ EXTRA_BLOCKING_CODES = []
|
||||||
|
|
||||||
MAX_PRIVATE_PROJECTS_PER_USER = None # None == no limit
|
MAX_PRIVATE_PROJECTS_PER_USER = None # None == no limit
|
||||||
MAX_PUBLIC_PROJECTS_PER_USER = None # None == no limit
|
MAX_PUBLIC_PROJECTS_PER_USER = None # None == no limit
|
||||||
MAX_MEMBERS_PRIVATE_PROJECTS = None # None == no limit
|
MAX_MEMBERSHIPS_PRIVATE_PROJECTS = None # None == no limit
|
||||||
MAX_MEMBERS_PUBLIC_PROJECTS = None # None == no limit
|
MAX_MEMBERSHIPS_PUBLIC_PROJECTS = None # None == no limit
|
||||||
|
|
||||||
from .sr import *
|
from .sr import *
|
||||||
|
|
||||||
|
|
|
@ -52,8 +52,8 @@ class UserAdmin(DjangoUserAdmin):
|
||||||
(_("Extra info"), {"fields": ("color", "lang", "timezone", "token", "colorize_tags",
|
(_("Extra info"), {"fields": ("color", "lang", "timezone", "token", "colorize_tags",
|
||||||
"email_token", "new_email")}),
|
"email_token", "new_email")}),
|
||||||
(_("Permissions"), {"fields": ("is_active", "is_superuser")}),
|
(_("Permissions"), {"fields": ("is_active", "is_superuser")}),
|
||||||
(_("Restrictions"), {"fields": (("max_private_projects", "max_members_private_projects"),
|
(_("Restrictions"), {"fields": (("max_private_projects", "max_memberships_private_projects"),
|
||||||
("max_public_projects", "max_members_public_projects"))}),
|
("max_public_projects", "max_memberships_public_projects"))}),
|
||||||
(_("Important dates"), {"fields": ("last_login", "date_joined")}),
|
(_("Important dates"), {"fields": ("last_login", "date_joined")}),
|
||||||
)
|
)
|
||||||
form = UserChangeForm
|
form = UserChangeForm
|
||||||
|
|
|
@ -14,12 +14,12 @@ class Migration(migrations.Migration):
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='user',
|
model_name='user',
|
||||||
name='max_members_private_projects',
|
name='max_memberships_private_projects',
|
||||||
field=models.IntegerField(default=settings.MAX_MEMBERS_PRIVATE_PROJECTS, blank=True, verbose_name='max number of memberships for each owned private project', null=True),
|
field=models.IntegerField(default=settings.MAX_MEMBERSHIPS_PRIVATE_PROJECTS, blank=True, verbose_name='max number of memberships for each owned private project', null=True),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='user',
|
model_name='user',
|
||||||
name='max_members_public_projects',
|
name='max_memberships_public_projects',
|
||||||
field=models.IntegerField(default=settings.MAX_MEMBERS_PUBLIC_PROJECTS, blank=True, verbose_name='max number of memberships for each owned public project', null=True),
|
field=models.IntegerField(default=settings.MAX_MEMBERSHIPS_PUBLIC_PROJECTS, blank=True, verbose_name='max number of memberships for each owned public project', null=True),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -130,12 +130,12 @@ class User(AbstractBaseUser, PermissionsMixin):
|
||||||
max_public_projects = models.IntegerField(null=True, blank=True,
|
max_public_projects = models.IntegerField(null=True, blank=True,
|
||||||
default=settings.MAX_PUBLIC_PROJECTS_PER_USER,
|
default=settings.MAX_PUBLIC_PROJECTS_PER_USER,
|
||||||
verbose_name=_("max number of public projects owned"))
|
verbose_name=_("max number of public projects owned"))
|
||||||
max_members_private_projects = models.IntegerField(null=True, blank=True,
|
max_memberships_private_projects = models.IntegerField(null=True, blank=True,
|
||||||
default=settings.MAX_MEMBERS_PRIVATE_PROJECTS,
|
default=settings.MAX_MEMBERSHIPS_PRIVATE_PROJECTS,
|
||||||
verbose_name=_("max number of memberships for "
|
verbose_name=_("max number of memberships for "
|
||||||
"each owned private project"))
|
"each owned private project"))
|
||||||
max_members_public_projects = models.IntegerField(null=True, blank=True,
|
max_memberships_public_projects = models.IntegerField(null=True, blank=True,
|
||||||
default=settings.MAX_MEMBERS_PUBLIC_PROJECTS,
|
default=settings.MAX_MEMBERSHIPS_PUBLIC_PROJECTS,
|
||||||
verbose_name=_("max number of memberships for "
|
verbose_name=_("max number of memberships for "
|
||||||
"each owned public project"))
|
"each owned public project"))
|
||||||
|
|
||||||
|
|
|
@ -115,13 +115,13 @@ class UserAdminSerializer(UserSerializer):
|
||||||
"color", "bio", "lang", "theme", "timezone", "is_active", "photo",
|
"color", "bio", "lang", "theme", "timezone", "is_active", "photo",
|
||||||
"big_photo",
|
"big_photo",
|
||||||
"max_private_projects", "max_public_projects",
|
"max_private_projects", "max_public_projects",
|
||||||
"max_members_private_projects", "max_members_public_projects",
|
"max_memberships_private_projects", "max_memberships_public_projects",
|
||||||
"total_private_projects", "total_public_projects")
|
"total_private_projects", "total_public_projects")
|
||||||
|
|
||||||
read_only_fields = ("id", "email",
|
read_only_fields = ("id", "email",
|
||||||
"max_private_projects", "max_public_projects",
|
"max_private_projects", "max_public_projects",
|
||||||
"max_members_private_projects",
|
"max_memberships_private_projects",
|
||||||
"max_members_public_projects")
|
"max_memberships_public_projects")
|
||||||
|
|
||||||
def get_total_private_projects(self, user):
|
def get_total_private_projects(self, user):
|
||||||
return user.owned_projects.filter(is_private=True).count()
|
return user.owned_projects.filter(is_private=True).count()
|
||||||
|
|
|
@ -601,14 +601,14 @@ def _has_available_slot_for_project_members(user, project, members):
|
||||||
current_memberships = project.memberships.count()
|
current_memberships = project.memberships.count()
|
||||||
|
|
||||||
if project.is_private:
|
if project.is_private:
|
||||||
if user.max_members_private_projects is None:
|
if user.max_memberships_private_projects is None:
|
||||||
return (True, None)
|
return (True, None)
|
||||||
elif current_memberships + members <= user.max_members_private_projects:
|
elif current_memberships + members <= user.max_memberships_private_projects:
|
||||||
return (True, None)
|
return (True, None)
|
||||||
return (False, _("You have reached the limit of memberships for private projects"))
|
return (False, _("You have reached the limit of memberships for private projects"))
|
||||||
else:
|
else:
|
||||||
if user.max_members_public_projects is None:
|
if user.max_memberships_public_projects is None:
|
||||||
return (True, None)
|
return (True, None)
|
||||||
elif current_memberships + members <= user.max_members_public_projects:
|
elif current_memberships + members <= user.max_memberships_public_projects:
|
||||||
return (True, None)
|
return (True, None)
|
||||||
return (False, _("You have reached the limit of memberships for public projects"))
|
return (False, _("You have reached the limit of memberships for public projects"))
|
||||||
|
|
|
@ -1031,7 +1031,7 @@ def test_dict_to_project_with_no_projects_slots_available(client):
|
||||||
|
|
||||||
|
|
||||||
def test_dict_to_project_with_no_members_private_project_slots_available(client):
|
def test_dict_to_project_with_no_members_private_project_slots_available(client):
|
||||||
user = f.UserFactory.create(max_members_private_projects=2)
|
user = f.UserFactory.create(max_memberships_private_projects=2)
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
"slug": "valid-project",
|
"slug": "valid-project",
|
||||||
|
@ -1066,7 +1066,7 @@ def test_dict_to_project_with_no_members_private_project_slots_available(client)
|
||||||
|
|
||||||
|
|
||||||
def test_dict_to_project_with_no_members_public_project_slots_available(client):
|
def test_dict_to_project_with_no_members_public_project_slots_available(client):
|
||||||
user = f.UserFactory.create(max_members_public_projects=2)
|
user = f.UserFactory.create(max_memberships_public_projects=2)
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
"slug": "valid-project",
|
"slug": "valid-project",
|
||||||
|
@ -1281,7 +1281,7 @@ def test_valid_dump_import_without_enough_private_projects_slots(client):
|
||||||
|
|
||||||
|
|
||||||
def test_valid_dump_import_without_enough_membership_private_project_slots_one_project(client):
|
def test_valid_dump_import_without_enough_membership_private_project_slots_one_project(client):
|
||||||
user = f.UserFactory.create(max_members_private_projects=5)
|
user = f.UserFactory.create(max_memberships_private_projects=5)
|
||||||
client.login(user)
|
client.login(user)
|
||||||
|
|
||||||
url = reverse("importer-load-dump")
|
url = reverse("importer-load-dump")
|
||||||
|
@ -1328,7 +1328,7 @@ def test_valid_dump_import_without_enough_membership_private_project_slots_one_p
|
||||||
|
|
||||||
|
|
||||||
def test_valid_dump_import_without_enough_membership_public_project_slots_one_project(client):
|
def test_valid_dump_import_without_enough_membership_public_project_slots_one_project(client):
|
||||||
user = f.UserFactory.create(max_members_public_projects=5)
|
user = f.UserFactory.create(max_memberships_public_projects=5)
|
||||||
client.login(user)
|
client.login(user)
|
||||||
|
|
||||||
url = reverse("importer-load-dump")
|
url = reverse("importer-load-dump")
|
||||||
|
@ -1377,7 +1377,7 @@ def test_valid_dump_import_without_enough_membership_public_project_slots_one_pr
|
||||||
def test_valid_dump_import_with_enough_membership_private_project_slots_multiple_projects(client, settings):
|
def test_valid_dump_import_with_enough_membership_private_project_slots_multiple_projects(client, settings):
|
||||||
settings.CELERY_ENABLED = False
|
settings.CELERY_ENABLED = False
|
||||||
|
|
||||||
user = f.UserFactory.create(max_members_private_projects=10)
|
user = f.UserFactory.create(max_memberships_private_projects=10)
|
||||||
project = f.ProjectFactory.create(owner=user)
|
project = f.ProjectFactory.create(owner=user)
|
||||||
f.MembershipFactory.create(project=project)
|
f.MembershipFactory.create(project=project)
|
||||||
f.MembershipFactory.create(project=project)
|
f.MembershipFactory.create(project=project)
|
||||||
|
@ -1433,7 +1433,7 @@ def test_valid_dump_import_with_enough_membership_private_project_slots_multiple
|
||||||
def test_valid_dump_import_with_enough_membership_public_project_slots_multiple_projects(client, settings):
|
def test_valid_dump_import_with_enough_membership_public_project_slots_multiple_projects(client, settings):
|
||||||
settings.CELERY_ENABLED = False
|
settings.CELERY_ENABLED = False
|
||||||
|
|
||||||
user = f.UserFactory.create(max_members_public_projects=10)
|
user = f.UserFactory.create(max_memberships_public_projects=10)
|
||||||
project = f.ProjectFactory.create(owner=user)
|
project = f.ProjectFactory.create(owner=user)
|
||||||
f.MembershipFactory.create(project=project)
|
f.MembershipFactory.create(project=project)
|
||||||
f.MembershipFactory.create(project=project)
|
f.MembershipFactory.create(project=project)
|
||||||
|
|
|
@ -54,7 +54,7 @@ def test_api_create_bulk_members(client):
|
||||||
|
|
||||||
|
|
||||||
def test_api_create_bulk_members_without_enough_memberships_private_project_slots_one_project(client):
|
def test_api_create_bulk_members_without_enough_memberships_private_project_slots_one_project(client):
|
||||||
user = f.UserFactory.create(max_members_private_projects=3)
|
user = f.UserFactory.create(max_memberships_private_projects=3)
|
||||||
project = f.ProjectFactory(owner=user, is_private=True)
|
project = f.ProjectFactory(owner=user, is_private=True)
|
||||||
role = f.RoleFactory(project=project, name="Test")
|
role = f.RoleFactory(project=project, name="Test")
|
||||||
f.MembershipFactory(project=project, user=user, is_admin=True)
|
f.MembershipFactory(project=project, user=user, is_admin=True)
|
||||||
|
@ -78,7 +78,7 @@ def test_api_create_bulk_members_without_enough_memberships_private_project_slot
|
||||||
|
|
||||||
|
|
||||||
def test_api_create_bulk_members_with_enough_memberships_private_project_slots_multiple_projects(client):
|
def test_api_create_bulk_members_with_enough_memberships_private_project_slots_multiple_projects(client):
|
||||||
user = f.UserFactory.create(max_members_private_projects=6)
|
user = f.UserFactory.create(max_memberships_private_projects=6)
|
||||||
project = f.ProjectFactory(owner=user, is_private=True)
|
project = f.ProjectFactory(owner=user, is_private=True)
|
||||||
role = f.RoleFactory(project=project, name="Test")
|
role = f.RoleFactory(project=project, name="Test")
|
||||||
f.MembershipFactory(project=project, user=user, is_admin=True)
|
f.MembershipFactory(project=project, user=user, is_admin=True)
|
||||||
|
@ -107,7 +107,7 @@ def test_api_create_bulk_members_with_enough_memberships_private_project_slots_m
|
||||||
|
|
||||||
|
|
||||||
def test_api_create_bulk_members_without_enough_memberships_public_project_slots_one_project(client):
|
def test_api_create_bulk_members_without_enough_memberships_public_project_slots_one_project(client):
|
||||||
user = f.UserFactory.create(max_members_public_projects=3)
|
user = f.UserFactory.create(max_memberships_public_projects=3)
|
||||||
project = f.ProjectFactory(owner=user, is_private=False)
|
project = f.ProjectFactory(owner=user, is_private=False)
|
||||||
role = f.RoleFactory(project=project, name="Test")
|
role = f.RoleFactory(project=project, name="Test")
|
||||||
f.MembershipFactory(project=project, user=user, is_admin=True)
|
f.MembershipFactory(project=project, user=user, is_admin=True)
|
||||||
|
@ -131,7 +131,7 @@ def test_api_create_bulk_members_without_enough_memberships_public_project_slots
|
||||||
|
|
||||||
|
|
||||||
def test_api_create_bulk_members_with_enough_memberships_public_project_slots_multiple_projects(client):
|
def test_api_create_bulk_members_with_enough_memberships_public_project_slots_multiple_projects(client):
|
||||||
user = f.UserFactory.create(max_members_public_projects=6)
|
user = f.UserFactory.create(max_memberships_public_projects=6)
|
||||||
project = f.ProjectFactory(owner=user, is_private=False)
|
project = f.ProjectFactory(owner=user, is_private=False)
|
||||||
role = f.RoleFactory(project=project, name="Test")
|
role = f.RoleFactory(project=project, name="Test")
|
||||||
f.MembershipFactory(project=project, user=user, is_admin=True)
|
f.MembershipFactory(project=project, user=user, is_admin=True)
|
||||||
|
@ -269,7 +269,7 @@ def test_api_create_membership(client):
|
||||||
|
|
||||||
|
|
||||||
def test_api_create_membership_without_enough_memberships_private_project_slots_one_projects(client):
|
def test_api_create_membership_without_enough_memberships_private_project_slots_one_projects(client):
|
||||||
user = f.UserFactory.create(max_members_private_projects=1)
|
user = f.UserFactory.create(max_memberships_private_projects=1)
|
||||||
project = f.ProjectFactory(owner=user, is_private=True)
|
project = f.ProjectFactory(owner=user, is_private=True)
|
||||||
role = f.RoleFactory(project=project, name="Test")
|
role = f.RoleFactory(project=project, name="Test")
|
||||||
f.MembershipFactory(project=project, user=user, is_admin=True)
|
f.MembershipFactory(project=project, user=user, is_admin=True)
|
||||||
|
@ -284,7 +284,7 @@ def test_api_create_membership_without_enough_memberships_private_project_slots_
|
||||||
|
|
||||||
|
|
||||||
def test_api_create_membership_with_enough_memberships_private_project_slots_multiple_projects(client):
|
def test_api_create_membership_with_enough_memberships_private_project_slots_multiple_projects(client):
|
||||||
user = f.UserFactory.create(max_members_private_projects=5)
|
user = f.UserFactory.create(max_memberships_private_projects=5)
|
||||||
project = f.ProjectFactory(owner=user, is_private=True)
|
project = f.ProjectFactory(owner=user, is_private=True)
|
||||||
role = f.RoleFactory(project=project, name="Test")
|
role = f.RoleFactory(project=project, name="Test")
|
||||||
f.MembershipFactory(project=project, user=user, is_admin=True)
|
f.MembershipFactory(project=project, user=user, is_admin=True)
|
||||||
|
@ -304,7 +304,7 @@ def test_api_create_membership_with_enough_memberships_private_project_slots_mul
|
||||||
|
|
||||||
|
|
||||||
def test_api_create_membership_without_enough_memberships_public_project_slots_one_projects(client):
|
def test_api_create_membership_without_enough_memberships_public_project_slots_one_projects(client):
|
||||||
user = f.UserFactory.create(max_members_public_projects=1)
|
user = f.UserFactory.create(max_memberships_public_projects=1)
|
||||||
project = f.ProjectFactory(owner=user, is_private=False)
|
project = f.ProjectFactory(owner=user, is_private=False)
|
||||||
role = f.RoleFactory(project=project, name="Test")
|
role = f.RoleFactory(project=project, name="Test")
|
||||||
f.MembershipFactory(project=project, user=user, is_admin=True)
|
f.MembershipFactory(project=project, user=user, is_admin=True)
|
||||||
|
@ -319,7 +319,7 @@ def test_api_create_membership_without_enough_memberships_public_project_slots_o
|
||||||
|
|
||||||
|
|
||||||
def test_api_create_membership_with_enough_memberships_public_project_slots_multiple_projects(client):
|
def test_api_create_membership_with_enough_memberships_public_project_slots_multiple_projects(client):
|
||||||
user = f.UserFactory.create(max_members_public_projects=5)
|
user = f.UserFactory.create(max_memberships_public_projects=5)
|
||||||
project = f.ProjectFactory(owner=user, is_private=False)
|
project = f.ProjectFactory(owner=user, is_private=False)
|
||||||
role = f.RoleFactory(project=project, name="Test")
|
role = f.RoleFactory(project=project, name="Test")
|
||||||
f.MembershipFactory(project=project, user=user, is_admin=True)
|
f.MembershipFactory(project=project, user=user, is_admin=True)
|
||||||
|
|
|
@ -1161,7 +1161,7 @@ def test_project_transfer_accept_from_admin_member_with_valid_token_without_enou
|
||||||
|
|
||||||
def test_project_transfer_accept_from_admin_member_with_valid_token_without_enough_memberships_public_project_slots(client):
|
def test_project_transfer_accept_from_admin_member_with_valid_token_without_enough_memberships_public_project_slots(client):
|
||||||
user_from = f.UserFactory.create()
|
user_from = f.UserFactory.create()
|
||||||
user_to = f.UserFactory.create(max_members_public_projects=5)
|
user_to = f.UserFactory.create(max_memberships_public_projects=5)
|
||||||
|
|
||||||
signer = signing.TimestampSigner()
|
signer = signing.TimestampSigner()
|
||||||
token = signer.sign(user_to.id)
|
token = signer.sign(user_to.id)
|
||||||
|
@ -1195,7 +1195,7 @@ def test_project_transfer_accept_from_admin_member_with_valid_token_without_enou
|
||||||
|
|
||||||
def test_project_transfer_accept_from_admin_member_with_valid_token_without_enough_memberships_private_project_slots(client):
|
def test_project_transfer_accept_from_admin_member_with_valid_token_without_enough_memberships_private_project_slots(client):
|
||||||
user_from = f.UserFactory.create()
|
user_from = f.UserFactory.create()
|
||||||
user_to = f.UserFactory.create(max_members_private_projects=5)
|
user_to = f.UserFactory.create(max_memberships_private_projects=5)
|
||||||
|
|
||||||
signer = signing.TimestampSigner()
|
signer = signing.TimestampSigner()
|
||||||
token = signer.sign(user_to.id)
|
token = signer.sign(user_to.id)
|
||||||
|
|
Loading…
Reference in New Issue