def get_workflow_as_delta_and_needs_render(self): """ Return (apply-delta dict, needs_render), or raise Workflow.DoesNotExist needs_render is a (workflow_id, delta_id) pair. """ with Workflow.authorized_lookup_and_cooperative_lock( 'read', self.scope['user'], self.scope['session'], pk=self.workflow_id) as workflow: request = RequestWrapper(self.scope['user'], self.scope['session']) ret = { 'updateWorkflow': (WorkflowSerializer(workflow, context={ 'request': request }).data), } tabs = list(workflow.live_tabs) ret['updateTabs'] = dict( (tab.slug, TabSerializer(tab).data) for tab in tabs) wf_modules = list(WfModule.live_in_workflow(workflow.id)) ret['updateWfModules'] = dict( (str(wfm.id), WfModuleSerializer(wfm).data) for wfm in wf_modules) if workflow.are_all_render_results_fresh(): needs_render = None else: needs_render = (workflow.id, workflow.last_delta_id) return (ret, needs_render)
def workflow_detail(request, workflow_id, format=None): if request.method == 'POST': workflow = lookup_workflow_for_write(workflow_id, request) try: valid_fields = {'public'} if not set(request.data.keys()).intersection(valid_fields): raise ValueError('Unknown fields: {}'.format(request.data)) if 'public' in request.data: # TODO this should be a command, so it's undoable workflow.public = request.data['public'] workflow.save(update_fields=['public']) except Exception as e: return JsonResponse({'message': str(e), 'status_code': 400}, status=status.HTTP_400_BAD_REQUEST) return Response(status=status.HTTP_204_NO_CONTENT) elif request.method == 'DELETE': with Workflow.authorized_lookup_and_cooperative_lock( 'owner', request.user, request.session, pk=workflow_id ) as workflow: workflow.delete() return Response(status=status.HTTP_204_NO_CONTENT)
def authorize(self, level): try: with Workflow.authorized_lookup_and_cooperative_lock( level, self.scope['user'], self.scope['session'], pk=self.workflow_id): return True except Workflow.DoesNotExist: return False
def workflow_detail(request, workflow_id, format=None): if request.method == "POST": workflow = lookup_workflow_for_write(workflow_id, request) valid_fields = {"public"} if not set(request.data.keys()).intersection(valid_fields): return JsonResponse( { "message": "Unknown fields: %r" % request.data, "status_code": 400 }, status=status.HTTP_400_BAD_REQUEST, ) if "public" in request.data: workflow.public = bool(request.data["public"]) workflow.save(update_fields=["public"]) return Response(status=status.HTTP_204_NO_CONTENT) elif request.method == "DELETE": try: with Workflow.authorized_lookup_and_cooperative_lock( "owner", request.user, request.session, pk=workflow_id) as workflow_lock: workflow = workflow_lock.workflow workflow.delete() return Response(status=status.HTTP_204_NO_CONTENT) except Workflow.DoesNotExist as err: if err.args[0] == "owner access denied": return JsonResponse( { "message": str(err), "status_code": 403 }, status=status.HTTP_403_FORBIDDEN, ) else: return JsonResponse( { "message": "Workflow not found", "status_code": 404 }, status=status.HTTP_404_NOT_FOUND, )
def workflow_detail(request, workflow_id, format=None): if request.method == 'POST': workflow = lookup_workflow_for_write(workflow_id, request) valid_fields = {'public'} if not set(request.data.keys()).intersection(valid_fields): return JsonResponse( { 'message': 'Unknown fields: %r' % request.data, 'status_code': 400, }, status=status.HTTP_400_BAD_REQUEST) if 'public' in request.data: workflow.public = bool(request.data['public']) workflow.save(update_fields=['public']) return Response(status=status.HTTP_204_NO_CONTENT) elif request.method == 'DELETE': try: with Workflow.authorized_lookup_and_cooperative_lock( 'owner', request.user, request.session, pk=workflow_id) as workflow: workflow.delete() return Response(status=status.HTTP_204_NO_CONTENT) except Workflow.DoesNotExist as err: if err.args[0] == 'owner access denied': return JsonResponse({ 'message': str(err), 'status_code': 403, }, status=status.HTTP_403_FORBIDDEN) else: return JsonResponse( { 'message': 'Workflow not found', 'status_code': 404, }, status=status.HTTP_404_NOT_FOUND)