예제 #1
0
 def __init__(self,
              _context,
              provides,
              class_=None,
              component=None,
              name=''):
     if class_ is not None:
         assert component is None, "Both class and component specified"
         self.component = class_()
     else:
         assert component is not None, \
                 "Neither class nor component specified"
         self.component = component
     self._context = _context
     self.provides = provides
     self.name = name
     self.permission_collector = PermissionCollectingContext()
     self.contentdirective = ClassDirective(self.permission_collector,
                                            class_)
예제 #2
0
class SecuredUtilityDirective:
    def __init__(self,
                 _context,
                 provides,
                 class_=None,
                 component=None,
                 name=''):
        if class_ is not None:
            assert component is None, "Both class and component specified"
            self.component = class_()
        else:
            assert component is not None, \
                    "Neither class nor component specified"
            self.component = component
        self._context = _context
        self.provides = provides
        self.name = name
        self.permission_collector = PermissionCollectingContext()
        self.contentdirective = ClassDirective(self.permission_collector,
                                               class_)

    def require(self, _context, **kw):
        self.contentdirective.require(_context, **kw)

    def allow(self, _context, **kw):
        self.contentdirective.allow(_context, **kw)

    def __call__(self):
        # Set up the utility with an appropriate proxy.
        # Note that this does not take into account other security
        # directives on this content made later on during the execution
        # of the zcml.
        checker = Checker(self.permission_collector.get_permissions,
                          self.permission_collector.set_permissions)
        component = ProxyFactory(self.component, checker=checker)
        utility(self._context,
                self.provides,
                component=component,
                name=self.name)
        return ()
예제 #3
0
 def __init__(self, _context, provides, class_=None, component=None,
              name=''):
     if class_ is not None:
         assert component is None, "Both class and component specified"
         self.component = class_()
     else:
         assert component is not None, \
                 "Neither class nor component specified"
         self.component = component
     self._context = _context
     self.provides = provides
     self.name = name
     self.permission_collector = PermissionCollectingContext()
     self.contentdirective = ClassDirective(
         self.permission_collector, class_)
예제 #4
0
class SecuredUtilityDirective:

    def __init__(self, _context, provides, class_=None, component=None,
                 name=''):
        if class_ is not None:
            assert component is None, "Both class and component specified"
            self.component = class_()
        else:
            assert component is not None, \
                    "Neither class nor component specified"
            self.component = component
        self._context = _context
        self.provides = provides
        self.name = name
        self.permission_collector = PermissionCollectingContext()
        self.contentdirective = ClassDirective(
            self.permission_collector, class_)

    def require(self, _context, **kw):
        self.contentdirective.require(_context, **kw)

    def allow(self, _context, **kw):
        self.contentdirective.allow(_context, **kw)

    def __call__(self):
        # Set up the utility with an appropriate proxy.
        # Note that this does not take into account other security
        # directives on this content made later on during the execution
        # of the zcml.
        checker = Checker(
            self.permission_collector.get_permissions,
            self.permission_collector.set_permissions)
        component = ProxyFactory(self.component, checker=checker)
        utility(
            self._context, self.provides, component=component, name=self.name)
        return ()
예제 #5
0
def addMenuItem(_context,
                title,
                description='',
                menu=None,
                for_=None,
                class_=None,
                factory=None,
                view=None,
                icon=None,
                filter=None,
                permission=None,
                layer=IDefaultBrowserLayer,
                extra=None,
                order=0,
                item_class=None):
    """Create an add menu item for a given class or factory

    As a convenience, a class can be provided, in which case, a
    factory is automatically defined based on the class.  In this
    case, the factory id is based on the class name.

    """

    if for_ is not None:
        _context.action(discriminator=None,
                        callable=provideInterface,
                        args=('', for_))
        forname = 'For' + for_.getName()
    else:
        for_ = IAdding
        forname = ''

    if menu is not None:
        if isinstance(menu, six.string_types):
            menu = getUtility(IMenuItemType, menu)
            if menu is None:
                raise ValueError("Missing menu id '%s'" % menu)

    if class_ is None:
        if factory is None:
            raise ValueError("Must specify either class or factory")
    else:
        if factory is not None:
            raise ValueError("Can't specify both class and factory")
        if permission is None:
            raise ValueError(
                "A permission must be specified when a class is used")
        factory = "BrowserAdd%s__%s.%s" % (forname, class_.__module__,
                                           class_.__name__)
        ClassDirective(_context, class_).factory(_context, id=factory)

    extra = {'factory': factory}

    if view:
        action = view
        # This action will check if the view exists
        _context.action(discriminator=None,
                        callable=_checkViewFor,
                        args=(for_, layer, view),
                        order=999999)
    else:
        action = factory

    if menu == None:
        menu = AddMenu

    return menuItemsDirective(_context, menu, for_,
                              layer=layer).menuItem(_context, action, title,
                                                    description, icon, filter,
                                                    permission, extra, order,
                                                    item_class)