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() } } }
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, })
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)
def _get_params(wf_module: WfModule) -> Params: return wf_module.get_params()