From 3dfab4615a0753b4309c1371f292a99e9f77c717 Mon Sep 17 00:00:00 2001 From: Branson Stephens <branson.stephens@ligo.org> Date: Thu, 6 Aug 2015 12:52:40 -0500 Subject: [PATCH] Fixed bug with permissions button. --- gracedb/api.py | 53 +++++++++++++++++++++++++++++++- gracedb/views.py | 79 ++++++++++++++++++++++++++++-------------------- 2 files changed, 98 insertions(+), 34 deletions(-) diff --git a/gracedb/api.py b/gracedb/api.py index 198fdb398..a4a7c5171 100644 --- a/gracedb/api.py +++ b/gracedb/api.py @@ -1329,7 +1329,30 @@ class GroupEventPermissionDetail(APIView): object_pk=event.id, group=group, permission=permission) + event.refresh_perms() # Add this gop to the return dictionary + + # XXX if the event is a subclass, we need to create perms on the + # underlying event as well. + # XXX Is this bad? It sort of feels like a side-effect. + if not type(event) is Event: + # how to get the permission object? + shortname = permission.codename.split('_')[0] + underlying_event = Event.objects.get(id=event.id) + underlying_model = underlying_event.__class__.__name__.lower() + codename = shortname + '_' + underlying_model + try: + underlying_permission = Permission.objects.get(codename=codename) + except Permission.DoesNotExist: + msg = "Problem creating permission: Could not find underlying event perm." + return Response(msg, status = status.HTTP_500_INTERNAL_SERVER_ERROR) + ugop, ucreated = GroupObjectPermission.objects.get_or_create( + content_type=getContentType(underlying_event), + object_pk=underlying_event.id, + group=group, + permission=underlying_permission) + underlying_event.refresh_perms() + except Exception, e: # We're gonna blame the user here. return Response("Problem creating permission: %" % str(e), @@ -1362,10 +1385,38 @@ class GroupEventPermissionDetail(APIView): object_pk=event.id, group=group, permission=permission) + gop.delete() + event.refresh_perms() + + # XXX if the event is a subclass, we need to delete perms on the + # underlying event as well. + # XXX Is this bad? It sort of feels like a side-effect. + if not type(event) is Event: + # how to get the permission object? + shortname = permission.codename.split('_')[0] + underlying_event = Event.objects.get(id=event.id) + underlying_model = underlying_event.__class__.__name__.lower() + codename = shortname + '_' + underlying_model + try: + underlying_permission = Permission.objects.get(codename=codename) + except Permission.DoesNotExist: + msg = "Problem creating permission: Could not find underlying event perm." + return Response(msg, status = status.HTTP_500_INTERNAL_SERVER_ERROR) + ugop = GroupObjectPermission.objects.get( + content_type=getContentType(underlying_event), + object_pk=underlying_event.id, + group=group, + permission=underlying_permission) + ugop.delete() + underlying_event.refresh_perms() + except GroupObjectPermission.DoesNotExist: return Response("GroupObjectPermission not found.", status=status.HTTP_404_NOT_FOUND) - gop.delete() + except Exception, e: + return Response("Problem deleting permission: %s" % str(e), + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + rv = {'message': 'Permission successfully deleted.'} return Response(rv, status=status.HTTP_200_OK) diff --git a/gracedb/views.py b/gracedb/views.py index 358c174d6..3496f0441 100644 --- a/gracedb/views.py +++ b/gracedb/views.py @@ -662,36 +662,8 @@ def file_list(request, event): # log messages.) If the action is 'protect', both of these # permissions are removed for the group in question. # -@event_and_auth_required -def modify_permissions(request, event): - # Get group_name and action from POST - if not request.method=='POST': - msg = 'Modify_permissions only allows POST.' - return HttpResponseBadRequest(msg) - - group_name = request.POST.get('group_name', None) - action = request.POST.get('action', None) - - if not group_name or not action: - msg = 'Modify_permissons requires both group_name and action in POST.' - return HttpResponseBadRequest(msg) - - # Make sure the user is authorized. - if action=='expose': - if not request.user.has_perm('guardian.add_groupobjectpermission'): - msg = "You aren't authorized to create permission objects." - return HttpResponseForbidden(msg) - elif action=='protect': - if not request.user.has_perm('guardian.delete_groupobjectpermission'): - msg = "You aren't authorized to delete permission objects." - return HttpResponseForbidden(msg) - - # Get the group - try: - g = AuthGroup.objects.get(name=group_name) - except Group.DoesNotExist: - return HttpResponseNotFound('Group not found') +def update_event_perms_for_group(event, group, action): # Get the content type out model_name = event.__class__.__name__.lower() ctype = ContentType.objects.get(app_label='gracedb', model=model_name) @@ -704,17 +676,17 @@ def modify_permissions(request, event): if action=='expose': # Create two group object permissions GroupObjectPermission.objects.get_or_create( - content_type=ctype, group=g, permission=view, + content_type=ctype, group=group, permission=view, object_pk=event.id) GroupObjectPermission.objects.get_or_create( - content_type=ctype, group=g, permission=change, + content_type=ctype, group=group, permission=change, object_pk=event.id) elif action=='protect': # Retrieve both group object permissions # Delete them try: gop = GroupObjectPermission.objects.get( - content_type=ctype, group=g, permission=change, + content_type=ctype, group=group, permission=change, object_pk=event.id) gop.delete() except GroupObjectPermission.DoesNotExist: @@ -722,16 +694,57 @@ def modify_permissions(request, event): pass try: gop = GroupObjectPermission.objects.get( - content_type=ctype, group=g, permission=view, + content_type=ctype, group=group, permission=view, object_pk=event.id) gop.delete() except GroupObjectPermission.DoesNotExist: # Couldn't find it. Take no action. pass + + # lastly + event.refresh_perms() + +@event_and_auth_required +def modify_permissions(request, event): + # Get group_name and action from POST + if not request.method=='POST': + msg = 'Modify_permissions only allows POST.' + return HttpResponseBadRequest(msg) + + group_name = request.POST.get('group_name', None) + action = request.POST.get('action', None) + + if not group_name or not action: + msg = 'Modify_permissons requires both group_name and action in POST.' + return HttpResponseBadRequest(msg) + + # Make sure the user is authorized. + if action=='expose': + if not request.user.has_perm('guardian.add_groupobjectpermission'): + msg = "You aren't authorized to create permission objects." + return HttpResponseForbidden(msg) + elif action=='protect': + if not request.user.has_perm('guardian.delete_groupobjectpermission'): + msg = "You aren't authorized to delete permission objects." + return HttpResponseForbidden(msg) else: msg = "Unknown action. Choices are 'expose' and 'protect'." return HttpResponseBadRequest(msg) + # Get the group + try: + g = AuthGroup.objects.get(name=group_name) + except Group.DoesNotExist: + return HttpResponseNotFound('Group not found') + + update_event_perms_for_group(event, g, action) + + # In case this is a subclass, let's check and assign default + # perms on the underlying Event as well. + if not type(event) is Event: + underlying_event = Event.objects.get(id=event.id) + update_event_perms_for_group(underlying_event, g, action) + # Finished. Redirect back to the event. return HttpResponseRedirect(reverse("view", args=[event.graceid()])) -- GitLab