예제 #1
0
 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')
예제 #2
0
 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)
예제 #3
0
 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')
예제 #4
0
 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')
예제 #5
0
 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')
예제 #6
0
    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)
예제 #7
0
    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))
예제 #8
0
 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)
예제 #9
0
 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)
예제 #10
0
 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)
예제 #11
0
    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))
예제 #13
0
    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
예제 #14
0
    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
예제 #15
0
    def testSortableTitleOutput(self):
        doc = self.folder.doc
        wrapped = IndexableObjectWrapper(doc, self.portal.portal_catalog)

        self.assertEqual(wrapped.sortable_title, '0012 document 0025')
예제 #16
0
 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)