def post(self, request: HttpRequest, workflow: Workflow): if request.content_type != "application/json": return HttpResponse( "request must have type application/json", status=status.HTTP_400_BAD_REQUEST, ) try: body = json.loads(request.body) except ValueError: return JsonResponse( {"message": "request is invalid JSON"}, status=status.HTTP_400_BAD_REQUEST, ) if (type(body) != dict or len(body) != 1 or "public" not in body or type(body["public"]) != bool): return JsonResponse( { "message": 'request JSON must be an Object with a "public" property of type Boolean' }, status=status.HTTP_400_BAD_REQUEST, ) workflow.public = body["public"] workflow.save(update_fields=["public"]) return HttpResponse(status=status.HTTP_204_NO_CONTENT)
def _write_tab_position(workflow: Workflow, tab_slug: str) -> None: """Write position in DB, or raise (Workflow|Tab).DoesNotExist.""" with workflow.cooperative_lock(): # raises Workflow.DoesNotExist # raises Tab.DoesNotExist, e.g. if tab.is_deleted tab = workflow.live_tabs.get(slug=tab_slug) workflow.selected_tab_position = tab.position workflow.save(update_fields=["selected_tab_position"])
def make_init_state(request, workflow: Workflow, modules: Dict[str, ModuleZipfile]) -> Dict[str, Any]: """Build a dict to embed as JSON in `window.initState` in HTML. Raise Http404 if the workflow disappeared. Side-effect: update workflow.last_viewed_at. """ try: with workflow.cooperative_lock(): # raise DoesNotExist on race if request.user.is_anonymous: user = None else: lock_user_by_id(request.user.id, for_write=False) user = query_clientside_user(request.user.id) workflow.last_viewed_at = datetime.datetime.now() workflow.save(update_fields=["last_viewed_at"]) state = clientside.Init( user=user, workflow=workflow.to_clientside(), tabs={ tab.slug: tab.to_clientside() for tab in workflow.live_tabs }, steps={ step.id: step.to_clientside( force_module_zipfile=modules.get(step.module_id_name)) for step in Step.live_in_workflow( workflow).prefetch_related("tab") }, modules={ module_id: clientside.Module( spec=module.get_spec(), js_module=module.get_optional_js_module(), ) for module_id, module in modules.items() }, blocks={ block.slug: block.to_clientside() for block in workflow.blocks.all() }, settings={ "bigTableRowsPerTile": settings.BIG_TABLE_ROWS_PER_TILE, "bigTableColumnsPerTile": settings.BIG_TABLE_COLUMNS_PER_TILE, }, ) except Workflow.DoesNotExist: raise Http404("Workflow was recently deleted") ctx = JsonizeContext(request.locale_id, modules) return jsonize_clientside_init(state, ctx)
def _write_step_position(workflow: Workflow, step_id: int) -> None: """Write position in DB, or raise (Workflow|Tab|Step).DoesNotExist.""" with workflow.cooperative_lock(): # raises Workflow.DoesNotExist # Raises Step.DoesNotExist, e.g. if tab.is_deleted step = Step.live_in_workflow(workflow).get(pk=step_id) tab = step.tab tab.selected_step_position = step.order tab.save(update_fields=["selected_step_position"]) workflow.selected_tab_position = tab.position workflow.save(update_fields=["selected_tab_position"])
def _write_wf_module_position(workflow: Workflow, wf_module_id: int) -> None: """Write position in DB, or raise (Workflow|Tab|WfModule).DoesNotExist.""" with workflow.cooperative_lock(): # raises Workflow.DoesNotExist # Raises WfModule.DoesNotExist, e.g. if tab.is_deleted wf_module = WfModule.live_in_workflow(workflow).get(pk=wf_module_id) tab = wf_module.tab tab.selected_wf_module_position = wf_module.order tab.save(update_fields=["selected_wf_module_position"]) workflow.selected_tab_position = tab.position workflow.save(update_fields=["selected_tab_position"])
def make_init_state(request, workflow: Workflow, modules: Dict[str, ModuleZipfile]) -> Dict[str, Any]: """ Build a dict to embed as JSON in `window.initState` in HTML. Raise Http404 if the workflow disappeared. Side-effect: update workflow.last_viewed_at. """ try: with workflow.cooperative_lock(): # raise DoesNotExist on race workflow.last_viewed_at = timezone.now() workflow.save(update_fields=["last_viewed_at"]) state = clientside.Init( workflow=workflow.to_clientside(), tabs={ tab.slug: tab.to_clientside() for tab in workflow.live_tabs }, steps={ step.id: step.to_clientside() for step in WfModule.live_in_workflow(workflow) }, modules={ module_id: clientside.Module( spec=module.get_spec(), js_module=module.get_optional_js_module(), ) for module_id, module in modules.items() }, ) except Workflow.DoesNotExist: raise Http404("Workflow was recently deleted") ctx = JsonizeContext(request.user, request.session, request.locale_id, modules) return jsonize_clientside_init(state, ctx)