from Products.CPSSchemas.VocabulariesTool import LOCAL_VOCABULARY_CONTAINER_ID
def getVocabularyFor(self, context, voc_id):
    """Returns vocabulary for given context."""

    def hasLocalVocContainer(context):
        if getattr(context, 'hasObject', None) is None:
            return False
        return context.hasObject(LOCAL_VOCABULARY_CONTAINER_ID)

    def getLocalVocContainer(context):
        return context._getOb(LOCAL_VOCABULARY_CONTAINER_ID, None)

    getParentNode = lambda node: getattr(getattr(node, 'aq_inner', None),
                                         'aq_parent', None)

    if not hasLocalVocContainer(context):
        parent = getParentNode(context)
        while parent is not None:
            if hasLocalVocContainer(parent):
                return getLocalVocContainer(parent).getVocabulary(voc_id)
            parent = getParentNode(parent)
        # no local vocabulary container found for given context
        globvoc = self._getOb(voc_id, None)
        if globvoc is None:
            raise KeyError, 'No vocabulary by id %s' % voc_id
        return globvoc
    else:
        return getLocalVocContainer(context).getVocabulary(voc_id)
from Products.CPSSchemas.VocabulariesTool import VocabulariesTool
VocabulariesTool.getVocabularyFor = getVocabularyFor
