def get_blocks(self): blocks = [] for group in SchemaHelper.get_groups(self.survey_json): if 'skip_condition' in group: skip = evaluate_skip_condition(group['skip_condition'], self.metadata, self.answer_store) if skip: continue no_of_repeats = 1 repeating_rule = SchemaHelper.get_repeat_rule(group) if repeating_rule: no_of_repeats = evaluate_repeat(repeating_rule, self.answer_store) for i in range(0, no_of_repeats): for block in group['blocks']: if 'skip_condition' in block: skip = evaluate_skip_condition(block['skip_condition'], self.metadata, self.answer_store) if skip: continue blocks.append({ "group_id": group['id'], "group_instance": i, "block": block, }) return blocks
def build_navigation(self, current_group_id, current_group_instance): """ Build navigation based on the current group/instance selected :param current_group_id: :param current_group_instance: :return: """ if 'navigation' not in self.survey_json: return None navigation = [] for group in filter(lambda x: 'hide_in_navigation' not in x, self.survey_json['groups']): first_location = Location(group['id'], 0, group['blocks'][0]['id']) logger.debug("building frontend navigation", group_id=group['id']) skip_group = self._should_skip_group(current_group_instance, group) if not skip_group: repeating_rule = SchemaHelper.get_repeat_rule(group) if repeating_rule: logger.debug("building repeating navigation", group_id=group['id']) navigation.extend(self._build_repeating_navigation(repeating_rule, group, current_group_id, current_group_instance)) else: logger.debug("building navigation", group_id=group['id']) navigation.append(self._build_single_navigation(group, current_group_id, first_location)) return navigation
def build_navigation(self, current_group_id, current_group_instance): """ Build navigation based on the current group/instance selected :param current_group_id: :param current_group_instance: :return: """ if self.survey_json.get('navigation', False) is False: return None navigation = [] last_group_id = SchemaHelper.get_last_group_id(self.survey_json) for group in filter(lambda x: 'hide_in_navigation' not in x, self.survey_json['groups']): logger.debug("building frontend navigation", group_id=group['id']) first_location = Location(group['id'], 0, group['blocks'][0]['id']) last_block_in_group = SchemaHelper.get_last_block_in_group(group) is_summary_or_confirm_group = last_block_in_group and \ SchemaHelper.is_summary_or_confirmation(last_block_in_group) last_block_location = Location(group['id'], 0, last_block_in_group['id']) can_get_to_summary = is_summary_or_confirm_group and self.routing_path and \ last_block_location in self.routing_path skip_group = self._should_skip_group(current_group_instance, group) if not skip_group: repeating_rule = SchemaHelper.get_repeat_rule(group) if repeating_rule: logger.debug("building repeating navigation", group_id=group['id']) navigation.extend( self._build_repeating_navigation( repeating_rule, group, current_group_id, current_group_instance)) elif last_group_id == group['id'] and can_get_to_summary: logger.debug("building navigation", group_id=group['id']) if len(self.completed_blocks) > 0 and set( self.routing_path[:-1]).issubset( self.completed_blocks): navigation.append( self._build_single_navigation( group, current_group_id, first_location)) elif last_group_id != group[ 'id'] and not is_summary_or_confirm_group: logger.debug("building navigation", group_id=group['id']) navigation.append( self._build_single_navigation(group, current_group_id, first_location)) return navigation
def test_get_repeating_rule(self): survey = load_schema_file("test_repeating_household.json") groups = [group for group in SchemaHelper.get_groups(survey)] rule = SchemaHelper.get_repeat_rule(groups[1]) self.assertEqual( { 'type': 'answer_count', 'answer_id': 'first-name', 'navigation_label_answer_ids': ['first-name', 'last-name'], }, rule)