예제 #1
0
    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)
예제 #2
0
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)
예제 #3
0
 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
예제 #4
0
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,
                )
예제 #5
0
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)