Esempio n. 1
0
    def test_data_setter(self):
        folder = create(Builder('folder').titled(u'The Folder'))

        adapter = getAdapter(folder,
                             IDataCollector,
                             name='constrain_types_adapter')
        allowed_types = ['Collection', 'Document', 'Folder']
        immediately_addable_types = ['Collection', 'Folder']

        # Test when mode = 'ENABLED'
        adapter.setData(
            {
                'mode': ENABLED,
                'locally_allowed': allowed_types,
                'immediately_addable': immediately_addable_types
            },
            metadata=None)

        constrain_types = IConstrainTypes(folder)
        self.assertEquals(ENABLED, constrain_types.getConstrainTypesMode())
        self.assertEquals(allowed_types,
                          constrain_types.getLocallyAllowedTypes())
        self.assertEquals(immediately_addable_types,
                          constrain_types.getImmediatelyAddableTypes())

        # Test when mode = 'DISABLED'
        # Results of getLocallyAllowedTypes() and getImmediatelyAddableTypes()
        # are determined by the portal type
        adapter.setData(
            {
                'mode': DISABLED,
                'locally_allowed': allowed_types,
                'immediately_addable': immediately_addable_types
            },
            metadata=None)
        constrain_types = IConstrainTypes(folder)
        self.assertEquals(DISABLED, constrain_types.getConstrainTypesMode())
        self.assertEquals(self.standard_types,
                          constrain_types.getLocallyAllowedTypes())
        self.assertEquals(self.standard_types,
                          constrain_types.getImmediatelyAddableTypes())

        # Test when mode = 'ACQUIRE'
        # Results of getLocallyAllowedTypes() and getImmediatelyAddableTypes()
        # are determined by the parent object
        adapter.setData(
            {
                'mode': ACQUIRE,
                'locally_allowed': allowed_types,
                'immediately_addable': immediately_addable_types
            },
            metadata=None)
        constrain_types = IConstrainTypes(folder)
        self.assertEquals(ACQUIRE, constrain_types.getConstrainTypesMode())
        self.assertEquals(self.standard_types,
                          constrain_types.getLocallyAllowedTypes())
        self.assertEquals(self.standard_types,
                          constrain_types.getImmediatelyAddableTypes())
Esempio n. 2
0
 def get_constraintypes_config(self, obj):
     ctypes = IConstrainTypes(obj)
     return {
         'mode': ctypes.getConstrainTypesMode(),
         'locally allowed': set(ctypes.getLocallyAllowedTypes()),
         'immediately addable': set(ctypes.getImmediatelyAddableTypes())
     }
Esempio n. 3
0
    def getMenuItems(self, context, request):
        """Return menu item entries in a TAL-friendly form."""
        results = BaseFactoriesMenu.getMenuItems(self, context, request)
        
        factories_view = getMultiAdapter((context, request), name='folder_factories')

        haveMore = False
        include = None

        addContext = factories_view.default_page_add_context()
        if not addContext:
            return results
        allowedTypes = _allowedTypes(request, addContext)

        constraints = IConstrainTypes(addContext, None)
        if constraints is not None:
            include = constraints.getImmediatelyAddableTypes()
            if len(include) < len(allowedTypes):
                haveMore = True

        results.append({'title'       : _p(u'folder_add_to_default_page', default=u'Add to default page'),
                        'description' : _p(u'Add content to the default page'),
                        'action'      : None,
                        'selected'    : False,
                        'icon'        : None,
                        'extra'       : {'id': 'add-to-default', 'separator': 'actionSeparator', 'class': ''},
                        'submenu'     : None,
                        })

        results += factories_view.default_page_addable_types(include=include)

        if haveMore:
            url = '%s/folder_factories' % (addContext.absolute_url(),)
            results.append({ 'title'       : _p(u'folder_add_more', default=u'More\u2026'),
                             'description' : _p(u'Show all available content types'),
                             'action'      : url,
                             'selected'    : False,
                             'icon'        : None,
                             'extra'       : {'id': 'more', 'separator': None, 'class': ''},
                             'submenu'     : None,
                            })

        constraints = ISelectableConstrainTypes(addContext, None)
        if constraints is not None:
            if constraints.canSetConstrainTypes() and constraints.getDefaultAddableTypes():
                url = '%s/folder_constraintypes_form' % (addContext.absolute_url(),)
                results.append({'title'       : _p(u'folder_add_settings', default=u'Restrictions\u2026'),
                                'description' : _p(u'title_configure_addable_content_types', default=u'Configure which content types can be added here'),
                                'action'      : url,
                                'selected'    : False,
                                'icon'        : None,
                                'extra'       : {'id': 'settings', 'separator': None, 'class': ''},
                                'submenu'     : None,
                                })

        return results
