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())
def get_constraintypes_config(self, obj): ctypes = IConstrainTypes(obj) return { 'mode': ctypes.getConstrainTypesMode(), 'locally allowed': set(ctypes.getLocallyAllowedTypes()), 'immediately addable': set(ctypes.getImmediatelyAddableTypes()) }
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
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
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] )
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
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
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
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
def get_constraintypes_config(self, obj): ctypes = IConstrainTypes(obj) return {'mode': ctypes.getConstrainTypesMode(), 'locally allowed': set(ctypes.getLocallyAllowedTypes()), 'immediately addable': set( ctypes.getImmediatelyAddableTypes())}