This file is indexed.

/usr/share/pyshared/schooltool/utility/utility.py is in python-schooltool 1:2.1.0-0ubuntu1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
#
# SchoolTool - common information systems platform for school administration
# Copyright (c) 2006 Shuttleworth Foundation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#

from zope.component import queryUtility
from zope.traversing.api import traverse


class UtilitySpecification(object):
    """A specification of a utility.

    A utility gets:

    factory - the factory creating the utility.
    iface - the interface provided by the utility (by which it is looked up)
    name - optional utility name
    setUp - an optional setUp function for the utility. This can
            for instance be used for setting up indexes in a catalog.
            The setUp function gets passed the utility as an argument.
    override - override previous local utility setups. Replaces that
               utility with this one. Defaults to False
    storage_name - name the utility as visible in the ZMI.
                   If not specified will be autogenerated.
    """

    def __init__(self, factory, iface, name='', setUp=None,
                 override=False, storage_name=None):
        if storage_name is None:
            storage_name = iface.__module__ + '.' + iface.__name__
            if name:
                storage_name += '.' + name
        self.storage_name = storage_name
        self.factory = factory
        self.setUp = setUp
        self.iface = iface
        self.utility_name = name
        self.override = override


def setUpUtilities(site, specs):
   manager = site.getSiteManager()
   default = traverse(site, '++etc++site/default')
   for spec in specs:
       local_utility = getLocalUtility(default, spec)
       if local_utility is not None:
           if spec.override:
               # override existing utility
               name = local_utility.__name__
               manager.unregisterUtility(
                   local_utility, spec.iface, spec.utility_name)
               del default[name]
           else:
               # do not register this utility; we already got it
               continue
       utility = spec.factory()
       default[spec.storage_name] = utility
       if spec.setUp is not None:
           spec.setUp(utility)
       manager.registerUtility(utility, spec.iface, spec.utility_name)


def getLocalUtility(default, spec):
    util = queryUtility(spec.iface, name=spec.utility_name, default=None)
    if util is None or getattr(util, '__parent__', None) is default:
        return util
    else:
        return None


class UtilitySetUp(UtilitySpecification):
    """Set up a single utility."""

    def __call__(self, event):
        site = event.object
        setUpUtilities(site, [self])


class MultiUtilitySetUp(object):
    """Set up multiple related utilities that need to be in order.

    (for instance intids needs to be set up before the catalog is).
    """

    def __init__(self, *specifications):
        self.specifications = specifications

    def __call__(self, event):
        site = event.object
        setUpUtilities(site, self.specifications)