Updating anon and public permissions when project is public

remotes/origin/enhancement/email-actions
Alejandro Alonso 2015-02-05 15:07:12 +01:00 committed by David Barragán Merino
parent 79e9682531
commit 44e6f7c42d
4 changed files with 32 additions and 1 deletions

View File

@ -250,6 +250,7 @@ class MembersFilterBackend(PermissionBasedFilterBackend):
if request.user.is_authenticated() and request.user.is_superuser: if request.user.is_authenticated() and request.user.is_superuser:
qs = qs qs = qs
elif request.user.is_authenticated(): elif request.user.is_authenticated():
Membership = apps.get_model('projects', 'Membership')
memberships_qs = Membership.objects.filter(user=request.user) memberships_qs = Membership.objects.filter(user=request.user)
if project_id: if project_id:
memberships_qs = memberships_qs.filter(project_id=project_id) memberships_qs = memberships_qs.filter(project_id=project_id)

View File

@ -103,3 +103,12 @@ def get_user_project_permissions(user, project):
anon_permissions = project.anon_permissions if project.anon_permissions is not None else [] anon_permissions = project.anon_permissions if project.anon_permissions is not None else []
return set(owner_permissions + members_permissions + public_permissions + anon_permissions) 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))

View File

@ -36,6 +36,7 @@ from taiga.projects.mixins.on_destroy import MoveOnDestroyMixin
from taiga.projects.userstories.models import UserStory from taiga.projects.userstories.models import UserStory
from taiga.projects.tasks.models import Task from taiga.projects.tasks.models import Task
from taiga.projects.issues.models import Issue from taiga.projects.issues.models import Issue
from taiga.permissions import service as permissions_service
from . import serializers from . import serializers
from . import models from . import models
@ -46,7 +47,6 @@ from .votes import serializers as votes_serializers
from .votes import services as votes_service from .votes import services as votes_service
from .votes.utils import attach_votescount_to_queryset from .votes.utils import attach_votescount_to_queryset
###################################################### ######################################################
## Project ## Project
###################################################### ######################################################
@ -176,6 +176,10 @@ class ProjectViewSet(ModelCrudViewSet):
if not obj.id: if not obj.id:
obj.template = self.request.QUERY_PARAMS.get('template', None) 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)
super().pre_save(obj) super().pre_save(obj)
def destroy(self, request, *args, **kwargs): def destroy(self, request, *args, **kwargs):

View File

@ -2,6 +2,7 @@ from django.core.urlresolvers import reverse
from taiga.base.utils import json from taiga.base.utils import json
from taiga.projects.services import stats as stats_services from taiga.projects.services import stats as stats_services
from taiga.projects.history.services import take_snapshot from taiga.projects.history.services import take_snapshot
from taiga.permissions.permissions import ANON_PERMISSIONS
from .. import factories as f from .. import factories as f
@ -235,3 +236,19 @@ def test_edit_membership_only_owner(client):
response = client.json.patch(url, json.dumps(data)) response = client.json.patch(url, json.dumps(data))
assert response.status_code == 400 assert response.status_code == 400
assert response.data["is_owner"][0] == "At least one of the user must be an active admin" assert response.data["is_owner"][0] == "At least one of the user must be an active admin"
def test_anon_permissions_generation_when_making_project_public(client):
user = f.UserFactory.create()
project = f.ProjectFactory.create(is_private=True)
role = f.RoleFactory.create(project=project, permissions=["view_project", "modify_project"])
membership = f.MembershipFactory.create(project=project, user=user, role=role, is_owner=True)
assert project.anon_permissions == []
client.login(user)
url = reverse("projects-detail", kwargs={"pk": project.pk})
data = {"is_private": False}
response = client.json.patch(url, json.dumps(data))
assert response.status_code == 200
anon_permissions = list(map(lambda perm: perm[0], ANON_PERMISSIONS))
assert set(anon_permissions).issubset(set(response.data["anon_permissions"]))
assert set(anon_permissions).issubset(set(response.data["public_permissions"]))