diff --git a/taiga/projects/signals.py b/taiga/projects/signals.py index e4366d8d..61dd0709 100644 --- a/taiga/projects/signals.py +++ b/taiga/projects/signals.py @@ -19,6 +19,7 @@ from django.conf import settings from taiga.projects.services.tags_colors import update_project_tags_colors_handler, remove_unused_tags from taiga.projects.notifications.services import create_notify_policy_if_not_exists +from taiga.base.utils.db import get_typename_for_model_class #################################### @@ -53,7 +54,13 @@ def update_watchers_on_membership_post_delete(sender, instance, using, **kwargs) # instance.user can contain pointer to now # removed object from a database. for model in models: - model.watchers.through.objects.filter(user_id=instance.user_id).delete() + #filter(project=instance.project) + filter = { + "user_id": instance.user_id, + "%s__project"%(model._meta.model_name): instance.project, + } + + model.watchers.through.objects.filter(**filter).delete() def create_notify_policy(sender, instance, using, **kwargs): diff --git a/tests/integration/test_projects.py b/tests/integration/test_projects.py index a539dd09..527b0d0e 100644 --- a/tests/integration/test_projects.py +++ b/tests/integration/test_projects.py @@ -212,6 +212,22 @@ def test_leave_project_invalid_membership(client): assert response.status_code == 404 +def test_leave_project_respect_watching_items(client): + user = f.UserFactory.create() + project = f.ProjectFactory.create() + role = f.RoleFactory.create(project=project, permissions=["view_project"]) + f.MembershipFactory.create(project=project, user=user, role=role) + issue = f.IssueFactory(owner=user) + issue.watchers=[user] + issue.save() + + client.login(user) + url = reverse("projects-leave", args=(project.id,)) + response = client.post(url) + assert response.status_code == 200 + assert list(issue.watchers.all()) == [user] + + def test_delete_membership_only_owner(client): user = f.UserFactory.create() project = f.ProjectFactory.create()