Ejemplo n.º 1
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
Ejemplo n.º 2
0
    def test_get_last_block_returns_last_block(self):
        group = {
            'blocks': [{
                'id': 'block1',
            }, {
                'id': 'block2'
            }]
        }

        last_block = SchemaHelper.get_last_block_in_group(group)

        self.assertIsNotNone(last_block)
        self.assertEqual(last_block['id'], 'block2')
Ejemplo n.º 3
0
    def test_get_last_block_returns_none_when_no_blocks(self):
        empty_group = {}

        last_block = SchemaHelper.get_last_block_in_group(empty_group)

        self.assertIsNone(last_block)