diff --git a/taiga/base/filters.py b/taiga/base/filters.py index a4822a12..0f993cb5 100644 --- a/taiga/base/filters.py +++ b/taiga/base/filters.py @@ -103,7 +103,7 @@ class PermissionBasedFilterBackend(FilterBackend): memberships_qs = Membership.objects.filter(user=request.user) if project_id: memberships_qs = memberships_qs.filter(project_id=project_id) - memberships_qs = memberships_qs.filter(role__permissions__contains=[self.permission]) + memberships_qs = memberships_qs.filter(Q(role__permissions__contains=[self.permission]) | Q(is_owner=True)) projects_list = [membership.project_id for membership in memberships_qs] @@ -182,7 +182,8 @@ class CanViewProjectObjFilterBackend(FilterBackend): memberships_qs = Membership.objects.filter(user=request.user) if project_id: memberships_qs = memberships_qs.filter(project_id=project_id) - memberships_qs = memberships_qs.filter(role__permissions__contains=['view_project']) + memberships_qs = memberships_qs.filter(Q(role__permissions__contains=['view_project']) | Q(is_owner=True)) + projects_list = [membership.project_id for membership in memberships_qs] qs = qs.filter(Q(id__in=projects_list) | Q(public_permissions__contains=["view_project"])) diff --git a/tests/integration/test_issues.py b/tests/integration/test_issues.py index 8f69c49d..5a3b4ac7 100644 --- a/tests/integration/test_issues.py +++ b/tests/integration/test_issues.py @@ -60,9 +60,10 @@ def test_api_create_issues_in_bulk(client): def test_api_filter_by_subject(client): - f.create_issue() - issue = f.create_issue(subject="some random subject") - url = reverse("issues-list") + "?subject=some subject" + user = f.UserFactory(is_superuser=True) + f.create_issue(owner=user) + issue = f.create_issue(subject="some random subject", owner=user) + url = reverse("issues-list") + "?q=some subject" client.login(issue.owner) response = client.get(url) @@ -73,8 +74,9 @@ def test_api_filter_by_subject(client): def test_api_filter_by_text_1(client): - f.create_issue() - issue = f.create_issue(subject="this is the issue one") + user = f.UserFactory(is_superuser=True) + f.create_issue(owner=user) + issue = f.create_issue(subject="this is the issue one", owner=user) f.create_issue(subject="this is the issue two", owner=issue.owner) url = reverse("issues-list") + "?q=one" @@ -86,8 +88,9 @@ def test_api_filter_by_text_1(client): assert number_of_issues == 1 def test_api_filter_by_text_2(client): - f.create_issue() - issue = f.create_issue(subject="this is the issue one") + user = f.UserFactory(is_superuser=True) + f.create_issue(owner=user) + issue = f.create_issue(subject="this is the issue one", owner=user) f.create_issue(subject="this is the issue two", owner=issue.owner) url = reverse("issues-list") + "?q=this is the issue one" @@ -99,8 +102,9 @@ def test_api_filter_by_text_2(client): assert number_of_issues == 1 def test_api_filter_by_text_3(client): - f.create_issue() - issue = f.create_issue(subject="this is the issue one") + user = f.UserFactory(is_superuser=True) + f.create_issue(owner=user) + issue = f.create_issue(subject="this is the issue one", owner=user) f.create_issue(subject="this is the issue two", owner=issue.owner) url = reverse("issues-list") + "?q=this is the issue" @@ -112,8 +116,9 @@ def test_api_filter_by_text_3(client): assert number_of_issues == 2 def test_api_filter_by_text_4(client): - f.create_issue() - issue = f.create_issue(subject="this is the issue one") + user = f.UserFactory(is_superuser=True) + f.create_issue(owner=user) + issue = f.create_issue(subject="this is the issue one", owner=user) f.create_issue(subject="this is the issue two", owner=issue.owner) url = reverse("issues-list") + "?q=one two" @@ -125,8 +130,9 @@ def test_api_filter_by_text_4(client): assert number_of_issues == 0 def test_api_filter_by_text_5(client): - f.create_issue() - issue = f.create_issue(subject="python 3") + user = f.UserFactory(is_superuser=True) + f.create_issue(owner=user) + issue = f.create_issue(subject="python 3", owner=user) url = reverse("issues-list") + "?q=python 3" client.login(issue.owner) @@ -138,9 +144,13 @@ def test_api_filter_by_text_5(client): def test_api_filter_by_text_6(client): - f.create_issue() - issue = f.create_issue(subject="test") - url = reverse("issues-list") + "?q=%s"%(issue.ref) + user = f.UserFactory(is_superuser=True) + f.create_issue(owner=user) + issue = f.create_issue(subject="test", owner=user) + issue.ref = 123 + issue.save() + print(issue.ref, issue.subject) + url = reverse("issues-list") + "?q=%s" % (issue.ref) client.login(issue.owner) response = client.get(url) diff --git a/tests/integration/test_memberships.py b/tests/integration/test_memberships.py index f3703829..a77013e4 100644 --- a/tests/integration/test_memberships.py +++ b/tests/integration/test_memberships.py @@ -147,9 +147,11 @@ def test_api_create_invalid_membership_role_doesnt_exist_in_the_project(client): def test_api_create_membership(client): - user = f.UserFactory() - role = f.RoleFactory.create() - client.login(role.project.owner) + membership = f.MembershipFactory(is_owner=True) + role = f.RoleFactory.create(project=membership.project) + user = f.UserFactory.create() + + client.login(membership.user) url = reverse("memberships-list") data = {"role": role.pk, "project": role.project.pk, "email": user.email} response = client.json.post(url, json.dumps(data)) @@ -159,8 +161,8 @@ def test_api_create_membership(client): def test_api_edit_membership(client): - membership = f.MembershipFactory() - client.login(membership.project.owner) + membership = f.MembershipFactory(is_owner=True) + client.login(membership.user) url = reverse("memberships-detail", args=[membership.id]) data = {"email": "new@email.com"} response = client.json.patch(url, json.dumps(data)) @@ -169,8 +171,15 @@ def test_api_edit_membership(client): def test_api_delete_membership(client): - membership = f.MembershipFactory() - client.login(membership.project.owner) + membership = f.MembershipFactory(is_owner=True) + client.login(membership.user) + url = reverse("memberships-detail", args=[membership.id]) + response = client.json.delete(url) + + assert response.status_code == 400 + + f.MembershipFactory(is_owner=True, project=membership.project) + url = reverse("memberships-detail", args=[membership.id]) response = client.json.delete(url) diff --git a/tests/integration/test_stars.py b/tests/integration/test_stars.py index 779ef238..eddb03a5 100644 --- a/tests/integration/test_stars.py +++ b/tests/integration/test_stars.py @@ -26,6 +26,7 @@ pytestmark = pytest.mark.django_db def test_project_owner_star_project(client): user = f.UserFactory.create() project = f.ProjectFactory.create(owner=user) + f.MembershipFactory.create(project=project, is_owner=True, user=user) url = reverse("projects-star", args=(project.id,)) client.login(user) @@ -37,6 +38,7 @@ def test_project_owner_star_project(client): def test_project_owner_unstar_project(client): user = f.UserFactory.create() project = f.ProjectFactory.create(owner=user) + f.MembershipFactory.create(project=project, is_owner=True, user=user) url = reverse("projects-unstar", args=(project.id,)) client.login(user) diff --git a/tests/integration/test_userstories.py b/tests/integration/test_userstories.py index d19555b8..d554c050 100644 --- a/tests/integration/test_userstories.py +++ b/tests/integration/test_userstories.py @@ -43,7 +43,7 @@ def test_update_userstories_order_in_bulk(): def test_api_delete_userstory(client): - us = f.create_userstory() + us = f.UserStoryFactory.create() f.MembershipFactory.create(project=us.project, user=us.owner, is_owner=True) url = reverse("userstories-detail", kwargs={"pk": us.pk}) @@ -53,12 +53,16 @@ def test_api_delete_userstory(client): assert response.status_code == 204 -def test_api_filter_by_subject(client): - f.create_userstory() - us = f.create_userstory(subject="some random subject") - url = reverse("userstories-list") + "?subject=some subject" +def test_api_filter_by_subject_or_ref(client): + user = f.UserFactory.create() + project = f.ProjectFactory.create(owner=user) + f.MembershipFactory.create(project=project, user=user, is_owner=True) - client.login(us.owner) + f.UserStoryFactory.create(project=project) + f.UserStoryFactory.create(project=project, subject="some random subject") + url = reverse("userstories-list") + "?q=some subject" + + client.login(project.owner) response = client.get(url) number_of_stories = len(response.data) @@ -184,7 +188,7 @@ def test_update_userstory_rolepoints_on_add_new_role(client): def test_archived_filter(client): user = f.UserFactory.create() project = f.ProjectFactory.create(owner=user) - f.MembershipFactory.create(project=project, user=user) + f.MembershipFactory.create(project=project, user=user, is_owner=True) f.UserStoryFactory.create(project=project) f.UserStoryFactory.create(is_archived=True, project=project)