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_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_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_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): 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_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_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 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)
class CollectionishCollection(object): def __init__(self, context): self.context = context self.collection = ICollection(self.context) def selectContent(self, selector=""): """Collections can only have a single content""" return self @property def query(self): return self.collection.query @property def sort_on(self): return self.collection.sort_on @property def sort_order(self): return self.collection.sort_order @property def sort_reversed(self): return self.collection.sort_reversed @property def limit(self): return self.collection.limit @property def item_count(self): return self.collection.item_count @property def content_selector(self): return u"#content-core" # TODO: could look it up based on view? def results(self, custom_query, request_params): # Support for the Event Listing view from plone.app.event collection_layout = self.context.getLayout() default_view = self.context.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, self.collection) start, end = _prepare_range(self.collection, start, end) custom_query.update(start_end_query(start, end)) # TODO: expand events. better yet, let collection.results # do that return self.collection.results( batch=False, brains=True, custom_query=custom_query )
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. """ if COLLECTION_IS_BEHAVIOR: context = aq_inner(self.context) wrapped = ICollection(context) return wrapped.results(**kwargs) else: return self.context.results(**kwargs)
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_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_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_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_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_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 marshall_collection(self, context): """Get content from the collection behavior and marshall it""" collection = ICollection(context) for entry in collection.results(): item = entry.getObject() collection_marshaller = queryMultiAdapter( (item, self.marshall_target), interface=IMarshallSource, default=DX2Any(item, self.marshall_target), ) if collection_marshaller: collection_marshaller.marshall() rdf_type = IStructure(item).predicate self.marshall_target.set_link( self.resource, rdf_type, collection_marshaller.resource, )
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_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'])
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 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