Exemplo n.º 1
0
def _wf_module_delete_secret_and_build_delta(
    workflow: Workflow,
    wf_module: WfModule,
    param: str
) -> Optional[Dict[str, Any]]:
    """
    Write a new secret (or `None`) to `wf_module`, or raise.

    Return a "delta" for websockets.ws_client_send_delta_async(), or `None` if
    the database has not been modified.

    Raise Workflow.DoesNotExist if the Workflow was deleted.
    """
    with workflow.cooperative_lock():  # raises Workflow.DoesNotExist
        wf_module.refresh_from_db()  # may return None

        if (
            wf_module is None
            or wf_module.secrets.get(param) is None
        ):
            return None

        wf_module.secrets = dict(wf_module.secrets)
        del wf_module.secrets[param]
        wf_module.save(update_fields=['secrets'])

        return {
            'updateWfModules': {
                str(wf_module.id): {
                    'params': wf_module.get_params().as_dict()
                }
            }
        }
Exemplo n.º 2
0
    def post(
        self,
        request: HttpRequest,
        workflow_lock: WorkflowCooperativeLock,
        wf_module: WfModule,
        file_param_id_name: str,
        uuid: UUID,
    ):
        """
        Create an UploadedFile and delete the InProgressUpload.

        Authenticate request as documented in `loads_wf_module_for_api_upload`.
        (That means respond with 400, 403 or 404 on error.)

        Return 400 Bad Request unless the JSON body looks like:

            {"filename": "a-filename.csv"}
        """
        try:
            body_json = json.loads(request.body)  # assume UTF-8
        except UnicodeDecodeError:
            return ErrorResponse(400, "body-not-utf8")
        except json.JSONDecodeError:
            return ErrorResponse(400, "body-not-json")
        form = CompleteUploadForm(body_json)
        if form.errors:
            return ErrorResponse(400, "body-has-errors",
                                 {"errors": form.errors.get_json_data()})
        filename = form.cleaned_data["filename"]

        try:
            in_progress_upload = wf_module.in_progress_uploads.get(
                id=uuid, is_completed=False)
        except InProgressUpload.DoesNotExist:
            return ErrorResponse(404, "upload-not-found")
        try:
            uploaded_file = in_progress_upload.convert_to_uploaded_file(
                filename)
        except FileNotFoundError:
            return ErrorResponse(409, "file-not-uploaded")

        # After the cooperative lock ends, update the WfModule.
        want_params = {
            **wf_module.get_params(), file_param_id_name: uploaded_file.uuid
        }

        def create_change_parameters_command():
            workflow = workflow_lock.workflow
            # sends delta to Websockets clients and queues render.
            async_to_sync(ChangeParametersCommand.create)(
                workflow=workflow, wf_module=wf_module, new_values=want_params)

        workflow_lock.after_commit(create_change_parameters_command)

        return JsonResponse({
            "uuid": uploaded_file.uuid,
            "name": uploaded_file.name,
            "size": uploaded_file.size,
            "createdAt": uploaded_file.created_at,
        })
Exemplo n.º 3
0
    async def fetch(self, wf_module: WfModule) -> None:
        """Run `call_fetch(wf_module)` and write to `wf_module`.

        `wf_module` will be set to `busy` until the fetch completes. After,
        it will be either `ready` or `error`.
        """
        # FIXME database writes probably belong in dispatch.py. Right now,
        # here, half is dispatch stuff and half is database stuff.
        if not hasattr(self.module, 'fetch'):
            return

        params = wf_module.get_params().to_painful_dict(None)

        await wf_module.set_busy()

        result = self.call_fetch(params)
        result.truncate_in_place_if_too_big()
        result.sanitize_in_place()

        await ModuleImpl.commit_result(wf_module, result)
Exemplo n.º 4
0
def _get_params(wf_module: WfModule) -> Params:
    return wf_module.get_params()