Esempio n. 4
0
    def _getMenuItemsForContext(self, context, request):
        """Return menu item entries for the context only."""
        results = []

        if context is not None:
            allowed = []
            constraints = []
            haveMore = False
            include = None

            allowed = context.allowedContentTypes()
            constraints = IConstrainTypes(context, None)

            if constraints is not None:
                include = constraints.getImmediatelyAddableTypes()
                if len(include) < len(allowed):
                    haveMore = True

            results = self._addable_types(context, request, allowed, include)

            if haveMore:
                url = '%s/folder_factories' % (context.absolute_url(),)
                results.append({ 'title'       : _(u'folder_add_more', default=u'More\u2026'),
                                 'description' : _(u'Show all available content types'),
                                 'action'      : url,
                                 'selected'    : False,
                                 'icon'        : None,
                                 'extra'       : {'id': 'more', 'separator': None, 'class': ''},
                                 'submenu'     : None,
                                 })

            selectableConstraints = ISelectableConstrainTypes(context, None)
            if selectableConstraints is not None:
                if selectableConstraints.canSetConstrainTypes() and \
                   selectableConstraints.getDefaultAddableTypes():
                    url = '%s/folder_constraintypes_form' % (context.absolute_url(),)
                    results.append({'title'       : _(u'folder_add_settings', default=u'Restrictions\u2026'),
                                    'description' : _(u'title_configure_addable_content_types', default=u'Configure which content types can be added here'),
                                    'action'      : url,
                                    'selected'    : False,
                                    'icon'        : None,
                                    'extra'       : {'id': 'settings', 'separator': None, 'class': ''},
                                    'submenu'     : None,
                                    })

        return results
Esempio n. 5
0
    def test_list_constrain(self):
        with self.user('admin'):
            lst = api.content.create(
                id='test',
                type='seantis.people.list',
                container=self.new_temporary_folder()
            )
            constrain = IConstrainTypes(lst)

            new_type = self.new_temporary_type(
                behaviors=[IPerson.__identifier__],
                klass='seantis.people.types.base.PersonBase'
            )

            self.assertIs(type(constrain), ListConstrainTypes)
            self.assertEqual(constrain.getConstrainTypesMode(), ENABLED)
            self.assertEqual(constrain.allowedContentTypes(), [new_type])
            self.assertEqual(constrain.getLocallyAllowedTypes(), [new_type.id])
            self.assertEqual(
                constrain.getImmediatelyAddableTypes(), [new_type.id]
            )
Esempio n. 6
0
    def getMenuItems(self, context, request):
        """Return menu item entries in a TAL-friendly form."""
        factories_view = getMultiAdapter((context, request),
                                         name='folder_factories')

        haveMore = False
        include = None

        addContext = factories_view.add_context()
        allowedTypes = _allowedTypes(request, addContext)

        constraints = IConstrainTypes(addContext, None)
        if constraints is not None:
            include = constraints.getImmediatelyAddableTypes()
            if len(include) < len(allowedTypes):
                haveMore = True

        results = factories_view.addable_types(include=include)

        if haveMore:
            url = '%s/folder_factories' % (addContext.absolute_url(),)
            results.append({
                'title': _(u'folder_add_more', default=u'More\u2026'),
                'description': _(u'Show all available content types'),
                'action': url,
                'selected': False,
                'icon': None,
                'extra': {
                    'id': 'plone-contentmenu-more',
                    'separator': None,
                    'class': ''},
                'submenu': None,
            })

        constraints = ISelectableConstrainTypes(addContext, None)
        if constraints is not None:
            if constraints.canSetConstrainTypes() and \
                    constraints.getDefaultAddableTypes():
                url = '%s/folder_constraintypes_form' % (
                    addContext.absolute_url(),)
                results.append({
                    'title': _(u'folder_add_settings',
                               default=u'Restrictions\u2026'),
                    'description': _(
                        u'title_configure_addable_content_types',
                        default=u'Configure which content types can be '
                                u'added here'),
                    'action': url,
                    'selected': False,
                    'icon': None,
                    'extra': {
                        'id': 'plone-contentmenu-settings',
                        'separator': None,
                        'class': ''},
                    'submenu': None,
                    })

        # Also add a menu item to add items to the default page
        context_state = getMultiAdapter((context, request),
                                        name='plone_context_state')
        if context_state.is_structural_folder() and \
                context_state.is_default_page() and \
                self._contentCanBeAdded(context, request):
            results.append({
                'title': _(u'default_page_folder',
                           default=u'Add item to default page'),
                'description': _(
                    u'desc_default_page_folder',
                    default=u'If the default page is also a folder, '
                            u'add items to it from here.'),
                'action': context.absolute_url() + '/@@folder_factories',
                'selected': False,
                'icon': None,
                'extra': {
                    'id': 'plone-contentmenu-add-to-default-page',
                    'separator': None,
                    'class': 'pat-plone-modal'},
                'submenu': None,
                })

        return results
