diff --git a/taiga/projects/notifications/mixins.py b/taiga/projects/notifications/mixins.py index f62d1157..a147431b 100644 --- a/taiga/projects/notifications/mixins.py +++ b/taiga/projects/notifications/mixins.py @@ -228,10 +228,15 @@ class EditableWatchedResourceModelSerializer(WatchedResourceModelSerializer): return obj def to_native(self, obj): - #watchers is wasn't attached via the get_queryset of the viewset we need to manually add it + #if watchers wasn't attached via the get_queryset of the viewset we need to manually add it if obj is not None and not hasattr(obj, "watchers"): obj.watchers = [user.id for user in obj.get_watchers()] + request = self.context.get("request", None) + user = request.user if request else None + if user and user.is_authenticated(): + obj.is_watcher = user.id in obj.watchers + return super(WatchedResourceModelSerializer, self).to_native(obj) def save(self, **kwargs): diff --git a/tests/integration/test_watch_issues.py b/tests/integration/test_watch_issues.py index 764bf6fd..36ac157e 100644 --- a/tests/integration/test_watch_issues.py +++ b/tests/integration/test_watch_issues.py @@ -122,3 +122,28 @@ def test_get_issue_is_watcher(client): assert response.status_code == 200 assert response.data['watchers'] == [] assert response.data['is_watcher'] == False + + +def test_remove_issue_watcher(client): + user = f.UserFactory.create() + project = f.ProjectFactory.create() + issue = f.IssueFactory(project=project, + status__project=project, + severity__project=project, + priority__project=project, + type__project=project, + milestone__project=project) + + issue.add_watcher(user) + role = f.RoleFactory.create(project=project, permissions=['modify_issue', 'view_issues']) + f.MembershipFactory.create(project=project, user=user, role=role) + + url = reverse("issues-detail", args=(issue.id,)) + + client.login(user) + + data = {"version": issue.version, "watchers": []} + response = client.json.patch(url, json.dumps(data)) + assert response.status_code == 200 + assert response.data['watchers'] == [] + assert response.data['is_watcher'] == False diff --git a/tests/integration/test_watch_tasks.py b/tests/integration/test_watch_tasks.py index a23af44d..03b70190 100644 --- a/tests/integration/test_watch_tasks.py +++ b/tests/integration/test_watch_tasks.py @@ -122,3 +122,26 @@ def test_get_task_is_watcher(client): assert response.status_code == 200 assert response.data['watchers'] == [] assert response.data['is_watcher'] == False + + +def test_remove_task_watcher(client): + user = f.UserFactory.create() + project = f.ProjectFactory.create() + task = f.TaskFactory(project=project, + user_story=None, + status__project=project, + milestone__project=project) + + task.add_watcher(user) + role = f.RoleFactory.create(project=project, permissions=['modify_task', 'view_tasks']) + f.MembershipFactory.create(project=project, user=user, role=role) + + url = reverse("tasks-detail", args=(task.id,)) + + client.login(user) + + data = {"version": task.version, "watchers": []} + response = client.json.patch(url, json.dumps(data)) + assert response.status_code == 200 + assert response.data['watchers'] == [] + assert response.data['is_watcher'] == False diff --git a/tests/integration/test_watch_userstories.py b/tests/integration/test_watch_userstories.py index 4b42ddb6..aaf797b8 100644 --- a/tests/integration/test_watch_userstories.py +++ b/tests/integration/test_watch_userstories.py @@ -122,3 +122,25 @@ def test_get_user_story_is_watcher(client): assert response.status_code == 200 assert response.data['watchers'] == [] assert response.data['is_watcher'] == False + + +def test_remove_user_story_watcher(client): + user = f.UserFactory.create() + project = f.ProjectFactory.create() + us = f.UserStoryFactory(project=project, + status__project=project, + milestone__project=project) + + us.add_watcher(user) + role = f.RoleFactory.create(project=project, permissions=['modify_us', 'view_us']) + f.MembershipFactory.create(project=project, user=user, role=role) + + url = reverse("userstories-detail", args=(us.id,)) + + client.login(user) + + data = {"version": us.version, "watchers": []} + response = client.json.patch(url, json.dumps(data)) + assert response.status_code == 200 + assert response.data['watchers'] == [] + assert response.data['is_watcher'] == False