def _get_stack_frames(self, target_module, form, source_form_datums): """ Set up the stack blocks for a single case list form action. :param target_module: Module that the user is returning to :param form: Case list form :param source_form_datums: List of datum from the case list form :return: CaseListFormStackFrames object """ from corehq.apps.app_manager.const import WORKFLOW_CASE_LIST source_session_var = self._get_source_session_var(form, target_module.case_type) source_case_id = session_var(source_session_var) case_count = CaseIDXPath(source_case_id).case().count() target_command = id_strings.menu_id(target_module) if target_module.case_list_form.post_form_workflow == WORKFLOW_CASE_LIST: frame_case_created = None frame_case_not_created = StackFrameMeta( self.get_if_clause(None, target_command), current_session=source_form_datums ) else: frame_case_created = StackFrameMeta( self.get_if_clause(case_count.gt(0), target_command), current_session=source_form_datums ) frame_case_not_created = StackFrameMeta( self.get_if_clause(case_count.eq(0), target_command), current_session=source_form_datums ) stack_frames = CaseListFormStackFrames( case_created=frame_case_created, case_not_created=frame_case_not_created ) stack_frames.source_session_var = source_session_var return stack_frames
def _get_stack_frames(self, target_module, form, source_form_datums): """ Set up the stack blocks for a single case list form action. :param target_module: Module that the user is returning to :param form: Case list form :param source_form_datums: List of datum from the case list form :return: CaseListFormStackFrames object """ source_session_var = self._get_source_session_var(form, target_module.case_type) source_case_id = session_var(source_session_var) case_count = CaseIDXPath(source_case_id).case().count() target_command = id_strings.menu_id(target_module) frame_case_created = StackFrameMeta( self.get_if_clause(case_count.gt(0), target_command), current_session=source_form_datums ) frame_case_not_created = StackFrameMeta( self.get_if_clause(case_count.eq(0), target_command), current_session=source_form_datums ) stack_frames = CaseListFormStackFrames( case_created=frame_case_created, case_not_created=frame_case_not_created ) stack_frames.source_session_var = source_session_var return stack_frames
def configure_entry_careplan_form(self, module, e, form=None, **kwargs): parent_module = self.app.get_module_by_unique_id(module.parent_select.module_id) e.datums.append( SessionDatum( id="case_id", nodeset=EntriesHelper.get_nodeset_xpath(parent_module.case_type), value="./@case_id", detail_select=self.details_helper.get_detail_id_safe(parent_module, "case_short"), detail_confirm=self.details_helper.get_detail_id_safe(parent_module, "case_long"), ) ) def session_datum(datum_id, case_type, parent_ref, parent_val): nodeset = ( CaseTypeXpath(case_type) .case() .select("index/%s" % parent_ref, session_var(parent_val), quote=False) .select("@status", "open") ) return SessionDatum( id=datum_id, nodeset=nodeset, value="./@case_id", detail_select=self.details_helper.get_detail_id_safe(module, "%s_short" % case_type), detail_confirm=self.details_helper.get_detail_id_safe(module, "%s_long" % case_type), ) e.stack = Stack() frame = CreateFrame() e.stack.add_frame(frame) if form.case_type == CAREPLAN_GOAL: if form.mode == "create": new_goal_id_var = "case_id_goal_new" e.datums.append(SessionDatum(id=new_goal_id_var, function="uuid()")) elif form.mode == "update": new_goal_id_var = "case_id_goal" e.datums.append(session_datum(new_goal_id_var, CAREPLAN_GOAL, "parent", "case_id")) if not module.display_separately: open_goal = CaseIDXPath(session_var(new_goal_id_var)).case().select("@status", "open") frame.if_clause = "{count} = 1".format(count=open_goal.count()) frame.add_command(XPath.string(id_strings.menu_id(parent_module))) frame.add_datum(StackDatum(id="case_id", value=session_var("case_id"))) frame.add_command(XPath.string(id_strings.menu_id(module))) frame.add_datum(StackDatum(id="case_id_goal", value=session_var(new_goal_id_var))) else: frame.add_command(XPath.string(id_strings.menu_id(module))) frame.add_datum(StackDatum(id="case_id", value=session_var("case_id"))) elif form.case_type == CAREPLAN_TASK: if not module.display_separately: frame.add_command(XPath.string(id_strings.menu_id(parent_module))) frame.add_datum(StackDatum(id="case_id", value=session_var("case_id"))) frame.add_command(XPath.string(id_strings.menu_id(module))) frame.add_datum(StackDatum(id="case_id_goal", value=session_var("case_id_goal"))) if form.mode == "update": count = ( CaseTypeXpath(CAREPLAN_TASK) .case() .select("index/goal", session_var("case_id_goal"), quote=False) .select("@status", "open") .count() ) frame.if_clause = "{count} >= 1".format(count=count) frame.add_command( XPath.string(id_strings.form_command(module.get_form_by_type(CAREPLAN_TASK, "update"))) ) else: frame.add_command(XPath.string(id_strings.menu_id(module))) frame.add_datum(StackDatum(id="case_id", value=session_var("case_id"))) if form.mode == "create": e.datums.append(session_datum("case_id_goal", CAREPLAN_GOAL, "parent", "case_id")) elif form.mode == "update": e.datums.append(session_datum("case_id_goal", CAREPLAN_GOAL, "parent", "case_id")) e.datums.append(session_datum("case_id_task", CAREPLAN_TASK, "goal", "case_id_goal"))
def _get_case_domain_xpath(self): case_id_xpath = CaseIDXPath(session_var(self.case_session_var)) return case_id_xpath.case( instance_name=RESULTS_INSTANCE).slash(COMMCARE_PROJECT)
def configure_entry_careplan_form(self, module, e, form=None, **kwargs): parent_module = self.app.get_module_by_unique_id(module.parent_select.module_id) e.datums.append(SessionDatum( id='case_id', nodeset=EntriesHelper.get_nodeset_xpath(parent_module.case_type), value="./@case_id", detail_select=self.details_helper.get_detail_id_safe(parent_module, 'case_short'), detail_confirm=self.details_helper.get_detail_id_safe(parent_module, 'case_long') )) def session_datum(datum_id, case_type, parent_ref, parent_val): nodeset = CaseTypeXpath(case_type).case().select( 'index/%s' % parent_ref, session_var(parent_val), quote=False ).select('@status', 'open') return SessionDatum( id=datum_id, nodeset=nodeset, value="./@case_id", detail_select=self.details_helper.get_detail_id_safe(module, '%s_short' % case_type), detail_confirm=self.details_helper.get_detail_id_safe(module, '%s_long' % case_type) ) e.stack = Stack() frame = CreateFrame() e.stack.add_frame(frame) if form.case_type == CAREPLAN_GOAL: if form.mode == 'create': new_goal_id_var = 'case_id_goal_new' e.datums.append(SessionDatum(id=new_goal_id_var, function='uuid()')) elif form.mode == 'update': new_goal_id_var = 'case_id_goal' e.datums.append(session_datum(new_goal_id_var, CAREPLAN_GOAL, 'parent', 'case_id')) if not module.display_separately: open_goal = CaseIDXPath(session_var(new_goal_id_var)).case().select('@status', 'open') frame.if_clause = '{count} = 1'.format(count=open_goal.count()) frame.add_command(XPath.string(id_strings.menu_id(parent_module))) frame.add_datum(StackDatum(id='case_id', value=session_var('case_id'))) frame.add_command(XPath.string(id_strings.menu_id(module))) frame.add_datum(StackDatum(id='case_id_goal', value=session_var(new_goal_id_var))) else: frame.add_command(XPath.string(id_strings.menu_id(module))) frame.add_datum(StackDatum(id='case_id', value=session_var('case_id'))) elif form.case_type == CAREPLAN_TASK: if not module.display_separately: frame.add_command(XPath.string(id_strings.menu_id(parent_module))) frame.add_datum(StackDatum(id='case_id', value=session_var('case_id'))) frame.add_command(XPath.string(id_strings.menu_id(module))) frame.add_datum(StackDatum(id='case_id_goal', value=session_var('case_id_goal'))) if form.mode == 'update': count = CaseTypeXpath(CAREPLAN_TASK).case().select( 'index/goal', session_var('case_id_goal'), quote=False ).select('@status', 'open').count() frame.if_clause = '{count} >= 1'.format(count=count) frame.add_command(XPath.string( id_strings.form_command(module.get_form_by_type(CAREPLAN_TASK, 'update')) )) else: frame.add_command(XPath.string(id_strings.menu_id(module))) frame.add_datum(StackDatum(id='case_id', value=session_var('case_id'))) if form.mode == 'create': e.datums.append(session_datum('case_id_goal', CAREPLAN_GOAL, 'parent', 'case_id')) elif form.mode == 'update': e.datums.append(session_datum('case_id_goal', CAREPLAN_GOAL, 'parent', 'case_id')) e.datums.append(session_datum('case_id_task', CAREPLAN_TASK, 'goal', 'case_id_goal'))
def get_stack_frames_for_case_list_form_target(self, target_module, form): stack_frames = [] target_command = id_strings.menu_id(target_module) if form.form_type == 'module_form': [reg_action] = form.get_registration_actions(target_module.case_type) source_session_var = form.session_var_for_action(reg_action) if form.form_type == 'advanced_form': # match case session variable reg_action = form.get_registration_actions(target_module.case_type)[0] source_session_var = reg_action.case_session_var source_case_id = session_var(source_session_var) case_count = CaseIDXPath(source_case_id).case().count() frame_case_created = StackFrameMeta(self.get_if_clause(case_count.gt(0), target_command)) stack_frames.append(frame_case_created) frame_case_not_created = StackFrameMeta(self.get_if_clause(case_count.eq(0), target_command)) stack_frames.append(frame_case_not_created) def add_datums_for_target(module, source_form_dm, allow_missing=False): """ Given a target module and a list of datums from the source module add children to the stack frames that are required by the target module and present in the source datums list. """ target_form_dm = self.helper.get_frame_children(module.get_form(0), module_only=True) used = set() for source_meta in source_form_dm: if source_meta.case_type: # This is true for registration forms where the case being created is a subcase try: target_dm = self.get_target_dm(target_form_dm, source_meta.case_type, module) except SuiteError: if source_meta.requires_selection: raise else: used.add(source_meta) meta = WorkflowDatumMeta.from_session_datum(source_meta) frame_case_created.add_child(meta.to_stack_datum(datum_id=target_dm.id)) frame_case_not_created.add_child(meta.to_stack_datum(datum_id=target_dm.id)) else: source_case_type = self.get_case_type_created_by_form(form, target_module) try: target_dm = self.get_target_dm(target_form_dm, source_case_type, module) except SuiteError: if not allow_missing: raise else: used.add(source_meta) datum_meta = WorkflowDatumMeta.from_session_datum(target_dm) frame_case_created.add_child(datum_meta.to_stack_datum(source_id=source_meta.id)) # return any source datums that were not already added to the target return [dm for dm in source_form_dm if dm not in used] source_form_dm = self.helper.get_form_datums(form) if target_module.root_module_id: # add stack children for the root module before adding any for the child module. root_module = target_module.root_module root_module_command = CommandId(id_strings.menu_id(root_module)) frame_case_created.add_child(root_module_command) frame_case_not_created.add_child(root_module_command) source_form_dm = add_datums_for_target(root_module, source_form_dm, allow_missing=True) frame_case_created.add_child(CommandId(target_command)) frame_case_not_created.add_child(CommandId(target_command)) add_datums_for_target(target_module, source_form_dm) return stack_frames