예제 #1
0
    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
예제 #2
0
    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
예제 #3
0
    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
예제 #4
0
    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)