Skip to content

Commit b0af656

Browse files
committed
improve permissions setup to avoid triggering indexation
1 parent 68a43d2 commit b0af656

File tree

5 files changed

+67
-25
lines changed

5 files changed

+67
-25
lines changed

apps/accounts/models.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -215,18 +215,18 @@ def setup_permissions(
215215
self, user: Optional["ProjectUser"] = None, trigger_indexation: bool = True
216216
):
217217
"""Setup the group with default permissions."""
218-
managers = self.setup_group_permissions(
218+
managers = self.setup_group_object_permissions(
219219
self.get_managers(), self.get_default_managers_permissions()
220220
)
221-
members = self.setup_group_permissions(
221+
members = self.setup_group_object_permissions(
222222
self.get_members(), self.get_default_members_permissions()
223223
)
224-
leaders = self.setup_group_permissions(
224+
leaders = self.setup_group_object_permissions(
225225
self.get_leaders(), self.get_default_leaders_permissions()
226226
)
227227
if user:
228228
managers.users.add(user)
229-
self.groups.add(managers, members, leaders)
229+
self.groups.set([managers, members, leaders])
230230
if trigger_indexation:
231231
self.permissions_up_to_date = True
232232
self.save(update_fields=["permissions_up_to_date"])

apps/commons/models.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class PermissionsSetupModel(models.Model):
8686

8787
permissions_up_to_date = models.BooleanField(default=False)
8888

89-
def setup_group_permissions(
89+
def setup_group_object_permissions(
9090
self, group: Group, permissions: QuerySet[str]
9191
) -> Group:
9292
current_role_permissions = Permission.objects.filter(
@@ -100,6 +100,18 @@ def setup_group_permissions(
100100
remove_perm(permission, group, self)
101101
return group
102102

103+
def setup_group_global_permissions(
104+
self, group: Group, permissions: QuerySet[str]
105+
) -> Group:
106+
current_role_permissions = group.permissions.all()
107+
permissions_to_remove = current_role_permissions.difference(permissions)
108+
permissions_to_add = permissions.difference(current_role_permissions)
109+
for permission in permissions_to_add:
110+
assign_perm(permission, group)
111+
for permission in permissions_to_remove:
112+
remove_perm(permission, group)
113+
return group
114+
103115
def setup_permissions(
104116
self, user: Optional["ProjectUser"] = None, trigger_indexation: bool = True
105117
):

apps/deploys/tasks.py

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django.core.management import call_command
2-
from guardian.shortcuts import assign_perm
2+
from guardian.shortcuts import assign_perm, remove_perm
33

44
from apps.accounts.utils import (
55
get_default_group,
@@ -31,15 +31,36 @@ def base_groups_permissions():
3131
- Default group
3232
- Superadmins group
3333
"""
34+
35+
# Default group
3436
default_group = get_default_group()
35-
default_group.permissions.clear()
36-
for permission in get_default_group_permissions():
37+
default_group_permissions = get_default_group_permissions()
38+
current_default_group_permissions = default_group.permissions.all()
39+
default_group_permissions_to_remove = current_default_group_permissions.difference(
40+
default_group_permissions
41+
)
42+
default_group_permissions_to_add = default_group_permissions.difference(
43+
current_default_group_permissions
44+
)
45+
for permission in default_group_permissions_to_add:
3746
assign_perm(permission, default_group)
47+
for permission in default_group_permissions_to_remove:
48+
remove_perm(permission, default_group)
3849

50+
# Superadmins group
3951
superadmins_group = get_superadmins_group()
40-
superadmins_group.permissions.clear()
41-
for permission in get_superadmins_group_permissions():
52+
superadmins_group_permissions = get_superadmins_group_permissions()
53+
current_superadmins_group_permissions = superadmins_group.permissions.all()
54+
superadmins_group_permissions_to_remove = (
55+
current_superadmins_group_permissions.difference(superadmins_group_permissions)
56+
)
57+
superadmins_group_permissions_to_add = superadmins_group_permissions.difference(
58+
current_superadmins_group_permissions
59+
)
60+
for permission in superadmins_group_permissions_to_add:
4261
assign_perm(permission, superadmins_group)
62+
for permission in superadmins_group_permissions_to_remove:
63+
remove_perm(permission, superadmins_group)
4364

4465

4566
@app.task

apps/organizations/models.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from django.db import models
88
from django.db.models import QuerySet
99
from django.http import Http404
10-
from guardian.shortcuts import assign_perm
1110
from simple_history.models import HistoricalRecords
1211

1312
from apps.commons.models import Language, OrganizationRelated, PermissionsSetupModel
@@ -243,6 +242,18 @@ def get_related_organizations(self) -> List["Organization"]:
243242
def get_default_admins_permissions(self) -> QuerySet[Permission]:
244243
return Permission.objects.filter(content_type=self.content_type)
245244

245+
def get_global_admins_permissions(self) -> QuerySet[Permission]:
246+
return Permission.objects.filter(
247+
codename__in=[
248+
"get_user_by_email",
249+
# TODO: remove that when we have a better way to handle permissions
250+
"add_projectuser",
251+
"change_projectuser",
252+
"delete_projectuser",
253+
],
254+
content_type__app_label="accounts",
255+
)
256+
246257
def get_default_facilitators_permissions(self) -> QuerySet[Permission]:
247258
excluded_permissions = [
248259
"manage_accessrequest",
@@ -279,24 +290,22 @@ def setup_permissions(
279290
self, user: Optional["ProjectUser"] = None, trigger_indexation: bool = True
280291
):
281292
"""Setup the group with default permissions."""
282-
admins = self.setup_group_permissions(
293+
admins = self.setup_group_object_permissions(
283294
self.get_admins(), self.get_default_admins_permissions()
284295
)
285-
assign_perm("accounts.get_user_by_email", admins)
286-
# TODO: remove that when we have a better way to handle permissions
287-
assign_perm("accounts.add_projectuser", admins)
288-
assign_perm("accounts.change_projectuser", admins)
289-
assign_perm("accounts.delete_projectuser", admins)
290-
facilitators = self.setup_group_permissions(
296+
admins = self.setup_group_global_permissions(
297+
admins, self.get_global_admins_permissions()
298+
)
299+
facilitators = self.setup_group_object_permissions(
291300
self.get_facilitators(), self.get_default_facilitators_permissions()
292301
)
293-
users = self.setup_group_permissions(
302+
users = self.setup_group_object_permissions(
294303
self.get_users(), self.get_default_users_permissions()
295304
)
296305

297306
if user:
298307
admins.users.add(user)
299-
self.groups.add(admins, facilitators, users)
308+
self.groups.set([admins, facilitators, users])
300309
if trigger_indexation:
301310
self.permissions_up_to_date = True
302311
self.save(update_fields=["permissions_up_to_date"])

apps/projects/models.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -411,22 +411,22 @@ def setup_permissions(
411411
self, user: Optional["ProjectUser"] = None, trigger_indexation: bool = True
412412
):
413413
"""Setup the group with default permissions."""
414-
reviewers = self.setup_group_permissions(
414+
reviewers = self.setup_group_object_permissions(
415415
self.get_reviewers(), self.get_default_reviewers_permissions()
416416
)
417-
owners = self.setup_group_permissions(
417+
owners = self.setup_group_object_permissions(
418418
self.get_owners(), self.get_default_owners_permissions()
419419
)
420-
members = self.setup_group_permissions(
420+
members = self.setup_group_object_permissions(
421421
self.get_members(), self.get_default_members_permissions()
422422
)
423-
people_groups = self.setup_group_permissions(
423+
people_groups = self.setup_group_object_permissions(
424424
self.get_people_groups(), self.get_default_members_permissions()
425425
)
426426

427427
if user:
428428
owners.users.add(user)
429-
self.groups.add(owners, reviewers, members, people_groups)
429+
self.groups.set([owners, reviewers, members, people_groups])
430430
if trigger_indexation:
431431
self.permissions_up_to_date = True
432432
self.save(update_fields=["permissions_up_to_date"])

0 commit comments

Comments
 (0)