Skip to content

Commit 6ddba23

Browse files
authored
Merge pull request #4007 from archesproject/3998_show_read_permissions
allow users to view read-only cards in the resource editor report, re #3998
2 parents 5f5a908 + ed953f1 commit 6ddba23

File tree

4 files changed

+36
-6
lines changed

4 files changed

+36
-6
lines changed

arches/app/media/js/viewmodels/card.js

+2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ define([
6060
var permsLiteral = ko.observableArray();
6161
var nodegroups = params.graphModel.get('nodegroups');
6262
var multiselect = params.multiselect || false;
63+
var isWritable = params.card.is_writable || false;
6364
var selection;
6465
if (params.multiselect) {
6566
selection = params.selection || ko.observableArray([]);
@@ -117,6 +118,7 @@ define([
117118
});
118119

119120
_.extend(this, nodegroup, {
121+
isWritable: isWritable,
120122
model: cardModel,
121123
multiselect: params.multiselect,
122124
widgets: cardModel.widgets,

arches/app/templates/views/components/cards/default.htm

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<!-- ko foreach: { data: [$data], as: 'self' } -->
33

44
<!-- ko if: state === 'editor-tree' -->
5+
<!-- ko if: card.isWritable -->
56
<li role="treeitem card-treeitem" class="jstree-node" data-bind="css: {'jstree-open': (card.tiles().length > 0 && card.expanded()), 'jstree-closed' : (card.tiles().length > 0 && !card.expanded()), 'jstree-leaf': card.tiles().length === 0}, scrollTo: card.scrollTo, container: '.resource-editor-tree'">
67
<i class="jstree-icon jstree-ocl" role="presentation" data-bind="click: function(){card.expanded(!card.expanded())}"></i>
78
<a class="jstree-anchor" href="#" tabindex="-1" data-bind="css:{'filtered': card.highlight(), 'jstree-clicked': card.selected, 'child-selected': card.isChildSelected()}, click: function () { card.canAdd() ? card.selected(true) : card.tiles()[0].selected(true) },">
@@ -65,6 +66,7 @@
6566
</ul>
6667
</li>
6768
<!-- /ko -->
69+
<!-- /ko -->
6870

6971
<!-- ko if: state === 'designer-tree' -->
7072
<li role="treeitem card-treeitem" class="jstree-node" data-bind="css: {'jstree-open': ((card.cards().length > 0 || card.widgets().length > 0) && card.expanded()), 'jstree-closed' : ((card.cards().length > 0 || card.widgets().length > 0) && !card.expanded()), 'jstree-leaf': card.cards().length === 0 && card.widgets().length === 0}, scrollTo: card.scrollTo, container: '.designer-card-tree'">

arches/app/utils/permission_backend.py

+12-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
from guardian.exceptions import WrongAppError
88
from django.contrib.auth.models import User, Group, Permission
99

10+
1011
class PermissionBackend(ObjectPermissionBackend):
12+
1113
def has_perm(self, user_obj, perm, obj=None):
1214
# check if user_obj and object are supported (pulled directly from guardian)
1315
support, user_obj = check_support(user_obj, obj)
@@ -65,6 +67,7 @@ def has_group_perm(group, perm, obj):
6567
ret.append(group)
6668
return ret
6769

70+
6871
def get_users_for_object(perm, obj):
6972
"""
7073
returns a list of user objects that have the given permission on the given object
@@ -81,6 +84,7 @@ def get_users_for_object(perm, obj):
8184
ret.append(user)
8285
return ret
8386

87+
8488
def get_nodegroups_by_perm(user, perms, any_perm=True):
8589
"""
8690
returns a list of node groups that a user has the given permission on
@@ -97,10 +101,11 @@ def get_nodegroups_by_perm(user, perms, any_perm=True):
97101
'models.write_nodegroup',
98102
'models.delete_nodegroup',
99103
'models.no_access_to_nodegroup'
100-
], accept_global_perms=False, any_perm=True))
104+
], accept_global_perms=False, any_perm=True))
101105
B = set(get_objects_for_user(user, perms, accept_global_perms=False, any_perm=any_perm))
102106
C = set(get_objects_for_user(user, perms, accept_global_perms=True, any_perm=any_perm))
103-
return list(C-A|B)
107+
return list(C - A | B)
108+
104109

105110
def get_editable_resource_types(user):
106111
"""
@@ -113,6 +118,7 @@ def get_editable_resource_types(user):
113118

114119
return get_resource_types_by_perm(user, ['models.write_nodegroup', 'models.delete_nodegroup'])
115120

121+
116122
def get_createable_resource_types(user):
117123
"""
118124
returns a list of graphs that a user can create resource instances of
@@ -161,10 +167,12 @@ def user_can_edit_resources(user):
161167
"""
162168

163169
if user.is_authenticated():
164-
return user.is_superuser or (len(get_editable_resource_types(user)) > 0 and
165-
user.groups.filter(name__in=settings.RESOURCE_EDITOR_GROUPS).exists())
170+
return user.is_superuser or \
171+
len(get_editable_resource_types(user)) > 0 or \
172+
user.groups.filter(name__in=settings.RESOURCE_EDITOR_GROUPS).exists()
166173
return False
167174

175+
168176
def user_can_read_concepts(user):
169177
"""
170178
Requires that a user is a part of the RDM Administrator group

arches/app/views/resource.py

+20-2
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,19 @@ def get(self, request, graphid=None, resourceid=None, view_template='views/resou
9797
pk=settings.SYSTEM_SETTINGS_RESOURCE_MODEL_ID).exclude(isresource=False).exclude(isactive=False)
9898
ontologyclass = [node for node in nodes if node.istopnode is True][0].ontologyclass
9999
relationship_type_values = get_resource_relationship_types()
100-
nodegroups = [node.nodegroup for node in nodes if node.is_collector and request.user.has_perm(
101-
'write_nodegroup', node.nodegroup)]
100+
101+
nodegroups = []
102+
editable_nodegroups = []
103+
for node in nodes:
104+
if node.is_collector:
105+
added = False
106+
if request.user.has_perm('write_nodegroup', node.nodegroup):
107+
editable_nodegroups.append(node.nodegroup)
108+
nodegroups.append(node.nodegroup)
109+
added = True
110+
if not added and request.user.has_perm('read_nodegroup', node.nodegroup):
111+
nodegroups.append(node.nodegroup)
112+
102113
nodes = nodes.filter(nodegroup__in=nodegroups)
103114
cards = graph.cardmodel_set.order_by('sortorder').filter(
104115
nodegroup__in=nodegroups).prefetch_related('cardxnodexwidget_set')
@@ -148,6 +159,13 @@ def get(self, request, graphid=None, resourceid=None, view_template='views/resou
148159
geocoding_providers = models.Geocoder.objects.all()
149160
templates = models.ReportTemplate.objects.all()
150161

162+
cards = JSONSerializer().serializeToPython(cards)
163+
editable_nodegroup_ids = [str(nodegroup.pk) for nodegroup in editable_nodegroups]
164+
for card in cards:
165+
card['is_writable'] = False
166+
if str(card['nodegroup_id']) in editable_nodegroup_ids:
167+
card['is_writable'] = True
168+
151169
context = self.get_context_data(
152170
main_script=main_script,
153171
resourceid=resourceid,

0 commit comments

Comments
 (0)