Skip to content

Commit 2416f20

Browse files
committed
@watchers response includes watcher_properties which tells the frontend if a specific watcher is deleteable by the current user.
1 parent 8f70cee commit 2416f20

5 files changed

Lines changed: 43 additions & 6 deletions

File tree

changes/TI-1935.other

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Extends the @watchers response with `watcher_properties` which tells the frontend if a specific watcher is deleteable by the current user. [elioschmutz]

docs/public/dev-manual/api/api_changelog.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Breaking Changes
2424
Other Changes
2525
^^^^^^^^^^^^^
2626
``@listing``: Filtering by inactive dossier responsible is now available.
27+
``@watchers``: Extends the @watchers response with ``watcher_properties``.
2728

2829
2025.6.0 (2025-04-07)
2930
---------------------

docs/public/dev-manual/api/watchers.rst

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ Ein Beobachter kann verschiedene Rollen haben, beispielsweise die Rollen Auftrag
3030
"referenced_actors": [
3131
{
3232
"@id": "https://example.org/@actors/peter.mueller",
33-
"identifier": "peter.mueller",
33+
"identifier": "peter.mueller"
3434
},
3535
{
3636
"@id": "https://example.org/@actors/rolf.ziegler",
37-
"identifier": "rolf.ziegler",
37+
"identifier": "rolf.ziegler"
3838
}
3939
],
4040
"referenced_watcher_roles": [
@@ -49,7 +49,7 @@ Ein Beobachter kann verschiedene Rollen haben, beispielsweise die Rollen Auftrag
4949
{
5050
"id": "task_responsible",
5151
"title": "Auftragnehmer"
52-
},
52+
}
5353
],
5454
"watchers_and_roles": {
5555
"peter.mueller": [
@@ -59,6 +59,14 @@ Ein Beobachter kann verschiedene Rollen haben, beispielsweise die Rollen Auftrag
5959
"regular_watcher",
6060
"task_responsible"
6161
]
62+
},
63+
"watcher_properties": {
64+
"peter.mueller": {
65+
"can_delete_watcher": true
66+
},
67+
"rolf.ziegler": {
68+
"can_delete_watcher": false
69+
}
6270
}
6371
}
6472

@@ -89,7 +97,8 @@ Die Beobachter können als Komponente eines Inhalts direkt über den ``expand``-
8997
"@id": "https://example.org/ordnungssystem/fuehrung/dossier-23/task-1/@listing-stats",
9098
"referenced_actors": ["..."],
9199
"referenced_watcher_roles": ["..."],
92-
"watchers_and_roles": { "...": "..." }
100+
"watchers_and_roles": { "...": "..." },
101+
"watcher_properties": { "...": "..." }
93102
}
94103
},
95104
"...": "..."

opengever/api/tests/test_watchers.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ def test_get_watchers_for_tasks(self, browser):
5454
u'watchers_and_roles': {
5555
self.regular_user.id: [u'regular_watcher', u'task_responsible'],
5656
self.dossier_responsible.id: [u'task_issuer']
57+
},
58+
u'watcher_properties': {
59+
self.regular_user.id: {'can_delete_watcher': True },
60+
self.dossier_responsible.id: {'can_delete_watcher': False },
5761
}
5862
}
5963

@@ -106,6 +110,10 @@ def test_get_watchers_for_inbox_forwarding(self, browser):
106110
u'watchers_and_roles': {
107111
self.regular_user.id: [u'regular_watcher', u'task_responsible'],
108112
self.dossier_responsible.id: [u'task_issuer']
113+
},
114+
u'watcher_properties': {
115+
self.regular_user.id: {'can_delete_watcher': False },
116+
self.dossier_responsible.id: {'can_delete_watcher': False },
109117
}
110118
}
111119

@@ -143,6 +151,9 @@ def test_get_watchers_for_documents(self, browser):
143151
],
144152
u'watchers_and_roles': {
145153
self.dossier_responsible.id: [u'regular_watcher']
154+
},
155+
u'watcher_properties': {
156+
self.dossier_responsible.id: {'can_delete_watcher': False },
146157
}
147158
}
148159

@@ -179,6 +190,9 @@ def test_get_watchers_for_mails(self, browser):
179190
],
180191
u'watchers_and_roles': {
181192
self.dossier_responsible.id: [u'regular_watcher']
193+
},
194+
u'watcher_properties': {
195+
self.dossier_responsible.id: {'can_delete_watcher': False },
182196
}
183197
}
184198

@@ -219,6 +233,9 @@ def test_watchers_endpoint_supports_teams(self, browser):
219233
],
220234
u'watchers_and_roles': {
221235
u'team:1': [u'task_responsible'],
236+
},
237+
u'watcher_properties': {
238+
u'team:1': {'can_delete_watcher': False },
222239
}
223240
}
224241

@@ -257,9 +274,11 @@ def test_watchers_endpoint_supports_inboxes(self, browser):
257274
],
258275
u'watchers_and_roles': {
259276
u'inbox:fa': [u'task_responsible'],
277+
},
278+
u'watcher_properties': {
279+
u'inbox:fa': {'can_delete_watcher': False },
260280
}
261281
}
262-
263282
self.assertEqual(expected_json, browser.json)
264283

265284
browser.open(self.task.absolute_url() + '?expand=watchers',
@@ -289,7 +308,8 @@ def test_get_watchers_hides_inactive_users(self, browser):
289308
expected_json = {u'@id': self.document.absolute_url() + '/@watchers',
290309
u'referenced_actors': [],
291310
u'referenced_watcher_roles': [],
292-
u'watchers_and_roles': {}}
311+
u'watchers_and_roles': {},
312+
u'watcher_properties': {}}
293313
self.assertEqual(expected_json, browser.json['@components']['watchers'])
294314

295315

opengever/api/watchers.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,15 @@ def __call__(self, expand=False):
5959
}
6060
for role in roles]
6161

62+
watcher_properties = defaultdict(dict)
63+
deleter = WatcherDeleter(self.context)
64+
for actor_id in watchers_and_roles:
65+
watcher_properties[actor_id]['can_delete_watcher'] = deleter.can_delete(actor_id)
66+
6267
result['watchers']['watchers_and_roles'] = watchers_and_roles
6368
result['watchers']['referenced_watcher_roles'] = referenced_watcher_roles
6469
result['watchers']['referenced_actors'] = referenced_actors
70+
result['watchers']['watcher_properties'] = watcher_properties
6571
return result
6672

6773

0 commit comments

Comments
 (0)