def test_respect_navigation_root(self): portal = self.layer["portal"] login(portal, "admin") # Create two subsites i.e create two folders and mark them with # INavigationRoot for i in xrange(1, 3): folder_id = "folder{}".format(i) portal.invokeFactory("Folder", folder_id, title="Folder{}".format(i)) folder = portal[folder_id] alsoProvides(folder, INavigationRoot) folders = (portal["folder1"], portal["folder2"]) # Add a content item to each folder for f in folders: f_id = f.getId() f.invokeFactory("Document", "item_in_{}".format(f_id), title="Item In {}".format(f_id)) # Add a collection to folder1 folder1 = folders[0] folder1.invokeFactory("Collection", "collection1", title="Collection 1") collection1 = folder1["collection1"] wrapped = ICollection_behavior(collection1) wrapped.query = [{"i": "portal_type", "o": "plone.app.querystring.operation.string.is", "v": "Document"}] # Check if only the item inside folder1 is returned, since it's a # navigation root. items = wrapped.results(batch=False) ids = [i.getId() for i in items] self.assertListEqual(ids, ["item_in_folder1"])
def selectedViewFields(self): """Returns a list of all metadata fields from the catalog that were selected. """ context = aq_inner(self.context) wrapped = ICollection(context) return wrapped.selectedViewFields()
def test_sorting_1(self): portal = self.layer["portal"] login(portal, "admin") query = [{"i": "portal_type", "o": "plone.app.querystring.operation.string.is", "v": "News Item"}] portal.invokeFactory( "Collection", "collection", title="New Collection", query=query, sort_on="created", sort_reversed=True ) now = DateTime() # News Item 1 portal.invokeFactory(id="newsitem1", type_name="News Item") item1 = portal.newsitem1 item1.creation_date = now - 2 item1.reindexObject() # News Item 2 portal.invokeFactory(id="newsitem2", type_name="News Item") item2 = portal.newsitem2 item2.creation_date = now - 1 item2.reindexObject() # News Item 3 portal.invokeFactory(id="newsitem3", type_name="News Item") item3 = portal.newsitem3 item3.creation_date = now item3.reindexObject() collection = portal["collection"] wrapped = ICollection_behavior(collection) results = wrapped.results(batch=False) ritem0 = results[0] ritem1 = results[1] ritem2 = results[2] self.assertTrue(ritem0.CreationDate() > ritem1.CreationDate()) self.assertTrue(ritem1.CreationDate() > ritem2.CreationDate())
def test_custom_query(self): portal = self.layer["portal"] login(portal, "admin") query = [{"i": "portal_type", "o": "plone.app.querystring.operation.string.is", "v": ["News Item", "Document"]}] portal.invokeFactory("Collection", "collection", title="New Collection", query=query) # item 1 portal.invokeFactory(id="testnews", type_name="News Item") item1 = portal.testnews item1.reindexObject() # item 2 portal.invokeFactory(id="testdoc", type_name="Document") item2 = portal.testdoc item2.reindexObject() collection = portal["collection"] wrapped = ICollection_behavior(collection) # Test unmodified query results = wrapped.results(batch=False) self.assertEqual(len(results), 2) # Test with custom query results = wrapped.results(batch=False, custom_query={"portal_type": "Document"}) self.assertEqual(len(results), 1) self.assertEqual(results[0].id, "testdoc") # Test with custom query, which should not find anything results = wrapped.results(batch=False, custom_query={"portal_type": "Document", "id": "bla"}) self.assertEqual(len(results), 0)
def test_getFoldersAndImages_returning_images(self): portal = self.layer['portal'] login(portal, 'admin') # add a collection, so we can add a query to it portal.invokeFactory("Collection", "collection", title="New Collection") # add example folder portal.invokeFactory("Folder", "folder1", title="Folder1") folder = portal['folder1'] # add example image into this folder folder.invokeFactory("Image", "image", title="Image example") # add another image into the portal root portal.invokeFactory("Image", "image", title="Image example") query = [{ 'i': 'Type', 'o': 'plone.app.querystring.operation.string.is', 'v': 'Image', }] collection = portal['collection'] wrapped = ICollection_behavior(collection) wrapped.query = query imagecount = wrapped.getFoldersAndImages()['total_number_of_images'] self.assertEqual(imagecount, 2)
def tabular_fields(self): """Returns a list of all metadata fields from the catalog that were selected. """ context = aq_inner(self.context) wrapped = ICollection(context) fields = wrapped.selectedViewFields() fields = [field[0] for field in fields] return fields
def results(self, **kwargs): """ Helper to get the results from the collection-behavior. The template collectionvew.pt calls the standard_view of collections as a macro and standard_view uses python:view.results(b_start=b_start) to get the reusults. When used as a macro 'view' is this view instead of the CollectionView. """ context = aq_inner(self.context) wrapped = ICollection(context) return wrapped.results(**kwargs)
def migrate_schema_fields(self): migrate_richtextfield(self.old, self.new, 'text', 'text') wrapped_new = ICollection(self.new) # using migrate_simplefield on 'query' returns the ContentListing obj wrapped_new.query = self.old.query migrate_simplefield(self.old, wrapped_new, 'sort_on', 'sort_on') migrate_simplefield( self.old, wrapped_new, 'sort_reversed', 'sort_reversed') migrate_simplefield(self.old, wrapped_new, 'limit', 'limit') migrate_simplefield( self.old, wrapped_new, 'customViewFields', 'customViewFields')
def test_respect_navigation_root(self): self.portal.acl_users.userFolderAddUser( SITE_OWNER_NAME, SITE_OWNER_PASSWORD, ['Manager'], []) portal = self.portal login(portal, SITE_OWNER_NAME) # Create two subsites i.e create two folders and mark them with # INavigationRoot for i in range(1, 3): folder_id = 'folder{0}'.format(i) portal.invokeFactory('Folder', folder_id, title='Folder{0}'.format(i)) folder = portal[folder_id] alsoProvides(folder, INavigationRoot) folders = (portal['folder1'], portal['folder2']) # Add a content item to each folder for f in folders: f_id = f.getId() f.invokeFactory('Document', 'item_in_{0}'.format(f_id), title='Item In {0}'.format(f_id)) # Add a collection to folder1 folder1 = folders[0] folder1.invokeFactory('Collection', 'collection1', title='Collection 1') collection1 = folder1['collection1'] wrapped = ICollection_behavior(collection1) wrapped.query = [ { 'i': 'portal_type', 'o': 'plone.app.querystring.operation.string.is', 'v': 'Document', }, # use a "/" path and navroot works fine! { 'i': 'path', 'o': 'plone.app.querystring.operation.string.path', 'v': '/', }, ] # Check if only the item inside folder1 is returned, since it's a # navigation root. items = wrapped.results(batch=False) ids = [i.getId() for i in items] self.assertListEqual(ids, ['item_in_folder1'])
def test_collection_templates(self): browser = self.browser portal = self.layer["portal"] login(portal, "admin") # add an image that will be listed by the collection portal.invokeFactory("Image", "image", title="Image example") image = self.portal["image"] image.image = dummy_image() # add a collection, so we can add a query to it portal.invokeFactory("Collection", "collection", title="New Collection") collection = portal["collection"] # Search for images query = [{"i": "Type", "o": "plone.app.querystring.operation.string.is", "v": "Image"}] collection.text = RichTextValue(u"Lorem collection ipsum", "text/plain", "text/html") wrapped = ICollection_behavior(collection) # set the query and publish the collection wrapped.query = query workflow = portal.portal_workflow workflow.doActionFor(collection, "publish") commit() logout() # open a browser to see if our image is in the results browser.handleErrors = False url = collection.absolute_url() browser.open(url) self.assertTrue("Lorem collection ipsum" in browser.contents) self.assertTrue("Image example" in browser.contents) # open summary_view template browser.open("%s/@@summary_view" % url) self.assertTrue("Lorem collection ipsum" in browser.contents) self.assertTrue("Image example" in browser.contents) # open all_content template browser.open("%s/@@all_content" % url) self.assertTrue("Lorem collection ipsum" in browser.contents) self.assertTrue("Image example" in browser.contents) # open tabular_view template browser.open("%s/@@tabular_view" % url) self.assertTrue("Lorem collection ipsum" in browser.contents) self.assertTrue("Image example" in browser.contents) # open thumbnail_view template browser.open("%s/@@thumbnail_view" % url) self.assertTrue("Lorem collection ipsum" in browser.contents) self.assertTrue("Image example" in browser.contents)
def test_sorting_1(self): self.portal.acl_users.userFolderAddUser( SITE_OWNER_NAME, SITE_OWNER_PASSWORD, ['Manager'], []) portal = self.portal login(portal, SITE_OWNER_NAME) query = [{ 'i': 'portal_type', 'o': 'plone.app.querystring.operation.string.is', 'v': 'News Item', }] portal.invokeFactory('Collection', 'collection', title='New Collection', query=query, sort_on='created', sort_reversed=True, ) now = DateTime() # News Item 1 portal.invokeFactory(id='newsitem1', type_name='News Item') item1 = portal.newsitem1 item1.creation_date = now - 2 item1.reindexObject() # News Item 2 portal.invokeFactory(id='newsitem2', type_name='News Item') item2 = portal.newsitem2 item2.creation_date = now - 1 item2.reindexObject() # News Item 3 portal.invokeFactory(id='newsitem3', type_name='News Item') item3 = portal.newsitem3 item3.creation_date = now item3.reindexObject() collection = portal['collection'] wrapped = ICollection_behavior(collection) results = wrapped.results(batch=False) ritem0 = results[0] ritem1 = results[1] ritem2 = results[2] self.assertTrue(ritem0.CreationDate() > ritem1.CreationDate()) self.assertTrue(ritem1.CreationDate() > ritem2.CreationDate())
def test_custom_query(self): self.portal.acl_users.userFolderAddUser( SITE_OWNER_NAME, SITE_OWNER_PASSWORD, ['Manager'], []) portal = self.portal login(portal, SITE_OWNER_NAME) query = [{ 'i': 'portal_type', 'o': 'plone.app.querystring.operation.string.is', 'v': ['News Item', 'Document'], }] portal.invokeFactory('Collection', 'collection', title='New Collection', query=query, ) # item 1 portal.invokeFactory(id='testnews', type_name='News Item') item1 = portal.testnews item1.reindexObject() # item 2 portal.invokeFactory(id='testdoc', type_name='Document') item2 = portal.testdoc item2.reindexObject() collection = portal['collection'] wrapped = ICollection_behavior(collection) # Test unmodified query results = wrapped.results(batch=False) self.assertEqual(len(results), 2) # Test with custom query results = wrapped.results(batch=False, custom_query={'portal_type': 'Document'}) self.assertEqual(len(results), 1) self.assertEqual(results[0].id, 'testdoc') # Test with custom query, which should not find anything results = wrapped.results(batch=False, custom_query={'portal_type': 'Document', 'id': 'bla'}) self.assertEqual(len(results), 0)
def test_sorting_1(self): portal = self.layer['portal'] login(portal, 'admin') query = [{ 'i': 'portal_type', 'o': 'plone.app.querystring.operation.string.is', 'v': 'News Item', }] portal.invokeFactory("Collection", "collection", title="New Collection", query=query, sort_on='created', sort_reversed=True, ) now = DateTime() # News Item 1 portal.invokeFactory(id='newsitem1', type_name='News Item') item1 = portal.newsitem1 item1.creation_date = now - 2 item1.reindexObject() # News Item 2 portal.invokeFactory(id='newsitem2', type_name='News Item') item2 = portal.newsitem2 item2.creation_date = now - 1 item2.reindexObject() # News Item 3 portal.invokeFactory(id='newsitem3', type_name='News Item') item3 = portal.newsitem3 item3.creation_date = now item3.reindexObject() collection = portal['collection'] wrapped = ICollection_behavior(collection) results = wrapped.results(batch=False) ritem0 = results[0] ritem1 = results[1] ritem2 = results[2] self.assertTrue(ritem0.CreationDate() > ritem1.CreationDate()) self.assertTrue(ritem1.CreationDate() > ritem2.CreationDate())
def test_custom_query(self): portal = self.layer['portal'] login(portal, 'admin') query = [{ 'i': 'portal_type', 'o': 'plone.app.querystring.operation.string.is', 'v': ['News Item', 'Document'], }] portal.invokeFactory("Collection", "collection", title="New Collection", query=query, ) # item 1 portal.invokeFactory(id='testnews', type_name='News Item') item1 = portal.testnews item1.reindexObject() # item 2 portal.invokeFactory(id="testdoc", type_name='Document') item2 = portal.testdoc item2.reindexObject() collection = portal['collection'] wrapped = ICollection_behavior(collection) # Test unmodified query results = wrapped.results(batch=False) self.assertEqual(len(results), 2) # Test with custom query results = wrapped.results(batch=False, custom_query={'portal_type': 'Document'}) self.assertEqual(len(results), 1) self.assertEqual(results[0].id, 'testdoc') # Test with custom query, which should not find anything results = wrapped.results(batch=False, custom_query={'portal_type': 'Document', 'id': 'bla'}) self.assertEqual(len(results), 0)
def __call__(self): # datev = self.layout context = self.context linkquery = {u'i': u'portal_type', u'o': u'plone.app.querystring.operation.selection.any', u'v': [u'Link', u'Document']} from plone.app.contenttypes.behaviors.collection import ICollection as ICollection_behavior query = ICollection_behavior(context).query # import pdb # pdb.set_trace() for qr in query: if qr['i'] == 'portal_type': break if bool(qr): query.remove(qr) query.append(linkquery) ICollection_behavior(context).query = query return "link type has been added to '%s' successfully ." % (context.Title())
def test_getFoldersAndImages_returning_images(self): portal = self.layer["portal"] login(portal, "admin") # add a collection, so we can add a query to it portal.invokeFactory("Collection", "collection", title="New Collection") # add example folder portal.invokeFactory("Folder", "folder1", title="Folder1") folder = portal["folder1"] # add example image into this folder folder.invokeFactory("Image", "image", title="Image example") # add another image into the portal root portal.invokeFactory("Image", "image", title="Image example") query = [{"i": "Type", "o": "plone.app.querystring.operation.string.is", "v": "Image"}] collection = portal["collection"] wrapped = ICollection_behavior(collection) wrapped.query = query imagecount = wrapped.getFoldersAndImages()["total_number_of_images"] self.assertEqual(imagecount, 2)
def test_respect_navigation_root(self): portal = self.layer['portal'] login(portal, 'admin') # Create two subsites i.e create two folders and mark them with # INavigationRoot for i in xrange(1, 3): folder_id = 'folder{}'.format(i) portal.invokeFactory('Folder', folder_id, title='Folder{}'.format(i)) folder = portal[folder_id] alsoProvides(folder, INavigationRoot) folders = (portal['folder1'], portal['folder2']) # Add a content item to each folder for f in folders: f_id = f.getId() f.invokeFactory('Document', 'item_in_{}'.format(f_id), title='Item In {}'.format(f_id)) # Add a collection to folder1 folder1 = folders[0] folder1.invokeFactory('Collection', 'collection1', title='Collection 1') collection1 = folder1['collection1'] wrapped = ICollection_behavior(collection1) wrapped.query = [{ 'i': 'portal_type', 'o': 'plone.app.querystring.operation.string.is', 'v': 'Document', }] # Check if only the item inside folder1 is returned, since it's a # navigation root. items = wrapped.results(batch=False) ids = [i.getId() for i in items] self.assertListEqual(ids, ['item_in_folder1'])
def test_getFoldersAndImages(self): portal = self.layer['portal'] login(portal, 'admin') # add a collection, so we can add a query to it portal.invokeFactory("Collection", "collection", title="New Collection") # add example folder and a subfolder to it, both with same id portal.invokeFactory("Folder", "folder1", title="Folder1") folder = portal['folder1'] folder.invokeFactory("Folder", "folder1", title="Folder1") subfolder = folder['folder1'] # add example image into folder and its subfolder folder.invokeFactory("Image", "image", title="Image example") subfolder.invokeFactory("Image", "another_image", title="Image example") query = [{ 'i': 'Type', 'o': 'plone.app.querystring.operation.string.is', 'v': 'Folder', }] collection = portal['collection'] wrapped = ICollection_behavior(collection) wrapped.query = query imagecount = wrapped.getFoldersAndImages()['total_number_of_images'] # The current implementation for getFoldersAndImages will return # another_image under subfolder and also under folder self.assertEqual(imagecount, 3)
def test_getFoldersAndImages(self): portal = self.layer["portal"] login(portal, "admin") # add a collection, so we can add a query to it portal.invokeFactory("Collection", "collection", title="New Collection") # add example folder and a subfolder to it, both with same id portal.invokeFactory("Folder", "folder1", title="Folder1") folder = portal["folder1"] folder.invokeFactory("Folder", "folder1", title="Folder1") subfolder = folder["folder1"] # add example image into folder and its subfolder folder.invokeFactory("Image", "image", title="Image example") subfolder.invokeFactory("Image", "another_image", title="Image example") query = [{"i": "Type", "o": "plone.app.querystring.operation.string.is", "v": "Folder"}] collection = portal["collection"] wrapped = ICollection_behavior(collection) wrapped.query = query imagecount = wrapped.getFoldersAndImages()["total_number_of_images"] # The current implementation for getFoldersAndImages will return # another_image under subfolder and also under folder self.assertEqual(imagecount, 3)
def migrate_schema_fields(self): # migrate the richtext super(CollectionMigrator, self).migrate_schema_fields() # migrate the rest of the schema into the behavior wrapped = ICollection(self.new) wrapped.query = self.old.query wrapped.sort_on = self.old.sort_on wrapped.sort_reversed = self.old.sort_reversed wrapped.limit = self.old.limit wrapped.customViewFields = self.old.customViewFields
def migrate_criteria(self): """Migrate old style to new style criteria. Plus handling for some special fields. """ # The old Topic has boolean limitNumber and integer itemCount, # where the new Collection only has limit. adapted = ICollection(self.new) if self.old.getLimitNumber(): adapted.limit = self.old.getItemCount() adapted.customViewFields = self.old.getCustomViewFields() # Get the old data stored by the beforeChange_criteria method. if self._collection_sort_reversed is not None: adapted.sort_reversed = self._collection_sort_reversed if self._collection_sort_on is not None: adapted.sort_on = self._collection_sort_on if self._collection_query is not None: adapted.query = self._collection_query
def get_filter_items(target_collection, group_by, filter_type=DEFAULT_FILTER_TYPE, narrow_down=False, show_count=False, view_name='', cache_enabled=True, request_params=None): request_params = request_params or {} custom_query = {} # Additional query to filter the collection collection = uuidToObject(target_collection) if not collection or not group_by: return None collection_url = collection.absolute_url() # Recursively transform all to unicode request_params = safe_decode(request_params) # Support for the Event Listing view from plone.app.event collection_layout = collection.getLayout() default_view = collection.restrictedTraverse(collection_layout) if isinstance(default_view, EventListing): mode = request_params.get('mode', 'future') date = request_params.get('date', None) date = guess_date_from(date) if date else None start, end = start_end_from_mode(mode, date, collection) start, end = _prepare_range(collection, start, end) custom_query.update(start_end_query(start, end)) # TODO: expand events. better yet, let collection.results # do that # Get index in question and the current filter value of this index, if set. groupby_criteria = getUtility(IGroupByCriteria).groupby idx = groupby_criteria[group_by]['index'] current_idx_value = safe_iterable(request_params.get(idx)) extra_ignores = [] if not narrow_down: # Additive filtering is about adding other filter values of the same # index. extra_ignores = [idx, idx + '_op'] urlquery = base_query(request_params, extra_ignores) # Get all collection results with additional filter defined by urlquery custom_query.update(urlquery) custom_query = make_query(custom_query) catalog_results = ICollection(collection).results( batch=False, brains=True, custom_query=custom_query) if narrow_down and show_count: # we need the extra_ignores to get a true count # even when narrow_down filters the display of indexed values # count_query allows us to do that true count count_query = {} count_urlquery = base_query(request_params, [idx, idx + '_op']) count_query.update(count_urlquery) catalog_results_fullcount = ICollection(collection).results( batch=False, brains=True, custom_query=count_query) if not catalog_results: return None # Attribute name for getting filter value from brain metadata_attr = groupby_criteria[group_by]['metadata'] # Optional modifier to set title from filter value display_modifier = groupby_criteria[group_by].get('display_modifier', None) # CSS modifier to set class on filter item css_modifier = groupby_criteria[group_by].get('css_modifier', None) # Value blacklist value_blacklist = groupby_criteria[group_by].get('value_blacklist', None) # Allow value_blacklist to be callables for runtime-evaluation value_blacklist = value_blacklist() if callable( value_blacklist) else value_blacklist # noqa # fallback to title sorted values sort_key_function = groupby_criteria[group_by].get( 'sort_key_function', lambda it: it['title'].lower()) grouped_results = {} for brain in catalog_results: # Get filter value val = getattr(brain, metadata_attr, None) if callable(val): val = val() # decode it to unicode val = safe_decode(val) # Make sure it's iterable, as it's the case for e.g. the subject index. val = safe_iterable(val) for filter_value in val: if filter_value is None or isinstance(filter_value, Missing): continue if value_blacklist and filter_value in value_blacklist: # Do not include blacklisted continue if filter_value in grouped_results: # Add counter, if filter value is already present grouped_results[filter_value]['count'] += 1 continue # Set title from filter value with modifications, # e.g. uuid to title title = filter_value if filter_value is not EMPTY_MARKER and callable(display_modifier): title = safe_decode(display_modifier(filter_value)) # Build filter url query _urlquery = urlquery.copy() # Allow deselection if filter_value in current_idx_value: _urlquery[idx] = [ it for it in current_idx_value if it != filter_value ] elif filter_type != 'single': # additive filter behavior _urlquery[idx] = current_idx_value + [filter_value] _urlquery[idx + '_op'] = filter_type # additive operator else: _urlquery[idx] = filter_value query_param = urlencode(safe_encode(_urlquery), doseq=True) url = '/'.join([ it for it in [ collection_url, view_name, '?' + query_param if query_param else None ] if it ]) # Set selected state selected = filter_value in current_idx_value css_class = 'filterItem {0}{1} {2}'.format( 'filter-' + idnormalizer.normalize(filter_value), ' selected' if selected else '', css_modifier(filter_value) if css_modifier else '', ) grouped_results[filter_value] = { 'title': title, 'url': url, 'value': filter_value, 'css_class': css_class, 'count': 1, 'selected': selected } # Entry to clear all filters urlquery_all = { k: v for k, v in list(urlquery.items()) if k not in (idx, idx + '_op') } if narrow_down and show_count: catalog_results = catalog_results_fullcount ret = [{ 'title': translate(_('subject_all', default=u'All'), context=getRequest()), 'url': u'{0}/?{1}'.format(collection_url, urlencode(safe_encode(urlquery_all), doseq=True)), 'value': 'all', 'css_class': 'filterItem filter-all', 'count': len(catalog_results), 'selected': idx not in request_params }] grouped_results = list(grouped_results.values()) if callable(sort_key_function): grouped_results = sorted(grouped_results, key=sort_key_function) ret += grouped_results return ret
def test_collection_templates(self): self.portal.acl_users.userFolderAddUser( SITE_OWNER_NAME, SITE_OWNER_PASSWORD, ['Manager'], []) browser = self.browser portal = self.portal login(portal, SITE_OWNER_NAME) # add an image that will be listed by the collection portal.invokeFactory('Image', 'image', title='Image example') image = self.portal['image'] image.image = dummy_image() # add a collection, so we can add a query to it portal.invokeFactory('Collection', 'collection', title='New Collection') collection = portal['collection'] # Search for images query = [{ 'i': 'Type', 'o': 'plone.app.querystring.operation.string.is', 'v': 'Image', }] collection.text = RichTextValue( u'Lorem collection ipsum', 'text/plain', 'text/html' ) wrapped = ICollection_behavior(collection) # set the query and publish the collection wrapped.query = query workflow = portal.portal_workflow workflow.doActionFor(collection, 'publish') commit() logout() # open a browser to see if our image is in the results browser.handleErrors = False url = collection.absolute_url() browser.open(url) self.assertIn('Lorem collection ipsum', browser.contents) self.assertIn('Image example', browser.contents) # open summary_view template browser.open('{0}/@@summary_view'.format(url)) self.assertIn('Lorem collection ipsum', browser.contents) self.assertIn('Image example', browser.contents) # open full_view template browser.open('{0}/@@full_view'.format(url)) self.assertIn('Lorem collection ipsum', browser.contents) self.assertIn('Image example', browser.contents) # open tabular_view template browser.open('{0}/@@tabular_view'.format(url)) self.assertIn('Lorem collection ipsum', browser.contents) self.assertIn('Image example', browser.contents) # open thumbnail_view template browser.open('{0}/@@album_view'.format(url)) self.assertIn('Lorem collection ipsum', browser.contents) self.assertIn('Image example', browser.contents)
def getFoldersAndImages(self, **kwargs): context = aq_inner(self.context) wrapped = ICollection(context) return wrapped.getFoldersAndImages(**kwargs)
def results(self, **kwargs): context = aq_inner(self.context) wrapped = ICollection(context) return wrapped.results(**kwargs)
class SummaryViewNews(FolderView): def __init__(self, *args, **kwargs): super(SummaryViewNews, self).__init__(*args, **kwargs) context = aq_inner(self.context) self.collection_behavior = ICollection(context) self.b_size = self.collection_behavior.item_count def results(self, **kwargs): """Return a content listing based result set with results from the collection query. :param **kwargs: Any keyword argument, which can be used for catalog queries. :type **kwargs: keyword argument :returns: plone.app.contentlisting based result set. :rtype: ``plone.app.contentlisting.interfaces.IContentListing`` based sequence. """ # Extra filter contentFilter = self.request.get('contentFilter', {}) contentFilter.update(kwargs.get('contentFilter', {})) kwargs.setdefault('custom_query', contentFilter) kwargs.setdefault('batch', True) kwargs.setdefault('b_size', self.b_size) kwargs.setdefault('b_start', self.b_start) results = self.collection_behavior.results(**kwargs) return results def batch(self): # collection is already batched. return self.results() def getFoldersAndImages(self, **kwargs): context = aq_inner(self.context) wrapped = ICollection(context) return wrapped.getFoldersAndImages(**kwargs) def selectedViewFields(self): """Returns a list of all metadata fields from the catalog that were selected. """ context = aq_inner(self.context) wrapped = ICollection(context) return wrapped.selectedViewFields() def abrevia(self, summary, sumlenght): """ Retalla contingut de cadenes """ bb = '' if sumlenght < len(summary): bb = summary[:sumlenght] lastspace = bb.rfind(' ') cutter = lastspace precut = bb[0:cutter] if precut.count('<b>') > precut.count('</b>'): cutter = summary.find('</b>', lastspace) + 4 elif precut.count('<strong>') > precut.count('</strong>'): cutter = summary.find('</strong>', lastspace) + 9 bb = summary[0:cutter] if bb.count('<p') > precut.count('</p'): bb += '...</p>' else: bb = bb + '...' else: bb = summary return bb def effectiveDate(self, item): if item.EffectiveDate() == 'None': date = str(item.creation_date.day()) + '/' + str(item.creation_date.month()) + '/' + str(item.creation_date.year()), else: date = str(item.effective_date.day()) + '/' + str(item.effective_date.month()) + '/' + str(item.effective_date.year()), return date[0] def abreviaText(self, item): text = self.abrevia(item.text.raw, 180) return text
def __init__(self, *args, **kwargs): super(SummaryViewNews, self).__init__(*args, **kwargs) context = aq_inner(self.context) self.collection_behavior = ICollection(context) self.b_size = self.collection_behavior.item_count
def test_collection_templates(self): browser = self.browser portal = self.layer['portal'] login(portal, 'admin') # add an image that will be listed by the collection portal.invokeFactory("Image", "image", title="Image example") image = self.portal['image'] image.image = dummy_image() # add a collection, so we can add a query to it portal.invokeFactory("Collection", "collection", title="New Collection") collection = portal['collection'] # Search for images query = [{ 'i': 'Type', 'o': 'plone.app.querystring.operation.string.is', 'v': 'Image', }] collection.text = RichTextValue( u"Lorem collection ipsum", 'text/plain', 'text/html' ) wrapped = ICollection_behavior(collection) # set the query and publish the collection wrapped.query = query workflow = portal.portal_workflow workflow.doActionFor(collection, "publish") commit() logout() # open a browser to see if our image is in the results browser.handleErrors = False url = collection.absolute_url() browser.open(url) self.assertTrue("Lorem collection ipsum" in browser.contents) self.assertTrue("Image example" in browser.contents) # open summary_view template browser.open('%s/@@summary_view' % url) self.assertTrue("Lorem collection ipsum" in browser.contents) self.assertTrue("Image example" in browser.contents) # open full_view template browser.open('%s/@@full_view' % url) self.assertTrue("Lorem collection ipsum" in browser.contents) self.assertTrue("Image example" in browser.contents) # open tabular_view template browser.open('%s/@@tabular_view' % url) self.assertTrue("Lorem collection ipsum" in browser.contents) self.assertTrue("Image example" in browser.contents) # open thumbnail_view template browser.open('%s/@@album_view' % url) self.assertTrue("Lorem collection ipsum" in browser.contents) self.assertTrue("Image example" in browser.contents)
def collection_behavior(self): return ICollection(aq_inner(self.context))
class CollectionView(FolderView): def __init__(self, *args, **kwargs): super(CollectionView, self).__init__(*args, **kwargs) context = aq_inner(self.context) self.collection_behavior = ICollection(context) self.b_size = self.collection_behavior.item_count def results(self, **kwargs): """Return a content listing based result set with results from the collection query. :param **kwargs: Any keyword argument, which can be used for catalog queries. :type **kwargs: keyword argument :returns: plone.app.contentlisting based result set. :rtype: ``plone.app.contentlisting.interfaces.IContentListing`` based sequence. """ # Extra filter contentFilter = self.request.get('contentFilter', {}) contentFilter.update(kwargs.get('contentFilter', {})) kwargs.setdefault('custom_query', contentFilter) kwargs.setdefault('batch', True) kwargs.setdefault('b_size', self.b_size) kwargs.setdefault('b_start', self.b_start) results = self.collection_behavior.results(**kwargs) return results def batch(self): # collection is already batched. return self.results() @property @memoize def _album_results(self): """Get results to display an album with subalbums. """ results = self.results() images = [] folders = [] for it in results: # TODO: potentially expensive! ob = it.getObject() if IImage.providedBy(ob): images.append(it) elif IFolder.providedBy(ob): folders.append(it) return {'images': images, 'folders': folders} @property def album_images(self): """Get all images within this collection. """ return self._album_results['images'] @property def album_folders(self): """Get all folders within this collection. """ return self._album_results['folders'] def tabular_fields(self): """Returns a list of all metadata fields from the catalog that were selected. """ context = aq_inner(self.context) wrapped = ICollection(context) fields = wrapped.selectedViewFields() fields = [field[0] for field in fields] return fields def no_items_message(self): return _( 'description_no_results_found', default=u"No results were found." )
class CollectionView(FolderView): def __init__(self, *args, **kwargs): super(CollectionView, self).__init__(*args, **kwargs) context = aq_inner(self.context) self.collection_behavior = ICollection(context) self.b_size = self.collection_behavior.item_count def results(self, **kwargs): """Return a content listing based result set with results from the collection query. :param **kwargs: Any keyword argument, which can be used for catalog queries. :type **kwargs: keyword argument :returns: plone.app.contentlisting based result set. :rtype: ``plone.app.contentlisting.interfaces.IContentListing`` based sequence. """ # Extra filter contentFilter = self.request.get('contentFilter', {}) contentFilter.update(kwargs.get('contentFilter', {})) kwargs.setdefault('custom_query', contentFilter) kwargs.setdefault('batch', True) kwargs.setdefault('b_size', self.b_size) kwargs.setdefault('b_start', self.b_start) results = self.collection_behavior.results(**kwargs) return results def batch(self): # collection is already batched. return self.results() @property @memoize def _album_results(self): """Get results to display an album with subalbums. """ results = self.results() images = [] folders = [] for it in results: # TODO: potentially expensive! ob = it.getObject() if IImage.providedBy(ob): images.append(it) elif IFolder.providedBy(ob): folders.append(it) return {'images': images, 'folders': folders} @property def album_images(self): """Get all images within this collection. """ return self._album_results['images'] @property def album_folders(self): """Get all folders within this collection. """ return self._album_results['folders'] def tabular_fields(self): """Returns a list of all metadata fields from the catalog that were selected. """ context = aq_inner(self.context) wrapped = ICollection(context) fields = wrapped.selectedViewFields() fields = [field[0] for field in fields] return fields def no_items_message(self): return _('description_no_results_found', default=u"No results were found.")
def __init__(self, *args, **kwargs): super(CollectionView, self).__init__(*args, **kwargs) context = aq_inner(self.context) self.collection_behavior = ICollection(context) self.b_size = self.collection_behavior.item_count
def __init__(self, context): self.context = context self.collection = ICollection(self.context)