def _add_portlets(obj, events_topic, news_topic, lang): log.info('_add_portlets for language %s' % lang) path = "/".join(obj.getPhysicalPath()) oshabelow = assignment_mapping_from_key(obj, 'osha.belowcontent.portlets', CONTEXT_CATEGORY, path) events_topic_path = "/".join(events_topic.getPhysicalPath()) news_topic_path = "/".join(news_topic.getPhysicalPath()) translate = getTranslationService().translate news_trans = translate(target_language=lang, msgid=u'News', default=u'News', context=obj, domain='plone') oshabelow[u'news-collection'] = collection.Assignment( header=news_trans, target_collection=news_topic_path, limit=5, ) events_trans = translate(target_language=lang, msgid=u'Events', default=u'Events', context=obj, domain='plone') oshabelow[u'events-collection'] = collection.Assignment( header=events_trans, target_collection=events_topic_path, limit=5, ) rightcolumn_manager = component.getUtility(IPortletManager, name=u'plone.rightcolumn', context=obj) rightcolumn = component.getMultiAdapter((obj, rightcolumn_manager), IPortletAssignmentMapping, context=obj) rightcolumn[u'activities'] = osha_portlets.image.Assignment( header=u"Agency's Activities", image="/en/press/photos/banners/hw_08_banner/hwp_%s.swf" % lang, url="/%s/campaigns/hw2008/" % lang, width="167", height="74", ) rightcolumn[u'links'] = osha_portlets.network_member_links.Assignment()
def testSimpleQuery(self): # set up our collection to search for Folders self.folder.collection.query = [{ 'i': 'portal_type', 'o': 'plone.app.querystring.operation.string.is', 'v': 'Folder', }] # add a few folders for i in range(6): self.folder.invokeFactory('Folder', 'folder_%s' % i) getattr(self.folder, 'folder_%s' % i).reindexObject() # the folders are returned by the topic collection_num_items = len(self.folder.collection.results()) # We better have some folders self.assertTrue(collection_num_items >= 6) mapping = PortletAssignmentMapping() mapping['foo'] = collection.Assignment( header=u"title", uid=self.folder.collection.UID(), exclude_context=False, ) collectionrenderer = self.renderer(context=None, request=None, view=None, manager=None, assignment=mapping['foo']) # we want the portlet to return us the same results as the collection self.assertEqual(collection_num_items, len(collectionrenderer.results()))
def test_render(self): r = self.renderer(context=self.portal, assignment=collection.Assignment(header=u"title")) r = r.__of__(self.folder) r.update() output = r.render() self.assertTrue('title' in output)
def test_collection_path_unicode(self): self.portal.invokeFactory('Collection', 'events') # Cover problem in #9184 renderer = self.renderer(context=self.portal, assignment=collection.Assignment( header=u"title", target_collection=u"/events")) renderer = renderer.__of__(self.folder) self.assertEqual(renderer.collection().id, 'events')
def testRenderer(self): context = self.folder request = self.folder.REQUEST view = self.folder.restrictedTraverse('@@plone') manager = getUtility(IPortletManager, name='plone.rightcolumn', context=self.portal) assignment = collection.Assignment(header=u"title") renderer = getMultiAdapter( (context, request, view, manager, assignment), IPortletRenderer) self.assertTrue(isinstance(renderer, collection.Renderer))
def renderer(self, context=None, request=None, view=None, manager=None, assignment=None): context = context or self.folder request = request or self.folder.REQUEST view = view or self.folder.restrictedTraverse('@@plone') manager = manager or getUtility( IPortletManager, name='plone.rightcolumn', context=self.portal) assignment = assignment or collection.Assignment(header=u"title") return getMultiAdapter((context, request, view, manager, assignment), IPortletRenderer)
def testPortletAvailabilityWithPrivateFolders(self): private_folder = self._createType(self.folder, 'Folder', 'private') public_subfolder = self._createType(private_folder, 'Folder', 'public') self.portal.portal_workflow.doActionFor(public_subfolder, 'publish') self.collection = self._createType(public_subfolder, 'Collection', 'collection') self.portal.portal_workflow.doActionFor(self.collection, 'publish') mapping = PortletAssignmentMapping() mapping['foo'] = collection.Assignment( header=u"title", uid=self.portal.folder.private.public.collection.UID()) logout() collectionrenderer = self.renderer(context=None, request=None, view=None, manager=None, assignment=mapping['foo']) self.assertEqual(self.collection, collectionrenderer.collection())
def get_assignments_for_sitehome_collectionportlets(portal, views, logger): assignments = [] from plone.portlet.collection import collection for item in default_sitehome_smartviews: try: objsmartview = getattr(views, item["id"]) target_coll = "/".join(objsmartview.getPhysicalPath()) assignments.append( collection.Assignment(header=item["displaytitle"], target_collection=target_coll, limit=item["limit"], show_more=True, show_dates=False)) except: logger.info( "Unable to assign collection portlet for smartview : %s" % (item["id"], )) return assignments
def testInvokeEditView(self): mapping = PortletAssignmentMapping() request = self.folder.REQUEST mapping['foo'] = collection.Assignment(header=u"title") editview = getMultiAdapter((mapping['foo'], request), name='edit') self.assertTrue(isinstance(editview, collection.EditForm))
def testInterfaces(self): portlet = collection.Assignment(header=u"title") self.assertTrue(IPortletAssignment.providedBy(portlet)) self.assertTrue(IPortletDataProvider.providedBy(portlet.data))
def test_exclude_context(self): """ The exclude context field controls including self in the results. """ for idx in range(4): self._createType(self.folder, 'News Item', 'foo-news-item-title-{0}'.format(idx)) self.folder.collection.query = [{ 'i': 'portal_type', 'o': 'plone.app.querystring.operation.string.is', 'v': 'News Item' }] self.folder.collection.sort_on = 'id' context = self.folder['foo-news-item-title-1'] included = [ self.folder['foo-news-item-title-{0}'.format(idx)].absolute_url() for idx in (0, 2) ] limited = self.folder['foo-news-item-title-3'].absolute_url() assignment = collection.Assignment(header=u"title", uid=self.folder.collection.UID(), limit=2) folder_renderer = self.renderer(context=self.folder, assignment=assignment) folder_results = [ brain.getURL() for brain in folder_renderer.results() ] self.assertEqual(len(folder_results), 2, 'Wrong number of folder rendered results') self.assertIn(included[0], folder_results, 'Folder rendered results missing item') self.assertIn(context.absolute_url(), folder_results, 'Folder rendered results missing context item') self.assertNotIn(included[1], folder_results, 'Folder rendered results included too many items') self.assertNotIn( limited, folder_results, 'Folder rendered results included way too many items') renderer = self.renderer(context=context, assignment=assignment) results = [brain.getURL() for brain in renderer.results()] self.assertEqual(len(results), 2, 'Wrong number of context rendered results') self.assertIn(included[0], results, 'Context rendered results missing item') self.assertIn(included[1], results, 'Context rendered results missing item') self.assertNotIn(context.absolute_url(), results, 'Context rendered results included context') self.assertNotIn(limited, results, 'Context rendered results included too many items') assignment.exclude_context = False context_renderer = self.renderer(context=context, assignment=assignment) context_results = [ brain.getURL() for brain in context_renderer.results() ] self.assertEqual(len(context_results), 2, 'Wrong number of context rendered results') self.assertIn(included[0], context_results, 'Context rendered results missing item') self.assertIn(context.absolute_url(), context_results, 'Context rendered results missing context') self.assertNotIn(included[1], context_results, 'Context rendered results included too many items') self.assertNotIn( limited, context_results, 'Context rendered results included way too many items') del assignment.exclude_context missing_renderer = self.renderer(context=context, assignment=assignment) missing_results = [ brain.getURL() for brain in missing_renderer.results() ] self.assertEqual(len(missing_results), 2, 'Wrong number of context rendered results') self.assertIn(included[0], missing_results, 'Context rendered results missing item') self.assertIn(context.absolute_url(), missing_results, 'Context rendered results missing context') self.assertNotIn(included[1], missing_results, 'Context rendered results included too many items') self.assertNotIn( limited, missing_results, 'Context rendered results included way too many items') assignment.limit = 4 assignment.random = True assignment.exclude_context = True random_renderer = self.renderer(context=context, assignment=assignment) random_results = [ brain.getURL() for brain in random_renderer.results() ] self.assertEqual(len(random_results), 3, 'Wrong number of random rendered results') self.assertIn(included[0], random_results, 'Context rendered results missing item') self.assertIn(included[1], random_results, 'Context rendered results missing item') self.assertIn(limited, random_results, 'Context rendered results missing item') self.assertNotIn(context.absolute_url(), random_results, 'Context rendered results included context')
def testRandomQuery(self): # set up our portlet renderer mapping = PortletAssignmentMapping() mapping['foo'] = collection.Assignment( header=u"title", random=True, uid=self.folder.collection.UID()) # add some folders for i in range(6): self.folder.invokeFactory('Folder', 'folder_%s' % i) getattr(self.folder, 'folder_%s' % i).reindexObject() # collection with no criteria -- should return empty list collectionrenderer = self.renderer(context=None, request=None, view=None, manager=None, assignment=mapping['foo']) self.assertEqual(len(collectionrenderer.results()), 0) # collection with simple criterion -- should return 1 (random) folder self.folder.collection.query = [{ 'i': 'portal_type', 'o': 'plone.app.querystring.operation.string.is', 'v': 'Folder', }] collectionrenderer = self.renderer(context=None, request=None, view=None, manager=None, assignment=mapping['foo']) self.assertEqual(len(collectionrenderer.results()), 1) # collection with multiple criteria -- should behave similarly self.folder.collection.query = [ { 'i': 'portal_type', 'o': 'plone.app.querystring.operation.string.is', 'v': 'Folder', }, { 'i': 'creator', 'o': 'plone.app.querystring.operation.string.is', 'v': 'test_user_1_', }, ] collectionrenderer = self.renderer(context=None, request=None, view=None, manager=None, assignment=mapping['foo']) collectionrenderer.results() # collection with sorting -- should behave similarly (sort is ignored # internally) self.folder.collection.sort_on = 'modified' collectionrenderer = self.renderer(context=None, request=None, view=None, manager=None, assignment=mapping['foo']) self.assertEqual(len(collectionrenderer.results()), 1) # same criteria, now with limit set to 2 -- should return 2 (random) # folders collectionrenderer = self.renderer(context=None, request=None, view=None, manager=None, assignment=mapping['foo']) collectionrenderer.data.limit = 2 self.assertEqual(len(collectionrenderer.results()), 2) # make sure there's no error if the limit is greater than the # of # results found collectionrenderer = self.renderer(context=None, request=None, view=None, manager=None, assignment=mapping['foo']) collectionrenderer.data.limit = 10 self.assertTrue(len(collectionrenderer.results()) >= 6)
def test_css_class(self): r = self.renderer( context=self.portal, assignment=collection.Assignment(header=u"Welcome text")) self.assertEqual('portlet-collection-welcome-text', r.css_class())
def setUpPloneSite(self, portal): if IS_PLONE_5: applyProfile(portal, 'plone.app.contenttypes:default') setRoles(portal, TEST_USER_ID, ['Manager']) login(portal, TEST_USER_NAME) self.folder = portal.get( portal.invokeFactory('Folder', 'testing_example_data')) # add some default plone types testdoc1id = self.folder.invokeFactory('Document', 'test-doc-1') self['testdoc1'] = getattr(self.folder, testdoc1id, None) folder1id = self.folder.invokeFactory('Folder', 'test-folder-1') self['folder1'] = getattr(self.folder, folder1id, None) self['newfolder'] = getattr( self['folder1'], self['folder1'].invokeFactory('Folder', 'newfolder')) folderid2 = self.folder.invokeFactory('Folder', 'test-folder-2') self['folder2'] = getattr(self.folder, folderid2, None) testdoc2id = self['folder1'].invokeFactory('Document', 'test-doc-2') self['testdoc2'] = getattr(self['folder1'], testdoc2id, None) # create a topic if not IS_PLONE_5: topicid = self.folder.manage_addProduct[ 'ATContentTypes'].addATTopic(id='atopic', title='A topic') self.topic = getattr(self.folder, topicid, None) # set some custom properties self['testdoc1'].manage_addProperty(id='bool', value=True, type='boolean') self['testdoc1'].manage_addProperty(id='date', value='2000/01/01', type='date') self['testdoc1'].manage_addProperty(id='float', value=2.1, type='float') self['testdoc1'].manage_addProperty(id='int', value=2, type='int') self['testdoc1'].manage_addProperty(id='lines', value=('row1', 'row2'), type='lines') self['testdoc1'].manage_addProperty(id='string', value='Hello World!', type='string') # put some custom portlets on folder1 - prepare to get # portlets from folder 2 self['left_column'] = getUtility(IPortletManager, name=u'plone.leftcolumn', context=self['folder1']) self['left_column2'] = getUtility(IPortletManager, name=u'plone.leftcolumn', context=self['folder2']) self['right_column'] = getUtility(IPortletManager, name=u'plone.rightcolumn', context=self['folder1']) self['right_column2'] = getUtility(IPortletManager, name=u'plone.rightcolumn', context=self['folder2']) self['left_portlets'] = getMultiAdapter(( self['folder1'], self['left_column'], ), IPortletAssignmentMapping, context=self['folder1']) self['right_portlets'] = getMultiAdapter(( self['folder1'], self['right_column'], ), IPortletAssignmentMapping, context=self['folder1']) # static-text-portlets on right and left column self['left_portlets']['title1'] = static.Assignment(header='Title1', text="some text", omit_border=False) self['right_portlets']['title2'] = static.Assignment(header='Title2', text="some text", omit_border=False) self['right_portlets']['blubb'] = static.Assignment(header='blubb', text="some text", omit_border=False) self['right_portlets']['news'] = portlets.news.Assignment() self['right_portlets']['search'] = portlets.search.Assignment() # collection portlet on the right if not IS_PLONE_5: self['right_portlets']['collection'] = collection.Assignment( header="My collection", target_collection='/'.join(self.topic.getPhysicalPath()), limit="5", random=False, show_more=False, show_dates=True, ) if IS_PLONE_5: root = 'root_uid' else: root = 'root' custom_navi_portlet = { 'name': 'custom Navigation', root: '/'.join(self.folder.getPhysicalPath()) } # custom Navigation portlet on the left side self['left_portlets']['custom_navigation'] = navigation.Assignment( **custom_navi_portlet) # set dummy interfaces alsoProvides(self['testdoc1'], IDummyIface) alsoProvides(self['testdoc1'], IDummyIface2) alsoProvides(self['folder2'], IDummyIface2) alsoProvides(self['folder2'], IDummyIface3)