view MoinMoin/groups/backends/composite_groups.py @ 4812:a1018d829c3e

Groups2009: It is possible to import backends as 'from Moin.groups import WikiGroups, ConfigGroups, CompositeGroups'. Compose backend was renamed to Composite.
author Dmitrijs Milajevs <dimazest@gmail.com>
date Sun, 14 Jun 2009 17:23:58 +0200
parents MoinMoin/groups/backends/compose_group.py@89497de6165d
children 7d8f51be2285
line wrap: on
line source
# -*- coding: iso-8859-1 -*-
"""
MoinMoin - group access via various backends.

@copyright: 2009 DmitrijsMilajevs
@license: GPL, see COPYING for details
"""

from MoinMoin.groups.backends import BaseBackend


class CompositeGroups(BaseBackend):
    """
    Manage several group backends.
    """

    def __init__(self, request, *backends):
        """
        @param backends: list of group backends which are used to get
                         access to the group definitions.
        """
        super(CompositeGroups, self).__init__(request)
        self._backends = backends

    def __getitem__(self, group_name):
        """
        Get a group by its name. First match counts.

        @param group_name: name of the group [unicode]
        """
        for backend in self._backends:
            if group_name in backend:
                return backend[group_name]
        raise KeyError("There is no such group %s" % group_name)

    def __iter__(self):
        """
        Iterate over group names in all backends (filtering duplicates).
        """
        yielded_groups = set()

        for backend in self._backends:
            for group_name in backend:
                if group_name not in yielded_groups:
                    yield group_name
                    yielded_groups.add(group_name)

    def __contains__(self, group_name):
        """
        Check if a group called group_name is available in any of the backends.

        @param group_name: name of the group [unicode]
        """
        for backend in self._backends:
            if group_name in backend:
                return True
        return False

    def __repr__(self):
        return "<%s backends=%s>" % (self.__class__, self._backends)