Esempio n. 7
0
 def get_addable_items(self):
     """
     Return menu item entries in a TAL-friendly form.
     """
     context = self.context
     request = self.request
     factories_view = getMultiAdapter(
         (context, request),
         name='folder_factories',
     )
     include = None
     addContext = factories_view.add_context()
     constraints = IConstrainTypes(addContext, None)
     if constraints is not None:
         include = constraints.getImmediatelyAddableTypes()
     results = factories_view.addable_types(include=include)
     results_with_icons = []
     for result in results:
         result['icon'] = 'menu-item-icon {0}'.format(self.icon('plus'))
         results_with_icons.append(result)
     results = results_with_icons
     constraints = ISelectableConstrainTypes(addContext, None)
     if constraints is not None:
         if constraints.canSetConstrainTypes() and \
                 constraints.getDefaultAddableTypes():
             url = '{0}/folder_constraintypes_form'.format(
                 addContext.absolute_url(),
             )
             results.append({
                 'title': _(u'folder_add_settings',
                            default=u'Restrictions'),
                 'description': _(
                     u'title_configure_addable_content_types',
                     default=u'Configure which content types can be '
                             u'added here',
                 ),
                 'action': url,
                 'selected': False,
                 'icon': 'menu-item-icon {0}'.format(self.icon('cog')),
                 'id': 'settings',
                 'extra': {
                     'id': 'plone-contentmenu-settings',
                     'separator': None,
                     'class': '',
                 },
                 'submenu': None,
             })
     # Also add a menu item to add items to the default page
     context_state = getMultiAdapter(
         (context, request),
         name='plone_context_state',
     )
     if context_state.is_structural_folder() and \
             context_state.is_default_page() and \
             self._contentCanBeAdded(context, request):
         results.append({
             'title': _(u'default_page_folder',
                        default=u'Add item to default page'),
             'description': _(
                 u'desc_default_page_folder',
                 default=u'If the default page is also a folder, '
                         u'add items to it from here.',
             ),
             'action': context.absolute_url() + '/@@folder_factories',
             'selected': False,
             'icon': 'menu-item-icon {0}'.format(self.icon('cog')),
             'id': 'special',
             'extra': {
                 'id': 'plone-contentmenu-add-to-default-page',
                 'separator': None,
                 'class': 'pat-plone-modal',
             },
             'submenu': None,
         })
     return results
