Skip to content

Commit 996e1a8

Browse files
[Fixes #13449] Reorganize permission registry (#13452)
* [Fixes #13449] Reorganize permission registry * [Fixes #13449] move get_visible_resource inside permissions registry * [Fixes #13449] move utils inside the permissions_registry
1 parent 9271613 commit 996e1a8

File tree

10 files changed

+412
-347
lines changed

10 files changed

+412
-347
lines changed

geonode/api/tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -951,7 +951,7 @@ def _create_thesauri(cls):
951951

952952
@classmethod
953953
def _create_resources(self):
954-
public_perm_spec = {"users": {"AnonymousUser": ["view_resourcebase"]}, "groups": []}
954+
public_perm_spec = {"users": {"AnonymousUser": ["view_resourcebase"]}, "groups": {}}
955955

956956
for x in range(20):
957957
d: ResourceBase = ResourceBase.objects.create(

geonode/facets/tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ def _create_keywords(cls):
151151

152152
@classmethod
153153
def _create_resources(self):
154-
public_perm_spec = {"users": {"AnonymousUser": ["view_resourcebase"]}, "groups": []}
154+
public_perm_spec = {"users": {"AnonymousUser": ["view_resourcebase"]}, "groups": {}}
155155
for x in range(20):
156156
d: ResourceBase = ResourceBase.objects.create(
157157
title=f"dataset_{x:02}",

geonode/groups/tests.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,8 @@ def test_perms_info(self):
347347

348348
perms_info = _perms_info_json(layer)
349349
# Ensure foo is in the perms_info output
350-
self.assertCountEqual(json.loads(perms_info)["groups"], {"bar": ["view_resourcebase"]})
350+
self.assertTrue("bar" in json.loads(perms_info)["groups"])
351+
self.assertListEqual(json.loads(perms_info)["groups"]["bar"], ["view_resourcebase"])
351352

352353
def test_resource_permissions(self):
353354
"""
@@ -409,7 +410,8 @@ def test_resource_permissions(self):
409410
permissions = json.loads(permissions)
410411

411412
# Make sure the bar group now has write permissions
412-
self.assertCountEqual(permissions["groups"], {"bar": ["change_resourcebase"]})
413+
self.assertTrue("bar" in permissions["groups"])
414+
self.assertListEqual(permissions["groups"]["bar"], ["change_resourcebase"])
413415

414416
# Remove group permissions
415417
permissions = {"users": {"admin": ["change_resourcebase"]}}
@@ -435,7 +437,7 @@ def test_resource_permissions(self):
435437
permissions = json.loads(permissions)
436438

437439
# Assert the bar group no longer has permissions
438-
self.assertCountEqual(permissions["groups"], {})
440+
self.assertTrue("bar" not in permissions["groups"])
439441

440442
def test_create_new_group(self):
441443
"""

geonode/maps/tests.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ def test_map_view(self, thumbnail_mock):
239239
name="base:nic_admin",
240240
ows_url="http://localhost:8080/geoserver/wms",
241241
)
242+
# map_created.set_default_permissions()
242243
resource_manager.set_permissions(None, instance=map_created, permissions=None, created=True)
243244
map_id = map_created.id
244245

geonode/people/models.py

Lines changed: 7 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,19 @@
3030
from django.urls import reverse
3131
from django.contrib.sites.models import Site
3232
from django.utils.translation import gettext_lazy as _
33-
from django.contrib.auth.models import AbstractUser, Permission, UserManager
33+
from django.contrib.auth.models import AbstractUser, UserManager
3434
from django.contrib.auth.signals import user_logged_in, user_logged_out
3535

3636
from taggit.managers import TaggableManager
3737

3838
from geonode.base.enumerations import COUNTRIES
39-
from geonode.base.models import Configuration, ResourceBase
39+
from geonode.base.models import ResourceBase
4040
from geonode.groups.models import GroupProfile
41-
from geonode.security.permissions import PERMISSIONS, READ_ONLY_AFFECTED_PERMISSIONS
4241

4342
from allauth.account.signals import user_signed_up
4443
from allauth.socialaccount.signals import social_account_added
4544

46-
from geonode.security.utils import can_approve, can_feature, can_publish
47-
45+
from geonode.security.registry import permissions_registry
4846
from .utils import format_address
4947
from .signals import (
5048
do_login,
@@ -204,29 +202,7 @@ def location(self):
204202

205203
@property
206204
def perms(self):
207-
perms = set()
208-
if self.is_superuser or self.is_staff:
209-
# return all permissions for admins
210-
perms.update(PERMISSIONS.values())
211-
212-
user_groups = self.groups.values_list("name", flat=True)
213-
group_perms = (
214-
Permission.objects.filter(group__name__in=user_groups).distinct().values_list("codename", flat=True)
215-
)
216-
for p in group_perms:
217-
if p in PERMISSIONS:
218-
# return constant names defined by GeoNode
219-
perms.add(PERMISSIONS[p])
220-
else:
221-
# add custom permissions
222-
perms.add(p)
223-
224-
# check READ_ONLY mode
225-
config = Configuration.load()
226-
if config.read_only:
227-
# exclude permissions affected by readonly
228-
perms = [perm for perm in perms if perm not in READ_ONLY_AFFECTED_PERMISSIONS]
229-
return list(perms)
205+
return permissions_registry.get_db_perms_by_user(self)
230206

231207
def save(self, *args, **kwargs):
232208
super().save(*args, **kwargs)
@@ -284,13 +260,13 @@ def can_change_resource_field(self, resource, field):
284260
return self.can_feature(resource)
285261

286262
def can_approve(self, resource):
287-
return can_approve(self, resource)
263+
return permissions_registry.user_can_approve(self, resource)
288264

289265
def can_publish(self, resource):
290-
return can_publish(self, resource)
266+
return permissions_registry.user_can_publish(self, resource)
291267

292268
def can_feature(self, resource):
293-
return can_feature(self, resource)
269+
return permissions_registry.user_can_feature(self, resource)
294270

295271

296272
def get_anonymous_user_instance(user_model):

geonode/security/handlers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
#########################################################################
1919
from abc import ABC
2020

21-
from geonode.security.utils import AdvancedSecurityWorkflowManager
22-
2321

2422
class BasePermissionsHandler(ABC):
2523
"""
@@ -55,6 +53,8 @@ class AdvancedWorkflowPermissionsHandler(BasePermissionsHandler):
5553

5654
@staticmethod
5755
def fixup_perms(instance, perms_payload, include_virtual=True, *args, **kwargs):
56+
from geonode.security.utils import AdvancedSecurityWorkflowManager
57+
5858
# Fixup Advanced Workflow permissions
5959
return AdvancedSecurityWorkflowManager.get_permissions(
6060
instance.uuid,

geonode/security/models.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@
4747
DATASET_EDIT_STYLE_PERMISSIONS,
4848
)
4949

50-
from .utils import get_users_with_perms, get_user_obj_perms_model, skip_registered_members_common_group
50+
from .utils import get_users_with_perms, skip_registered_members_common_group
5151
from geonode.security.registry import permissions_registry
52+
from guardian.utils import get_user_obj_perms_model
5253

5354
logger = logging.getLogger(__name__)
5455

@@ -455,11 +456,4 @@ def user_can(self, user, permission):
455456
"""
456457
Checks if a has a given permission to the resource.
457458
"""
458-
user_perms = permissions_registry.get_perms(instance=self, user=user)
459-
460-
if permission not in user_perms:
461-
# TODO cater for permissions with syntax base.permission_codename
462-
# eg 'base.change_resourcebase'
463-
return False
464-
465-
return True
459+
return permissions_registry.user_has_perm(user, self, permission)

0 commit comments

Comments
 (0)