diff --git a/taiga/permissions/service.py b/taiga/permissions/service.py index 3ee86821..d9df5bd7 100644 --- a/taiga/permissions/service.py +++ b/taiga/permissions/service.py @@ -105,10 +105,15 @@ def get_user_project_permissions(user, project): return set(owner_permissions + members_permissions + public_permissions + anon_permissions) -def set_base_permissions_for_public_project(project): - """ - If a project is public anonymous and registered users should have at least visualization permissions - """ - anon_permissions = list(map(lambda perm: perm[0], ANON_PERMISSIONS)) - project.anon_permissions = list(set(project.anon_permissions + anon_permissions)) - project.public_permissions = list(set(project.public_permissions + anon_permissions)) +def set_base_permissions_for_project(project): + if project.is_private: + project.anon_permissions = [] + project.public_permissions = [] + + else: + """ + If a project is public anonymous and registered users should have at least visualization permissions + """ + anon_permissions = list(map(lambda perm: perm[0], ANON_PERMISSIONS)) + project.anon_permissions = list(set(project.anon_permissions + anon_permissions)) + project.public_permissions = list(set(project.public_permissions + anon_permissions)) diff --git a/taiga/projects/api.py b/taiga/projects/api.py index 3f64ba8e..92ce7e28 100644 --- a/taiga/projects/api.py +++ b/taiga/projects/api.py @@ -168,6 +168,20 @@ class ProjectViewSet(ModelCrudViewSet): services.remove_user_from_project(request.user, project) return response.Ok() + def _set_base_permissions(self, obj): + update_permissions = False + if not obj.id: + if not obj.is_private: + # Creating a public project + update_permissions = True + else: + if self.get_object().is_private != obj.is_private: + # Changing project public state + update_permissions = True + + if update_permissions: + permissions_service.set_base_permissions_for_project(obj) + def pre_save(self, obj): if not obj.id: obj.owner = self.request.user @@ -176,10 +190,7 @@ class ProjectViewSet(ModelCrudViewSet): if not obj.id: obj.template = self.request.QUERY_PARAMS.get('template', None) - # Update anon permissions if the project is public - if obj.is_private == False: - permissions_service.set_base_permissions_for_public_project(obj) - + self._set_base_permissions(obj) super().pre_save(obj) def destroy(self, request, *args, **kwargs): diff --git a/taiga/projects/migrations/0017_fix_is_private_for_projects.py b/taiga/projects/migrations/0017_fix_is_private_for_projects.py new file mode 100644 index 00000000..c94e6a63 --- /dev/null +++ b/taiga/projects/migrations/0017_fix_is_private_for_projects.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + +def update_existing_projects(apps, schema_editor): + Project = apps.get_model("projects", "Project") + Project.objects.filter(is_private=False).update(is_private=True) + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0016_fix_json_field_not_null'), + ] + + operations = [ + migrations.AlterField( + model_name='project', + name='is_private', + field=models.BooleanField(verbose_name='is private', default=True), + preserve_default=True, + ), + migrations.RunPython(update_existing_projects), + ] diff --git a/taiga/projects/models.py b/taiga/projects/models.py index 7912ceab..05551d92 100644 --- a/taiga/projects/models.py +++ b/taiga/projects/models.py @@ -160,7 +160,7 @@ class Project(ProjectDefaults, TaggedMixin, models.Model): default=[], verbose_name=_("user permissions"), choices=USER_PERMISSIONS) - is_private = models.BooleanField(default=False, null=False, blank=True, + is_private = models.BooleanField(default=True, null=False, blank=True, verbose_name=_("is private")) tags_colors = TextArrayField(dimension=2, null=False, blank=True, verbose_name=_("tags colors"), default=[])