Ejemplo n.º 1
0
    def transform(self, usage_info, block_structure):
        user = usage_info.user
        SplitTestTransformer().transform(usage_info, block_structure)
        staff_access = has_access(user, 'staff', usage_info.course_key)

        # If you have staff access, you are allowed access to the entire result list
        if staff_access:
            return

        user_partitions = block_structure.get_transformer_data(
            self, 'user_partitions')
        if not user_partitions:
            return

        user_groups = get_user_partition_groups(usage_info.course_key,
                                                user_partitions, user, 'id')

        for block_key in block_structure.topological_traversal():
            transformer_block_field = block_structure.get_transformer_block_field(
                block_key, self, 'merged_group_access')
            if transformer_block_field is None:
                continue

            access_denying_partition_ids = transformer_block_field.get_access_denying_partitions(
                user_groups)
            access_denying_reasons = []
            access_denying_messages = []
            for partition_id in access_denying_partition_ids:
                access_denying_partition = get_partition_from_id(
                    user_partitions, partition_id)

                if access_denying_partition:
                    user_group = user_groups.get(access_denying_partition.id)
                    allowed_groups = transformer_block_field.get_allowed_groups(
                    )[access_denying_partition.id]
                    access_denied_message = access_denying_partition.access_denied_message(
                        block_key, user, user_group, allowed_groups)
                    access_denying_reasons.append(
                        access_denying_partition.name)
                    if access_denied_message:
                        access_denying_messages.append(access_denied_message)

            if access_denying_reasons and not access_denying_messages:
                block_structure.remove_block(block_key, keep_descendants=False)
            else:
                if access_denying_reasons:
                    block_structure.override_xblock_field(
                        block_key, 'authorization_denial_reason',
                        access_denying_reasons[0])
                if access_denying_messages:
                    block_structure.override_xblock_field(
                        block_key, 'authorization_denial_message',
                        access_denying_messages[0])
Ejemplo n.º 2
0
    def transform_block_filters(self, usage_info, block_structure):
        user = usage_info.user
        result_list = SplitTestTransformer().transform_block_filters(
            usage_info, block_structure)
        staff_access = has_access(user, 'staff', usage_info.course_key)

        # If you have staff access, you are allowed access to the entire result list
        if staff_access:
            return result_list

        user_partitions = block_structure.get_transformer_data(
            self, 'user_partitions')
        if not user_partitions:
            return [block_structure.create_universal_filter()]

        user_groups = get_user_partition_groups(usage_info.course_key,
                                                user_partitions, user, 'id')

        for block_key in block_structure.topological_traversal():
            transformer_block_field = block_structure.get_transformer_block_field(
                block_key, self, 'merged_group_access')
            access_denying_partition_id = transformer_block_field.get_access_denying_partition(
                user_groups)
            access_denying_partition = get_partition_from_id(
                user_partitions, access_denying_partition_id)

            if access_denying_partition:
                user_group = user_groups.get(access_denying_partition.id)
                allowed_groups = transformer_block_field.get_allowed_groups()[
                    access_denying_partition.id]
                access_denied_message = access_denying_partition.access_denied_message(
                    block_key, user, user_group, allowed_groups)
                block_structure.override_xblock_field(
                    block_key, 'authorization_denial_reason',
                    access_denying_partition.name)
                block_structure.override_xblock_field(
                    block_key, 'authorization_denial_message',
                    access_denied_message)

        group_access_filter = block_structure.create_removal_filter(
            lambda block_key: (block_structure.get_transformer_block_field(
                block_key, self, 'merged_group_access'
            ).get_access_denying_partition(
                user_groups) is not None and block_structure.get_xblock_field(
                    block_key, 'authorization_denial_message') is None))
        result_list.append(group_access_filter)

        return result_list
Ejemplo n.º 3
0
    def transform_block_filters(self, usage_info, block_structure):
        user = usage_info.user
        result_list = SplitTestTransformer().transform_block_filters(usage_info, block_structure)

        user_partitions = block_structure.get_transformer_data(self, 'user_partitions')
        if not user_partitions:
            return [block_structure.create_universal_filter()]

        user_groups = get_user_partition_groups(usage_info.course_key, user_partitions, user, 'id')

        for block_key in block_structure.topological_traversal():
            transformer_block_field = block_structure.get_transformer_block_field(
                block_key, self, 'merged_group_access'
            )
            access_denying_partition_id = transformer_block_field.get_access_denying_partition(
                user_groups
            )
            access_denying_partition = get_partition_from_id(user_partitions, access_denying_partition_id)

            if not has_access(user, 'staff', block_key) and access_denying_partition:
                user_group = user_groups.get(access_denying_partition.id)
                allowed_groups = transformer_block_field.get_allowed_groups()[access_denying_partition.id]
                access_denied_message = access_denying_partition.access_denied_message(
                    block_key, user, user_group, allowed_groups
                )
                block_structure.override_xblock_field(
                    block_key, 'authorization_denial_reason', access_denying_partition.name
                )
                block_structure.override_xblock_field(
                    block_key, 'authorization_denial_message', access_denied_message
                )

        group_access_filter = block_structure.create_removal_filter(
            lambda block_key: (
                not has_access(user, 'staff', block_key) and
                block_structure.get_transformer_block_field(
                    block_key, self, 'merged_group_access'
                ).get_access_denying_partition(user_groups) is not None and
                block_structure.get_xblock_field(block_key, 'authorization_denial_message') is None
            )
        )
        result_list.append(group_access_filter)
        return result_list