def testSortableLongNumberPrefix(self): title = '1.2.3 foo document' doc = self.folder.doc doc.setTitle(title) wrapped = IndexableObjectWrapper(doc, self.portal.portal_catalog) self.assertEqual(wrapped.sortable_title, '0001.0002.0003 foo document') title = '1.2.3 foo program' doc.setTitle(title) wrapped = IndexableObjectWrapper(doc, self.portal.portal_catalog) self.assertEqual(wrapped.sortable_title, '0001.0002.0003 foo program')
def test_title_not_in_snippet_text(self): portal = self.layer['portal'] setRoles(portal, TEST_USER_ID, ['Manager']) doc = portal[portal.invokeFactory('Document', 'doc1', title=u"Document 1")] wrapped = IndexableObjectWrapper(doc, portal.portal_catalog) self.assertNotIn('Document 1', wrapped.snippetText)
def testSortableDate(self): title = '2012-06-01 foo document' doc = self.folder.doc doc.setTitle(title) wrapped = IndexableObjectWrapper(doc, self.portal.portal_catalog) self.assertEqual(wrapped.sortable_title, '2012-0006-0001 foo document')
def testSortableLongCommonPrefix(self): title = 'some documents have too long a name and only differ at ' \ 'the very end - like 1.jpeg' doc = self.folder.doc doc.setTitle(title) wrapped = IndexableObjectWrapper(doc, self.portal.portal_catalog) self.assertEqual(wrapped.sortable_title, 'some documents have too lon... 0001.jpeg')
def testSortableNonASCIITitles(self): #test a utf-8 encoded string gets properly unicode converted #sort must ignore accents title = 'La Pe\xc3\xb1a' doc = self.folder.doc doc.setTitle(title) wrapped = IndexableObjectWrapper(doc, self.portal.portal_catalog) self.assertEqual(wrapped.sortable_title, 'la pena')
def test_uuid(self): alsoProvides(self.doc, IAttributeUUID) notify(ObjectCreatedEvent(self.doc)) uuid = IUUID(self.doc, None) wrapped = IndexableObjectWrapper(self.doc, self.portal.portal_catalog) self.assertTrue(wrapped.UID) self.assertTrue(uuid == wrapped.UID)
def test_provided(self): from Products.CMFCore.interfaces import IContentish from plone.indexer.interfaces import IIndexableObjectWrapper from Products.CMFCore.tests.base.dummy import DummyContent obj = DummyContent() w = IndexableObjectWrapper(obj, self.portal.portal_catalog) self.assertTrue(IIndexableObjectWrapper.providedBy(w)) self.assertTrue(IContentish.providedBy(w))
def test_strip_html_tags(self): portal = self.layer['portal'] setRoles(portal, TEST_USER_ID, ['Manager']) doc = portal[portal.invokeFactory('Document', 'doc1')] def SearchableText(self): return "<p>Body Text</p>" doc.SearchableText = SearchableText.__get__(doc, doc.__class__) wrapped = IndexableObjectWrapper(doc, portal.portal_catalog) self.assertIn('Body Text', wrapped.snippetText) self.assertNotIn('<p>', wrapped.snippetText) self.assertNotIn('</p>', wrapped.snippetText)
def catalog_object(self, obj, uid=None, idxs=None, update_metadata=1, pghandler=None): if not IIndexableObjectWrapper.providedBy(obj): obj = IndexableObjectWrapper(obj, self) super(TablePageCatalog, self).catalog_object(obj, uid=uid, idxs=idxs, update_metadata=update_metadata, pghandler=pghandler)
def test_non_archetypes_content(self): from Products.CMFCore.interfaces import IContentish from zope.interface import implements class DummyType(object): implements(IContentish) def SearchableText(self_): return "Dummy SearchableText" def Title(self_): return "Dummy" def Schema(self_): self.fail("Not an archetypes object.") portal = self.layer['portal'] doc = DummyType() wrapped = IndexableObjectWrapper(doc, portal.portal_catalog) self.assertEquals(" SearchableText", wrapped.snippetText)
def test_searchable_text_indexer(self): from plone.indexer.interfaces import IIndexer from Products.ZCatalog.interfaces import IZCatalog from zope.interface import implements, Interface, alsoProvides from zope.component import provideAdapter, adapts class IMarker(Interface): pass class SearchableText(object): implements(IIndexer) adapts(IMarker, IZCatalog) def __init__(self, context, catalog): pass def __call__(self): return "Spam and eggs" provideAdapter(SearchableText, name="SearchableText") portal = self.layer['portal'] setRoles(portal, TEST_USER_ID, ['Manager']) doc = portal[portal.invokeFactory('Document', 'doc1')] alsoProvides(doc, IMarker) wrapped = IndexableObjectWrapper(doc, portal.portal_catalog) self.assertIn('Spam and eggs', wrapped.snippetText)
def upgrade_to_2000(context): """ Add timezone to start and end """ catalog = api.portal.get_tool('portal_catalog') brains = catalog(portal_type='Message') logger.info('Found {0} messages'.format(len(brains))) count = 0 for brain in brains: obj = brain.getObject() correction = False for attr in ('start', 'end'): if getattr(obj, attr, False): # use plone.indexer index to be sure we have same value indexable_wrapper = IndexableObjectWrapper(obj, catalog) setattr(obj, attr, getattr(indexable_wrapper, attr)) correction = True if correction: count += 1 # reindex entire object to avoid datetime with/without TZ comparison # that breaks metadata update obj.reindexObject() logger.info('Corrected {0} messages'.format(count))
def update_groupings(self, obj): """ Update the groupings dict with the values stored on obj. """ context = aq_inner(self.context) if parent_workspace(obj) == obj: # obj is the workspace, abort return catalog = api.portal.get_tool("portal_catalog") groupings = context._groupings # label self._remove_grouping_values('label', obj.Subject(), obj) self._add_grouping_values('label', obj.Subject(), obj) # mimetype wrapper = IndexableObjectWrapper(obj, catalog) if hasattr(wrapper, 'mimetype'): mimetype = wrapper.mimetype self._remove_grouping_values('type', [mimetype], obj) self._add_grouping_values('type', [mimetype], obj) # author self._add_grouping_values('author', [obj.Creator()], obj) self._remove_grouping_values('author', [obj.Creator()], obj) # Title / first letter title_or_id = obj.Title() and obj.Title() or obj.id first_letter = title_or_id[0].lower() self._add_grouping_values('first_letter', [first_letter], obj) self._remove_grouping_values('first_letter', [first_letter], obj) context._groupings = groupings context._groupings_modified = datetime.now() context._p_changed = 1
def __call__(self): wrapped = IndexableObjectWrapper(self.context, self.catalog) text = getattr(wrapped, 'SearchableText') if safe_callable(text): text = text() # Archetypes object: remove id and title if IBaseObject.providedBy(self.context): for fieldname in ['id', 'title']: field = self.context.Schema().getField(fieldname) if field is None: continue method = field.getIndexAccessor(self.context) value = method() text = text.replace(value, '', 1) # other content (e.g. dexterity): remove title elif IContentish.providedBy(self.context): text = text.replace(self.context.Title(), '', 1) # Strip html tags text = re.sub('<[^<]+?>', '', text) return text
def testSortableTitleOutput(self): doc = self.folder.doc wrapped = IndexableObjectWrapper(doc, self.portal.portal_catalog) self.assertEqual(wrapped.sortable_title, '0012 document 0025')
def test_getIcon(self): doc = self.doc iconname = doc.getIcon(relative_to_portal=1) wrapped = IndexableObjectWrapper(doc, self.portal.portal_catalog) self.assertEqual(wrapped.getIcon, iconname)