def test_create_faceted_folder_with_id(self): faceted = utils.create_faceted_folder(self.portal, "Test Faceted", id="test-faceted") self.assertEqual("Test Faceted", faceted.title) self.assertEqual("test-faceted", faceted.id) IFacetedNavigable.providedBy(faceted)
def _get_generation_context(self, helper_view, pod_template): """Include brains/uids if we are on a dashboard.""" if not IFacetedNavigable.providedBy(self.context): return super(DashboardDocumentGenerationView, self)._get_generation_context(helper_view, pod_template) generation_context = {'brains': [], 'uids': []} brains = getDashboardQueryResult(self.context) or [] max_objects = getattr(pod_template, 'max_objects', None) if max_objects: brains = brains[:max_objects] generation_context['brains'] = brains if getattr(pod_template, 'use_objects', False): wrapped_objects = [] brain_and_objects = [] for brain in brains: generation_context['uids'].append(brain.UID) obj = brain.getObject() helper = obj.unrestrictedTraverse( '@@document_generation_helper_view') wrapped_objects.append((helper.context, helper)) brain_and_objects.append((brain, helper.context, helper)) generation_context['objects'] = wrapped_objects generation_context['all'] = brain_and_objects else: generation_context['uids'] = [brain.UID for brain in brains] generation_context.update( super(DashboardDocumentGenerationView, self)._get_generation_context(helper_view, pod_template)) return generation_context
def _get_generation_context(self, helper_view, pod_template): result = super(IDocumentGenerationView, self)._get_generation_context(helper_view, pod_template) # if pod_template.portal_type == 'ConfigurablePODTemplate': if IFacetedNavigable.providedBy(self.context): brains = getDashboardQueryResult(self.context) result['brains'] = brains if len(brains) > 0 and brains[0].portal_type == 'Event': expandevents = expand_events(brains, 2) events = [] for event in expandevents: if IOccurrence.providedBy(event): start = event.start end = event.end parent = zope.copy.copy(event.aq_parent.aq_base) parent.start = start parent.end = end req = event.REQUEST parent.REQUEST = req parent.occurrence = True parent.base_event = event.aq_parent events.append(parent) else: events.append(event) result['brains'] = events return result
def _get_generation_context(self, helper_view, pod_template): result = super(IDocumentGenerationView, self)._get_generation_context( helper_view, pod_template) # if pod_template.portal_type == 'ConfigurablePODTemplate': if IFacetedNavigable.providedBy(self.context): brains = getDashboardQueryResult(self.context) result['brains'] = brains if len(brains) > 0 and brains[0].portal_type == 'Event': expandevents = expand_events(brains, 2) events = [] for event in expandevents: if IOccurrence.providedBy(event): start = event.start end = event.end parent = zope.copy.copy(event.aq_parent.aq_base) parent.start = start parent.end = end req = event.REQUEST parent.REQUEST = req parent.occurrence = True parent.base_event = event.aq_parent events.append(parent) else: events.append(event) result['brains'] = events return result
def _criteriaHolder(self): '''Override to not consider IMeeting as a criteria holder.''' parent = self.context # look up parents until we found the criteria holder or we reach the 'Plone Site' while parent and not parent.portal_type == 'Plone Site': if IFacetedNavigable.providedBy( parent) and not IMeeting.providedBy(parent): return parent parent = parent.aq_inner.aq_parent
def test_PODTemplateViewlet(self): """Test the IDDocumentGeneratorLinksViewlet that list available PODTemplates.""" # by default, viewlet is not displayed as no template to display viewlet = DocumentGeneratorLinksViewlet(self.folder2, self.request, None, None) viewlet.update() self.assertFalse(viewlet.available()) self.assertFalse(viewlet.get_generable_templates()) # add a DashboardPODTemplate, still not available api.content.create(id='dashtemplate', type='DashboardPODTemplate', title='Dashboard template', container=self.portal) # need to clean memoize because available() calls # get_generable_templates that use it del IAnnotations(self.request)['plone.memoize'] self.assertFalse(viewlet.available()) self.assertFalse(viewlet.get_generable_templates()) # add a PODTemplate, this time it is available template = api.content.create(id='template', type='PODTemplate', title='POD template', container=self.portal) # clean memoize del IAnnotations(self.request)['plone.memoize'] self.assertTrue(viewlet.available()) self.assertEquals(len(viewlet.get_generable_templates()), 1) self.assertEquals(viewlet.get_generable_templates()[0].UID(), template.UID()) # this viewlet will not be displayed if current context is a faceted self.assertFalse(IFacetedNavigable.providedBy(self.folder2)) self.assertTrue(IFacetedNavigable.providedBy(self.folder)) viewlet = DocumentGeneratorLinksViewlet(self.folder, self.request, None, None) viewlet.update() del IAnnotations(self.request)['plone.memoize'] self.assertTrue(viewlet.available()) # no matter there are pod templates self.assertTrue(viewlet.get_generable_templates())
def test_enableFacetedDashboardFor(self): """This method will enable the faceted navigation for a given folder.""" # faceted can be enabled using the default widgets catalog = self.portal.portal_catalog folder2_id = self.portal.invokeFactory('Folder', 'folder2', title='Folder2') folder2 = getattr(self.portal, folder2_id) folder2.reindexObject() folder2UID = folder2.UID() # not enabled for now self.assertFalse(IFacetedNavigable.providedBy(folder2)) self.assertTrue(catalog(UID=folder2UID)) self.assertFalse(catalog(UID=folder2UID, object_provides=IFacetedNavigable.__identifier__)) enableFacetedDashboardFor(folder2) # several things are done : # faceted is enabled self.assertTrue(IFacetedNavigable.providedBy(folder2)) # used faceted layout is 'faceted-table-items' self.assertEquals(IFacetedLayout(folder2).layout, 'faceted-table-items') # left portlets are shown self.assertFalse(IHidePloneLeftColumn.providedBy(folder2)) # folder2 was reindexed, especially provided interfaces self.assertTrue(catalog(UID=folder2UID, object_provides=IFacetedNavigable.__identifier__)) # redirect is swallowed, indeed enabling faceted on a folder redirects to it self.assertEquals(self.portal.REQUEST.RESPONSE.status, 200) # a xmlpath parameter can be passed to use a specific widgets xml file # calling this on an already enabled faceted will do nothing xmlpath = os.path.dirname(__file__) + '/faceted_conf/testing_widgets.xml' enableFacetedDashboardFor(folder2, xmlpath=xmlpath) # only one 'c44' widget in testing_widgets.xml, not added here self.assertFalse(ICriteria(folder2).get('c44')) # create a new folder and apply faceted with xmlpath to it folder3_id = self.portal.invokeFactory('Folder', 'folder3', title='Folder3') folder3 = getattr(self.portal, folder3_id) folder3.reindexObject() # an Exception is raised if xmlpath does not exist wrong_xmlpath = os.path.dirname(__file__) + '/faceted_conf/wrong_testing_widgets.xml' self.assertRaises(Exception, enableFacetedDashboardFor, folder3, wrong_xmlpath) # apply correct xmlpath enableFacetedDashboardFor(folder3, xmlpath=xmlpath) # same things are done except that the widgets are taken from the given xmlpath self.assertEquals(len(ICriteria(folder3).criteria), 1) self.assertTrue(ICriteria(folder3).get('c44'))
def activate_faceted_tasks_listing(task_container, event): """ Set the listing tasks faceted view on the faceted tasks container. """ if hasattr(aq_base(task_container), 'checkCreationFlag'): if task_container.checkCreationFlag(): return if IFacetedNavigable.providedBy(task_container): return elif IPossibleFacetedNavigable.providedBy(task_container): subtyper = task_container.unrestrictedTraverse('@@faceted_subtyper') subtyper.enable() IFacetedLayout(task_container).update_layout('list_tasks') task_container.manage_delProperties(['layout'])
def migrate(self, old, new): new_path = "/".join(new.getPhysicalPath()) for iface in interfaces: if iface.providedBy(old): alsoProvides(new, iface) logger.warn("{0} also provides {1}".format(new_path, str(iface))) if old.getConstrainTypesMode() != 0: behaviour = ISelectableConstrainTypes(new) behaviour.setConstrainTypesMode(1) if old.getConstrainTypesMode() == 1: behaviour.setLocallyAllowedTypes(old.getLocallyAllowedTypes()) behaviour.setImmediatelyAddableTypes(old.getImmediatelyAddableTypes()) if IFacetedNavigable.providedBy(old): criteria = Criteria(new) criteria._update(ICriteria(old).criteria) IFacetedLayout(new).update_layout('faceted-table-items') logger.warn("Added faceted criteria and layout to {0}".format(new_path))
def get_facted_criteria(self): from eea.facetednavigation.criteria.handler import Criteria from eea.facetednavigation.criteria.interfaces import ICriteria from eea.facetednavigation.indexes.language.interfaces import ILanguageWidgetAdapter # noqa from eea.facetednavigation.interfaces import IFacetedNavigable from eea.facetednavigation.settings.interfaces import IDisableSmartFacets # noqa from eea.facetednavigation.settings.interfaces import IHidePloneLeftColumn # noqa from eea.facetednavigation.settings.interfaces import IHidePloneRightColumn # noqa from eea.facetednavigation.subtypes.interfaces import IFacetedWrapper from eea.facetednavigation.views.interfaces import IViewsInfo from eea.facetednavigation.widgets.alphabetic.interfaces import IAlphabeticWidget # noqa from eea.facetednavigation.widgets.interfaces import ICriterion from eea.facetednavigation.widgets.interfaces import IWidget from eea.facetednavigation.widgets.interfaces import IWidgetsInfo from eea.facetednavigation.widgets.resultsfilter.interfaces import IResultsFilterWidget # noqa interfaces = [ IFacetedNavigable, IDisableSmartFacets, IHidePloneLeftColumn, IHidePloneRightColumn, ICriteria, ILanguageWidgetAdapter, IFacetedWrapper, IViewsInfo, IAlphabeticWidget, ICriterion, IWidget, IWidgetsInfo, IResultsFilterWidget, ] inter = [] for interface in interfaces: if interface.providedBy(self.context): inter.append(interface.__identifier__) self['faceted_interfaces'] = inter if IFacetedNavigable.providedBy(self.context): criteria = Criteria(self.context) criterias = [] for crit in criteria.criteria: criterias.append(crit.__dict__) self['faceted_criteria'] = criterias
def get_facted_criteria(self): from eea.facetednavigation.criteria.handler import Criteria from eea.facetednavigation.criteria.interfaces import ICriteria from eea.facetednavigation.indexes.language.interfaces import ILanguageWidgetAdapter # noqa from eea.facetednavigation.interfaces import IFacetedNavigable from eea.facetednavigation.settings.interfaces import IDisableSmartFacets # noqa from eea.facetednavigation.settings.interfaces import IHidePloneLeftColumn # noqa from eea.facetednavigation.settings.interfaces import IHidePloneRightColumn # noqa from eea.facetednavigation.subtypes.interfaces import IFacetedWrapper from eea.facetednavigation.views.interfaces import IViewsInfo from eea.facetednavigation.widgets.alphabetic.interfaces import IAlphabeticWidget # noqa from eea.facetednavigation.widgets.interfaces import ICriterion from eea.facetednavigation.widgets.interfaces import IWidget from eea.facetednavigation.widgets.interfaces import IWidgetsInfo from eea.facetednavigation.widgets.resultsfilter.interfaces import IResultsFilterWidget # noqa interfaces = [ IFacetedNavigable, IDisableSmartFacets, IHidePloneLeftColumn, IHidePloneRightColumn, ICriteria, ILanguageWidgetAdapter, IFacetedWrapper, IViewsInfo, IAlphabeticWidget, ICriterion, IWidget, IWidgetsInfo, IResultsFilterWidget, ] inter = [] for interface in interfaces: if interface.providedBy(self.context): inter.append(interface.__identifier__) self['faceted_interfaces'] = inter if IFacetedNavigable.providedBy(self.context): criteria = Criteria(self.context) criterias = [] for crit in criteria.criteria: criterias.append(crit.__dict__) self['faceted_criteria'] = criterias
def get_criteria_holder(context): pst = getProjectSpace(context) if IProjectSpace.providedBy(context): return pst.strategicobjectives elif context.portal_type == 'strategicobjective': return pst.operationalobjectives elif context.portal_type == 'operationalobjective': return pst.pstactions elif context.portal_type == 'pstaction': if context.listFolderContents({'portal_type': 'pstsubaction'}): context.REQUEST.set('has_subaction', True) return pst.pstactions else: context.REQUEST.set('has_subaction', False) return pst.tasks elif context.portal_type == 'pstsubaction': return pst.tasks elif not IFacetedNavigable.providedBy(context): return pst return context
def is_faceted(self): """ Is faceted navigable? """ return IFacetedNavigable.providedBy(self.context)
def available(self): """ Is this menu available? """ return (IFacetedNavigable.providedBy(self.context) and checkPermission('eea.faceted.configure', self.context))
def test_DashboardPODTemplateViewlet(self): """Test the IDDashboardDocumentGeneratorLinksViewlet that list available DashboardPODTemplates.""" # by default, viewlet is not displayed as no template to display # but it needs a faceted enabled folder and to be able to getCurrentCollection self.assertTrue(IFacetedNavigable.providedBy(self.folder)) dashboardcoll = api.content.create(id='dc1', type='DashboardCollection', title='Dashboard collection 1', container=self.folder) self.request.form['c1[]'] = dashboardcoll.UID() self.assertEquals(getCurrentCollection(self.folder), dashboardcoll) viewlet = DashboardDocumentGeneratorLinksViewlet( self.folder, self.request, None, None) viewlet.update() self.assertFalse(viewlet.available()) self.assertFalse(viewlet.get_generable_templates()) # add a PODTemplate, still not available api.content.create(id='template', type='PODTemplate', title='POD template', container=self.portal) # need to clean memoize because available() calls # get_generable_templates that use it del IAnnotations(self.request)['plone.memoize'] self.assertFalse(viewlet.available()) self.assertFalse(viewlet.get_generable_templates()) # add a DashboardPODTemplate, this time it is available dashtemplate = api.content.create(id='dashtemplate', type='DashboardPODTemplate', title='Dashboard template', container=self.portal) # clean memoize del IAnnotations(self.request)['plone.memoize'] self.assertTrue(viewlet.available()) self.assertEquals(len(viewlet.get_generable_templates()), 1) self.assertEquals(viewlet.get_generable_templates()[0].UID(), dashtemplate.UID()) # this viewlet will not be displayed if current context is not a faceted self.assertFalse(IFacetedNavigable.providedBy(self.folder2)) self.assertTrue(IFacetedNavigable.providedBy(self.folder)) # not faceted context viewlet = self._get_viewlet( context=self.folder2, manager_name='collective.eeafaceted.z3ctable.topabovenav', viewlet_name='dashboard-document-generation-link') self.assertIsNone(viewlet) # collection criterion not found viewlet = self._get_viewlet( context=self.folder, manager_name='collective.eeafaceted.z3ctable.topabovenav', viewlet_name='dashboard-document-generation-link') self.assertIsNotNone(viewlet) del IAnnotations(self.request)['plone.memoize'] self.assertTrue(viewlet.available()) criteria = ICriteria(self.folder).criteria index = [ i for i, crit in enumerate(criteria) if crit.widget == u'collection-link' ][0] del criteria[index] # we remove collectionwidget criterion self.assertFalse(viewlet.available()) # no matter there are pod templates self.assertTrue(viewlet.get_generable_templates())
def is_faceted(self): """ Is faceted navigable? """ return IFacetedNavigable.providedBy(self.context)
def _getParents(self, obj): ret = [] while IFacetedNavigable.providedBy(obj.aq_inner.aq_parent): obj = obj.aq_inner.aq_parent ret.append(obj.UID()) return ','.join(reversed(ret))
def available(self): """ Is this menu available? """ return (IFacetedNavigable.providedBy(self.context) and checkPermission('eea.faceted.configure', self.context))