Skip to content

Commit 15700dd

Browse files
sampaccoudAntoLC
authored andcommitted
✨(backend) add new ability on document "accesses_view"
We need this ability in the frontend to know whether we should try to display the list of users who have document accesses. If this ability is False (e.g for anonymous users), we should only show the link reach and link role when clicking on the "Share" button.
1 parent d8673a8 commit 15700dd

File tree

18 files changed

+59
-46
lines changed

18 files changed

+59
-46
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ and this project adheres to
1515
- 🌐(frontend) add localization to editor #268
1616
- ✨Public and restricted doc editable #357
1717
- ✨(frontend) Add full name if available #380
18+
- ✨(backend) Add view accesses ability #376
1819

1920
## Fixed
2021

src/backend/core/models.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,8 @@ def get_abilities(self, user):
496496
# Compute version roles before adding link roles because we don't
497497
# want anonymous users to access versions (we wouldn't know from
498498
# which date to allow them anyway)
499-
can_get_versions = bool(roles)
499+
# Anonymous users should also not see document accesses
500+
has_role = bool(roles)
500501

501502
# Add role provided by the document link
502503
if self.link_reach == LinkReachChoices.PUBLIC or (
@@ -511,19 +512,20 @@ def get_abilities(self, user):
511512
can_get = bool(roles)
512513

513514
return {
515+
"accesses_manage": is_owner_or_admin,
516+
"accesses_view": has_role,
514517
"ai_transform": is_owner_or_admin or is_editor,
515518
"ai_translate": is_owner_or_admin or is_editor,
516519
"attachment_upload": is_owner_or_admin or is_editor,
517520
"destroy": RoleChoices.OWNER in roles,
518521
"link_configuration": is_owner_or_admin,
519-
"manage_accesses": is_owner_or_admin,
520522
"invite_owner": RoleChoices.OWNER in roles,
521523
"partial_update": is_owner_or_admin or is_editor,
522524
"retrieve": can_get,
523525
"update": is_owner_or_admin or is_editor,
524526
"versions_destroy": is_owner_or_admin,
525-
"versions_list": can_get_versions,
526-
"versions_retrieve": can_get_versions,
527+
"versions_list": has_role,
528+
"versions_retrieve": has_role,
527529
}
528530

529531
def email_invitation(self, language, email, role, sender):
@@ -679,7 +681,7 @@ def get_abilities(self, user):
679681
return {
680682
"destroy": RoleChoices.OWNER in roles,
681683
"generate_document": can_get,
682-
"manage_accesses": is_owner_or_admin,
684+
"accesses_manage": is_owner_or_admin,
683685
"update": is_owner_or_admin or is_editor,
684686
"partial_update": is_owner_or_admin or is_editor,
685687
"retrieve": can_get,

src/backend/core/tests/documents/test_api_documents_retrieve.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,14 @@ def test_api_documents_retrieve_anonymous_public():
2121
assert response.json() == {
2222
"id": str(document.id),
2323
"abilities": {
24+
"accesses_manage": False,
25+
"accesses_view": False,
2426
"ai_transform": document.link_role == "editor",
2527
"ai_translate": document.link_role == "editor",
2628
"attachment_upload": document.link_role == "editor",
2729
"destroy": False,
2830
"invite_owner": False,
2931
"link_configuration": False,
30-
"manage_accesses": False,
3132
"partial_update": document.link_role == "editor",
3233
"retrieve": True,
3334
"update": document.link_role == "editor",
@@ -78,13 +79,14 @@ def test_api_documents_retrieve_authenticated_unrelated_public_or_authenticated(
7879
assert response.json() == {
7980
"id": str(document.id),
8081
"abilities": {
82+
"accesses_manage": False,
83+
"accesses_view": False,
8184
"ai_transform": document.link_role == "editor",
8285
"ai_translate": document.link_role == "editor",
8386
"attachment_upload": document.link_role == "editor",
8487
"link_configuration": False,
8588
"destroy": False,
8689
"invite_owner": False,
87-
"manage_accesses": False,
8890
"partial_update": document.link_role == "editor",
8991
"retrieve": True,
9092
"update": document.link_role == "editor",

src/backend/core/tests/templates/test_api_templates_retrieve.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def test_api_templates_retrieve_anonymous_public():
2222
"abilities": {
2323
"destroy": False,
2424
"generate_document": True,
25-
"manage_accesses": False,
25+
"accesses_manage": False,
2626
"partial_update": False,
2727
"retrieve": True,
2828
"update": False,
@@ -68,7 +68,7 @@ def test_api_templates_retrieve_authenticated_unrelated_public():
6868
"abilities": {
6969
"destroy": False,
7070
"generate_document": True,
71-
"manage_accesses": False,
71+
"accesses_manage": False,
7272
"partial_update": False,
7373
"retrieve": True,
7474
"update": False,

src/backend/core/tests/test_models_documents.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,14 @@ def test_models_documents_get_abilities_forbidden(is_authenticated, reach, role)
8383
user = factories.UserFactory() if is_authenticated else AnonymousUser()
8484
abilities = document.get_abilities(user)
8585
assert abilities == {
86+
"accesses_manage": False,
87+
"accesses_view": False,
8688
"ai_transform": False,
8789
"ai_translate": False,
8890
"attachment_upload": False,
8991
"link_configuration": False,
9092
"destroy": False,
9193
"invite_owner": False,
92-
"manage_accesses": False,
9394
"partial_update": False,
9495
"retrieve": False,
9596
"update": False,
@@ -116,13 +117,14 @@ def test_models_documents_get_abilities_reader(is_authenticated, reach):
116117
user = factories.UserFactory() if is_authenticated else AnonymousUser()
117118
abilities = document.get_abilities(user)
118119
assert abilities == {
120+
"accesses_manage": False,
121+
"accesses_view": False,
119122
"ai_transform": False,
120123
"ai_translate": False,
121124
"attachment_upload": False,
122125
"destroy": False,
123126
"link_configuration": False,
124127
"invite_owner": False,
125-
"manage_accesses": False,
126128
"partial_update": False,
127129
"retrieve": True,
128130
"update": False,
@@ -149,13 +151,14 @@ def test_models_documents_get_abilities_editor(is_authenticated, reach):
149151
user = factories.UserFactory() if is_authenticated else AnonymousUser()
150152
abilities = document.get_abilities(user)
151153
assert abilities == {
154+
"accesses_manage": False,
155+
"accesses_view": False,
152156
"ai_transform": True,
153157
"ai_translate": True,
154158
"attachment_upload": True,
155159
"destroy": False,
156160
"link_configuration": False,
157161
"invite_owner": False,
158-
"manage_accesses": False,
159162
"partial_update": True,
160163
"retrieve": True,
161164
"update": True,
@@ -171,13 +174,14 @@ def test_models_documents_get_abilities_owner():
171174
access = factories.UserDocumentAccessFactory(role="owner", user=user)
172175
abilities = access.document.get_abilities(access.user)
173176
assert abilities == {
177+
"accesses_manage": True,
178+
"accesses_view": True,
174179
"ai_transform": True,
175180
"ai_translate": True,
176181
"attachment_upload": True,
177182
"destroy": True,
178183
"link_configuration": True,
179184
"invite_owner": True,
180-
"manage_accesses": True,
181185
"partial_update": True,
182186
"retrieve": True,
183187
"update": True,
@@ -192,13 +196,14 @@ def test_models_documents_get_abilities_administrator():
192196
access = factories.UserDocumentAccessFactory(role="administrator")
193197
abilities = access.document.get_abilities(access.user)
194198
assert abilities == {
199+
"accesses_manage": True,
200+
"accesses_view": True,
195201
"ai_transform": True,
196202
"ai_translate": True,
197203
"attachment_upload": True,
198204
"destroy": False,
199205
"link_configuration": True,
200206
"invite_owner": False,
201-
"manage_accesses": True,
202207
"partial_update": True,
203208
"retrieve": True,
204209
"update": True,
@@ -216,13 +221,14 @@ def test_models_documents_get_abilities_editor_user(django_assert_num_queries):
216221
abilities = access.document.get_abilities(access.user)
217222

218223
assert abilities == {
224+
"accesses_manage": False,
225+
"accesses_view": True,
219226
"ai_transform": True,
220227
"ai_translate": True,
221228
"attachment_upload": True,
222229
"destroy": False,
223230
"link_configuration": False,
224231
"invite_owner": False,
225-
"manage_accesses": False,
226232
"partial_update": True,
227233
"retrieve": True,
228234
"update": True,
@@ -242,13 +248,14 @@ def test_models_documents_get_abilities_reader_user(django_assert_num_queries):
242248
abilities = access.document.get_abilities(access.user)
243249

244250
assert abilities == {
251+
"accesses_manage": False,
252+
"accesses_view": True,
245253
"ai_transform": False,
246254
"ai_translate": False,
247255
"attachment_upload": False,
248256
"destroy": False,
249257
"link_configuration": False,
250258
"invite_owner": False,
251-
"manage_accesses": False,
252259
"partial_update": False,
253260
"retrieve": True,
254261
"update": False,
@@ -269,13 +276,14 @@ def test_models_documents_get_abilities_preset_role(django_assert_num_queries):
269276
abilities = access.document.get_abilities(access.user)
270277

271278
assert abilities == {
279+
"accesses_manage": False,
280+
"accesses_view": True,
272281
"ai_transform": False,
273282
"ai_translate": False,
274283
"attachment_upload": False,
275284
"destroy": False,
276285
"link_configuration": False,
277286
"invite_owner": False,
278-
"manage_accesses": False,
279287
"partial_update": False,
280288
"retrieve": True,
281289
"update": False,

src/backend/core/tests/test_models_templates.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def test_models_templates_get_abilities_anonymous_public():
6262
"destroy": False,
6363
"retrieve": True,
6464
"update": False,
65-
"manage_accesses": False,
65+
"accesses_manage": False,
6666
"partial_update": False,
6767
"generate_document": True,
6868
}
@@ -76,7 +76,7 @@ def test_models_templates_get_abilities_anonymous_not_public():
7676
"destroy": False,
7777
"retrieve": False,
7878
"update": False,
79-
"manage_accesses": False,
79+
"accesses_manage": False,
8080
"partial_update": False,
8181
"generate_document": False,
8282
}
@@ -90,7 +90,7 @@ def test_models_templates_get_abilities_authenticated_public():
9090
"destroy": False,
9191
"retrieve": True,
9292
"update": False,
93-
"manage_accesses": False,
93+
"accesses_manage": False,
9494
"partial_update": False,
9595
"generate_document": True,
9696
}
@@ -104,7 +104,7 @@ def test_models_templates_get_abilities_authenticated_not_public():
104104
"destroy": False,
105105
"retrieve": False,
106106
"update": False,
107-
"manage_accesses": False,
107+
"accesses_manage": False,
108108
"partial_update": False,
109109
"generate_document": False,
110110
}
@@ -119,7 +119,7 @@ def test_models_templates_get_abilities_owner():
119119
"destroy": True,
120120
"retrieve": True,
121121
"update": True,
122-
"manage_accesses": True,
122+
"accesses_manage": True,
123123
"partial_update": True,
124124
"generate_document": True,
125125
}
@@ -133,7 +133,7 @@ def test_models_templates_get_abilities_administrator():
133133
"destroy": False,
134134
"retrieve": True,
135135
"update": True,
136-
"manage_accesses": True,
136+
"accesses_manage": True,
137137
"partial_update": True,
138138
"generate_document": True,
139139
}
@@ -150,7 +150,7 @@ def test_models_templates_get_abilities_editor_user(django_assert_num_queries):
150150
"destroy": False,
151151
"retrieve": True,
152152
"update": True,
153-
"manage_accesses": False,
153+
"accesses_manage": False,
154154
"partial_update": True,
155155
"generate_document": True,
156156
}
@@ -167,7 +167,7 @@ def test_models_templates_get_abilities_reader_user(django_assert_num_queries):
167167
"destroy": False,
168168
"retrieve": True,
169169
"update": False,
170-
"manage_accesses": False,
170+
"accesses_manage": False,
171171
"partial_update": False,
172172
"generate_document": True,
173173
}
@@ -185,7 +185,7 @@ def test_models_templates_get_abilities_preset_role(django_assert_num_queries):
185185
"destroy": False,
186186
"retrieve": True,
187187
"update": False,
188-
"manage_accesses": False,
188+
"accesses_manage": False,
189189
"partial_update": False,
190190
"generate_document": True,
191191
}

src/frontend/apps/e2e/__tests__/app-impress/common.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ export const mockedDocument = async (page: Page, json: object) => {
144144
versions_destroy: false,
145145
versions_list: true,
146146
versions_retrieve: true,
147-
manage_accesses: false, // Means not admin
147+
accesses_manage: false, // Means not admin
148148
update: false,
149149
partial_update: false, // Means not editor
150150
retrieve: true,

src/frontend/apps/e2e/__tests__/app-impress/doc-editor.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ test.describe('Doc Editor', () => {
215215
versions_destroy: false,
216216
versions_list: true,
217217
versions_retrieve: true,
218-
manage_accesses: false, // Means not admin
218+
accesses_manage: false, // Means not admin
219219
update: false,
220220
partial_update: false, // Means not editor
221221
retrieve: true,

src/frontend/apps/e2e/__tests__/app-impress/doc-grid.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ test.describe('Documents Grid mobile', () => {
303303
attachment_upload: true,
304304
destroy: true,
305305
link_configuration: true,
306-
manage_accesses: true,
306+
accesses_manage: true,
307307
partial_update: true,
308308
retrieve: true,
309309
update: true,

src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ test.describe('Doc Header', () => {
4545
versions_destroy: true,
4646
versions_list: true,
4747
versions_retrieve: true,
48-
manage_accesses: true,
48+
accesses_manage: true,
4949
update: true,
5050
partial_update: true,
5151
retrieve: true,
@@ -182,7 +182,7 @@ test.describe('Doc Header', () => {
182182
versions_destroy: true,
183183
versions_list: true,
184184
versions_retrieve: true,
185-
manage_accesses: true, // Means admin
185+
accesses_manage: true, // Means admin
186186
update: true,
187187
partial_update: true,
188188
retrieve: true,
@@ -252,7 +252,7 @@ test.describe('Doc Header', () => {
252252
versions_destroy: true,
253253
versions_list: true,
254254
versions_retrieve: true,
255-
manage_accesses: false, // Means not admin
255+
accesses_manage: false, // Means not admin
256256
update: true,
257257
partial_update: true, // Means editor
258258
retrieve: true,
@@ -329,7 +329,7 @@ test.describe('Doc Header', () => {
329329
versions_destroy: false,
330330
versions_list: true,
331331
versions_retrieve: true,
332-
manage_accesses: false, // Means not admin
332+
accesses_manage: false, // Means not admin
333333
update: false,
334334
partial_update: false, // Means not editor
335335
retrieve: true,
@@ -489,7 +489,7 @@ test.describe('Documents Header mobile', () => {
489489
versions_destroy: true,
490490
versions_list: true,
491491
versions_retrieve: true,
492-
manage_accesses: true,
492+
accesses_manage: true,
493493
update: true,
494494
partial_update: true,
495495
retrieve: true,

0 commit comments

Comments
 (0)