Esempio n. 8
0
    def getMenuItems(self, context, request):
        """Return menu item entries in a TAL-friendly form."""
        results = BaseFactoriesMenu.getMenuItems(self, context, request)

        factories_view = getMultiAdapter((context, request),
                                         name='folder_factories')

        haveMore = False
        include = None

        addContext = factories_view.default_page_add_context()
        if not addContext:
            return results
        allowedTypes = _allowedTypes(request, addContext)

        constraints = IConstrainTypes(addContext, None)
        if constraints is not None:
            include = constraints.getImmediatelyAddableTypes()
            if len(include) < len(allowedTypes):
                haveMore = True

        results.append({
            'title':
            _p(u'folder_add_to_default_page', default=u'Add to default page'),
            'description':
            _p(u'Add content to the default page'),
            'action':
            None,
            'selected':
            False,
            'icon':
            None,
            'extra': {
                'id': 'add-to-default',
                'separator': 'actionSeparator',
                'class': ''
            },
            'submenu':
            None,
        })

        results += factories_view.default_page_addable_types(include=include)

        if haveMore:
            url = '%s/folder_factories' % (addContext.absolute_url(), )
            results.append({
                'title':
                _p(u'folder_add_more', default=u'More\u2026'),
                'description':
                _p(u'Show all available content types'),
                'action':
                url,
                'selected':
                False,
                'icon':
                None,
                'extra': {
                    'id': 'more',
                    'separator': None,
                    'class': ''
                },
                'submenu':
                None,
            })

        constraints = ISelectableConstrainTypes(addContext, None)
        if constraints is not None:
            if constraints.canSetConstrainTypes(
            ) and constraints.getDefaultAddableTypes():
                url = '%s/folder_constraintypes_form' % (
                    addContext.absolute_url(), )
                results.append({
                    'title':
                    _p(u'folder_add_settings', default=u'Restrictions\u2026'),
                    'description':
                    _p(u'title_configure_addable_content_types',
                       default=
                       u'Configure which content types can be added here'),
                    'action':
                    url,
                    'selected':
                    False,
                    'icon':
                    None,
                    'extra': {
                        'id': 'settings',
                        'separator': None,
                        'class': ''
                    },
                    'submenu':
                    None,
                })

        return results
Esempio n. 9
0
    def getMenuItems(self, context, request):
        """Return menu item entries in a TAL-friendly form."""
        factories_view = getMultiAdapter((context, request),
                                         name='folder_factories')

        haveMore = False
        include = None

        addContext = factories_view.add_context()
        allowedTypes = _allowedTypes(request, addContext)

        constraints = IConstrainTypes(addContext, None)
        if constraints is not None:
            include = constraints.getImmediatelyAddableTypes()
            if len(include) < len(allowedTypes):
                haveMore = True

        results = factories_view.addable_types(include=include)

        if haveMore:
            url = '%s/folder_factories' % (addContext.absolute_url(), )
            results.append({
                'title':
                _(u'folder_add_more', default=u'More\u2026'),
                'description':
                _(u'Show all available content types'),
                'action':
                url,
                'selected':
                False,
                'icon':
                None,
                'extra': {
                    'id': 'plone-contentmenu-more',
                    'separator': None,
                    'class': ''
                },
                'submenu':
                None,
            })

        constraints = ISelectableConstrainTypes(addContext, None)
        if constraints is not None:
            if constraints.canSetConstrainTypes() and \
                    constraints.getDefaultAddableTypes():
                url = '%s/folder_constraintypes_form' % (
                    addContext.absolute_url(), )
                results.append({
                    'title':
                    _(u'folder_add_settings', default=u'Restrictions\u2026'),
                    'description':
                    _(u'title_configure_addable_content_types',
                      default=u'Configure which content types can be '
                      u'added here'),
                    'action':
                    url,
                    'selected':
                    False,
                    'icon':
                    None,
                    'extra': {
                        'id': 'plone-contentmenu-settings',
                        'separator': None,
                        'class': ''
                    },
                    'submenu':
                    None,
                })

        # Also add a menu item to add items to the default page
        context_state = getMultiAdapter((context, request),
                                        name='plone_context_state')
        if context_state.is_structural_folder() and \
                context_state.is_default_page() and \
                self._contentCanBeAdded(context, request):
            results.append({
                'title':
                _(u'default_page_folder', default=u'Add item to default page'),
                'description':
                _(u'desc_default_page_folder',
                  default=u'If the default page is also a folder, '
                  u'add items to it from here.'),
                'action':
                context.absolute_url() + '/@@folder_factories',
                'selected':
                False,
                'icon':
                None,
                'extra': {
                    'id': 'plone-contentmenu-add-to-default-page',
                    'separator': None,
                    'class': 'pat-plone-modal'
                },
                'submenu':
                None,
            })

        return results
Esempio n. 10
0
 def get_constraintypes_config(self, obj):
     ctypes = IConstrainTypes(obj)
     return {'mode': ctypes.getConstrainTypesMode(),
             'locally allowed': set(ctypes.getLocallyAllowedTypes()),
             'immediately addable': set(
                 ctypes.getImmediatelyAddableTypes())}