def testReplaceDescription(self): from collective.searchandreplace.searchreplaceutility import getRawText setRoles(self.portal, TEST_USER_ID, ['Manager']) self.portal.invokeFactory('Document', 'doc1') doc1 = getattr(self.portal, 'doc1') edit_content( doc1, title='Test Title', description='Test Description', text='Test Case') self.assertEqual(doc1.Description(), 'Test Description') # Search it. parameters = dict( context=doc1, find='test desc', replaceText='foo', matchCase=False) results = self.srutil.searchObjects(**parameters) self.assertEqual(len(results), 1) self.assertEqual(doc1.Description(), 'Test Description') # Replace it. parameters['doReplace'] = True results = self.srutil.searchObjects(**parameters) self.assertEqual(results, 1) # Note: we have replaced only part of the description. self.assertEqual(doc1.Description(), 'fooription') # Other fields are not changed. self.assertEqual(doc1.Title(), 'Test Title') self.assertEqual(getRawText(doc1), 'Test Case')
def testMatchCase(self): setRoles(self.portal, TEST_USER_ID, ["Manager"]) self.portal.invokeFactory("Document", "doc2") doc2 = getattr(self.portal, "doc2") edit_content(doc2, title="find title", text="Find Case") results = self.srutil.findObjects(doc2, "find case", matchCase=True) self.assertEqual(len(results), 0)
def testReplaceDescription(self): from collective.searchandreplace.searchreplaceutility import getRawText setRoles(self.portal, TEST_USER_ID, ["Manager"]) self.portal.invokeFactory("Document", "doc1") doc1 = getattr(self.portal, "doc1") edit_content(doc1, title="Find Title", description="Find Description", text="Find Case") self.assertEqual(doc1.Description(), "Find Description") # Search it. parameters = dict(context=doc1, findWhat="find desc", matchCase=False) results = self.srutil.findObjects(**parameters) self.assertEqual(len(results), 1) self.assertEqual(doc1.Description(), "Find Description") r_parameters = dict(replaceWith="replaced", ) r_parameters.update(parameters) results = self.srutil.replaceAllMatches(**r_parameters) self.assertEqual(results, 1) # Note: we have replaced only part of the description. self.assertEqual(doc1.Description(), "replacedription") # Other fields are not changed. self.assertEqual(doc1.Title(), "Find Title") self.assertEqual(getRawText(doc1), "Find Case")
def testReplaceSubjectTwiceInThirdItem(self): registry = getUtility(IRegistry) settings = registry.forInterface(ISearchReplaceSettings, check=False) settings.include_lines_fields = True setRoles(self.portal, TEST_USER_ID, ["Manager"]) self.portal.invokeFactory("Document", "doc1") doc1 = getattr(self.portal, "doc1") edit_content( doc1, title="Find Title", subject=("Replace", "Replace", "Find subject find subject"), ) self.assertEqual(doc1.Subject(), ("Replace", "Replace", "Find subject find subject")) # Search it. parameters = dict( context=doc1, findWhat="find subject", matchCase=False, onlySearchableText=True, ) results = self.srutil.findObjects(**parameters) self.assertEqual(len(results), 2) r_parameters = dict(replaceWith="replaced", ) r_parameters.update(parameters) results = self.srutil.replaceAllMatches(**r_parameters) # Note: replacing returns an int, not a list. self.assertEqual(results, 2) self.assertEqual(doc1.Subject(), ("Replace", "Replace", "replaced replaced")) # Other fields are not changed. self.assertEqual(doc1.Title(), "Find Title")
def testReplaceEmpty(self): from collective.searchandreplace.searchreplaceutility import getRawText setRoles(self.portal, TEST_USER_ID, ["Manager"]) self.portal.invokeFactory("Document", "doc1") doc1 = getattr(self.portal, "doc1") edit_content( doc1, title="Find My Title", description="Find My Description", text="Find My Text", ) self.assertEqual(getRawText(doc1), "Find My Text") # Search it. parameters = dict(context=doc1, findWhat=" My", matchCase=False) results = self.srutil.findObjects(**parameters) self.assertEqual(len(results), 3) self.assertEqual(getRawText(doc1), "Find My Text") r_parameters = dict(replaceWith="", ) r_parameters.update(parameters) results = self.srutil.replaceAllMatches(**r_parameters) # Note: replacing returns an int, not a list. self.assertEqual(results, 3) self.assertEqual(getRawText(doc1), "Find Text") self.assertEqual(doc1.Title(), "Find Title") self.assertEqual(doc1.Description(), "Find Description")
def testReplaceRawHTML(self): from collective.searchandreplace.searchreplaceutility import getRawText setRoles(self.portal, TEST_USER_ID, ['Manager']) self.portal.invokeFactory('Document', 'doc1') doc1 = getattr(self.portal, 'doc1') edit_content(doc1, title='Test Title', text='My <strong>Test</strong> Case') self.assertEqual(getRawText(doc1), 'My <strong>Test</strong> Case') # Search only in SearchableText. parameters = dict(context=doc1, find='<strong>Test</strong>', replaceText='<em>Test</em>', onlySearchableText=True, matchCase=False) results = self.srutil.searchObjects(**parameters) self.assertEqual(len(results), 0) # Search everywhere. parameters['onlySearchableText'] = False results = self.srutil.searchObjects(**parameters) self.assertEqual(len(results), 1) self.assertEqual(getRawText(doc1), 'My <strong>Test</strong> Case') # Replace it. parameters['doReplace'] = True results = self.srutil.searchObjects(**parameters) # Note: replacing returns an int, not a list. self.assertEqual(results, 1) self.assertEqual(getRawText(doc1), 'My <em>Test</em> Case')
def testReplaceRawHTML(self): from collective.searchandreplace.searchreplaceutility import getRawText setRoles(self.portal, TEST_USER_ID, ["Manager"]) self.portal.invokeFactory("Document", "doc1") doc1 = getattr(self.portal, "doc1") edit_content(doc1, title="Find Title", text="My <strong>Test</strong> Case") self.assertEqual(getRawText(doc1), "My <strong>Test</strong> Case") # Search only in SearchableText. parameters = dict( context=doc1, findWhat="<strong>Test</strong>", onlySearchableText=True, matchCase=False, ) results = self.srutil.findObjects(**parameters) self.assertEqual(len(results), 0) # Search everywhere. parameters["onlySearchableText"] = False results = self.srutil.findObjects(**parameters) self.assertEqual(len(results), 1) self.assertEqual(getRawText(doc1), "My <strong>Test</strong> Case") r_parameters = dict(replaceWith="<em>Test</em>", ) r_parameters.update(parameters) # Replace it. results = self.srutil.replaceAllMatches(**r_parameters) # Note: replacing returns an int, not a list. self.assertEqual(results, 1) self.assertEqual(getRawText(doc1), "My <em>Test</em> Case")
def testReplaceDescription(self): from collective.searchandreplace.searchreplaceutility import getRawText setRoles(self.portal, TEST_USER_ID, ['Manager']) self.portal.invokeFactory('Document', 'doc1') doc1 = getattr(self.portal, 'doc1') edit_content(doc1, title='Test Title', description='Test Description', text='Test Case') self.assertEqual(doc1.Description(), 'Test Description') # Search it. parameters = dict(context=doc1, find='test desc', replaceText='foo', matchCase=False) results = self.srutil.searchObjects(**parameters) self.assertEqual(len(results), 1) self.assertEqual(doc1.Description(), 'Test Description') # Replace it. parameters['doReplace'] = True results = self.srutil.searchObjects(**parameters) self.assertEqual(results, 1) # Note: we have replaced only part of the description. self.assertEqual(doc1.Description(), 'fooription') # Other fields are not changed. self.assertEqual(doc1.Title(), 'Test Title') self.assertEqual(getRawText(doc1), 'Test Case')
def testReplaceRawHTML(self): from collective.searchandreplace.searchreplaceutility import getRawText setRoles(self.portal, TEST_USER_ID, ['Manager']) self.portal.invokeFactory('Document', 'doc1') doc1 = getattr(self.portal, 'doc1') edit_content( doc1, title='Test Title', text='My <strong>Test</strong> Case') self.assertEqual(getRawText(doc1), 'My <strong>Test</strong> Case') # Search only in SearchableText. parameters = dict( context=doc1, find='<strong>Test</strong>', replaceText='<em>Test</em>', onlySearchableText=True, matchCase=False) results = self.srutil.searchObjects(**parameters) self.assertEqual(len(results), 0) # Search everywhere. parameters['onlySearchableText'] = False results = self.srutil.searchObjects(**parameters) self.assertEqual(len(results), 1) self.assertEqual(getRawText(doc1), 'My <strong>Test</strong> Case') # Replace it. parameters['doReplace'] = True results = self.srutil.searchObjects(**parameters) # Note: replacing returns an int, not a list. self.assertEqual(results, 1) self.assertEqual(getRawText(doc1), 'My <em>Test</em> Case')
def testReplaceTextFieldsButNotTextlineFields(self): from collective.searchandreplace.searchreplaceutility import getRawText registry = getUtility(IRegistry) settings = registry.forInterface(ISearchReplaceSettings, check=False) settings.include_textline_fields = False setRoles(self.portal, TEST_USER_ID, ["Manager"]) # Note: we use our sample type here, which has extra fields. # This currently is Archetypes when testing on Plone 4, # and Dexterity when testing on Plone 5. self.portal.invokeFactory("SampleType", "doc1") doc1 = getattr(self.portal, "doc1") edit_content( doc1, title="Find Title", description="Find Description", rich="Find Rich", plain="Find Plain", line="Find Line", unsearchable="Find Unsearchable", ) # Test the initial values. self.assertEqual(doc1.Title(), "Find Title") self.assertEqual(doc1.Description(), "Find Description") self.assertEqual(getRawText(doc1, "rich"), "Find Rich") self.assertEqual(getRawText(doc1, "plain"), "Find Plain") self.assertEqual(getRawText(doc1, "line"), "Find Line") self.assertEqual(getRawText(doc1, "unsearchable"), "Find Unsearchable") # Search it. parameters = dict(context=doc1, findWhat="Find", matchCase=False) results = self.srutil.findObjects(**parameters) self.assertEqual(len(results), 5) # Nothing should have changed. self.assertEqual(doc1.Title(), "Find Title") self.assertEqual(doc1.Description(), "Find Description") self.assertEqual(getRawText(doc1, "rich"), "Find Rich") self.assertEqual(getRawText(doc1, "plain"), "Find Plain") self.assertEqual(getRawText(doc1, "line"), "Find Line") self.assertEqual(getRawText(doc1, "unsearchable"), "Find Unsearchable") r_parameters = dict(replaceWith="Foo", ) r_parameters.update(parameters) results = self.srutil.replaceAllMatches(**r_parameters) self.assertEqual(results, 5) # Most fields should have changed. self.assertEqual(doc1.Title(), "Foo Title") self.assertEqual(doc1.Description(), "Foo Description") self.assertEqual(getRawText(doc1, "rich"), "Foo Rich") self.assertEqual(getRawText(doc1, "plain"), "Foo Plain") self.assertEqual(getRawText(doc1, "unsearchable"), "Foo Unsearchable") # But not the textline field. self.assertEqual(getRawText(doc1, "line"), "Find Line")
def testReplaceAllTextFields(self): from collective.searchandreplace.searchreplaceutility import getRawText setRoles(self.portal, TEST_USER_ID, ['Manager']) # Note: we use our sample type here, which has extra fields. # This currently is Archetypes when testing on Plone 4, # and Dexterity when testing on Plone 5. self.portal.invokeFactory('SampleType', 'doc1') doc1 = getattr(self.portal, 'doc1') edit_content( doc1, title='Test Title', description='Test Description', rich='Test Rich', plain='Test Plain', line='Test Line', unsearchable='Test Unsearchable', ) # Test the initial values. self.assertEqual(doc1.Title(), 'Test Title') self.assertEqual(doc1.Description(), 'Test Description') self.assertEqual(getRawText(doc1, 'rich'), 'Test Rich') self.assertEqual(getRawText(doc1, 'plain'), 'Test Plain') self.assertEqual(getRawText(doc1, 'line'), 'Test Line') self.assertEqual(getRawText(doc1, 'unsearchable'), 'Test Unsearchable') # Search it. parameters = dict( context=doc1, find='Test', replaceText='Foo', matchCase=False) results = self.srutil.searchObjects(**parameters) self.assertEqual(len(results), 5) # Nothing should have changed. self.assertEqual(doc1.Title(), 'Test Title') self.assertEqual(doc1.Description(), 'Test Description') self.assertEqual(getRawText(doc1, 'rich'), 'Test Rich') self.assertEqual(getRawText(doc1, 'plain'), 'Test Plain') self.assertEqual(getRawText(doc1, 'line'), 'Test Line') self.assertEqual(getRawText(doc1, 'unsearchable'), 'Test Unsearchable') # Replace it. parameters['doReplace'] = True results = self.srutil.searchObjects(**parameters) self.assertEqual(results, 5) # Most fields should have changed. self.assertEqual(doc1.Title(), 'Foo Title') self.assertEqual(doc1.Description(), 'Foo Description') self.assertEqual(getRawText(doc1, 'rich'), 'Foo Rich') self.assertEqual(getRawText(doc1, 'plain'), 'Foo Plain') self.assertEqual(getRawText(doc1, 'unsearchable'), 'Foo Unsearchable') # But not the textline field. self.assertEqual(getRawText(doc1, 'line'), 'Test Line')
def setUp(self): self.portal = self.layer['portal'] self.srutil = getUtility(ISearchReplaceUtility) setRoles(self.portal, TEST_USER_ID, ['Manager']) self.portal.invokeFactory('Document', 'doc1') self.doc1 = getattr(self.portal, 'doc1') edit_content(self.doc1, title='Test test Test test', text='Test test\nTest test')
def setUp(self): self.portal = self.layer["portal"] self.srutil = getUtility(ISearchReplaceUtility) setRoles(self.portal, TEST_USER_ID, ["Manager"]) self.portal.invokeFactory("Document", "doc1") self.doc1 = getattr(self.portal, "doc1") edit_content( self.doc1, title="Find find Find find", text="Find find\nFind find" )
def testReplaceAllTextFields(self): from collective.searchandreplace.searchreplaceutility import getRawText setRoles(self.portal, TEST_USER_ID, ['Manager']) # Note: we use our sample type here, which has extra fields. # This currently is Archetypes when testing on Plone 4, # and Dexterity when testing on Plone 5. self.portal.invokeFactory('SampleType', 'doc1') doc1 = getattr(self.portal, 'doc1') edit_content( doc1, title='Test Title', description='Test Description', rich='Test Rich', plain='Test Plain', line='Test Line', unsearchable='Test Unsearchable', ) # Test the initial values. self.assertEqual(doc1.Title(), 'Test Title') self.assertEqual(doc1.Description(), 'Test Description') self.assertEqual(getRawText(doc1, 'rich'), 'Test Rich') self.assertEqual(getRawText(doc1, 'plain'), 'Test Plain') self.assertEqual(getRawText(doc1, 'line'), 'Test Line') self.assertEqual(getRawText(doc1, 'unsearchable'), 'Test Unsearchable') # Search it. parameters = dict(context=doc1, find='Test', replaceText='Foo', matchCase=False) results = self.srutil.searchObjects(**parameters) self.assertEqual(len(results), 5) # Nothing should have changed. self.assertEqual(doc1.Title(), 'Test Title') self.assertEqual(doc1.Description(), 'Test Description') self.assertEqual(getRawText(doc1, 'rich'), 'Test Rich') self.assertEqual(getRawText(doc1, 'plain'), 'Test Plain') self.assertEqual(getRawText(doc1, 'line'), 'Test Line') self.assertEqual(getRawText(doc1, 'unsearchable'), 'Test Unsearchable') # Replace it. parameters['doReplace'] = True results = self.srutil.searchObjects(**parameters) self.assertEqual(results, 5) # Most fields should have changed. self.assertEqual(doc1.Title(), 'Foo Title') self.assertEqual(doc1.Description(), 'Foo Description') self.assertEqual(getRawText(doc1, 'rich'), 'Foo Rich') self.assertEqual(getRawText(doc1, 'plain'), 'Foo Plain') self.assertEqual(getRawText(doc1, 'unsearchable'), 'Foo Unsearchable') # But not the textline field. self.assertEqual(getRawText(doc1, 'line'), 'Test Line')
def testMatchCase(self): setRoles(self.portal, TEST_USER_ID, ['Manager']) self.portal.invokeFactory('Document', 'doc2') doc2 = getattr(self.portal, 'doc2') edit_content(doc2, title='test title', text='Test Case') results = self.srutil.searchObjects(doc2, 'test case', replaceText='foo', matchCase=True) self.assertEqual(len(results), 0)
def testReplaceUnsearchableTextFields(self): from collective.searchandreplace.searchreplaceutility import getRawText setRoles(self.portal, TEST_USER_ID, ["Manager"]) # Note: we use our sample type here, which has extra fields. # This currently is Archetypes when testing on Plone 4, # and Dexterity when testing on Plone 5. self.portal.invokeFactory("SampleType", "doc1") doc1 = getattr(self.portal, "doc1") edit_content( doc1, title="Find Title", unsearchable="Find Unsearchable", ) # Test the initial values. self.assertEqual(doc1.Title(), "Find Title") self.assertEqual(getRawText(doc1, "unsearchable"), "Find Unsearchable") # Search it with onlySearchableText true. parameters = dict( context=doc1, findWhat="Unsearchable", onlySearchableText=True, matchCase=False, ) results = self.srutil.findObjects(**parameters) self.assertEqual(len(results), 0) # Replace it with onlySearchableText true. r_parameters = dict(replaceWith="Foo", ) r_parameters.update(parameters) results = self.srutil.replaceAllMatches(**r_parameters) self.assertEqual(results, 0) # Nothing should have changed. self.assertEqual(getRawText(doc1, "unsearchable"), "Find Unsearchable") # Now search everything, so onlySearchableText false. parameters["onlySearchableText"] = False results = self.srutil.findObjects(**parameters) self.assertEqual(len(results), 1) # Nothing should have changed. self.assertEqual(getRawText(doc1, "unsearchable"), "Find Unsearchable") # Replace it. r_parameters["onlySearchableText"] = False results = self.srutil.replaceAllMatches(**r_parameters) self.assertEqual(results, 1) self.assertEqual(getRawText(doc1, "unsearchable"), "Find Foo")
def testReplaceUnsearchableTextFields(self): from collective.searchandreplace.searchreplaceutility import getRawText setRoles(self.portal, TEST_USER_ID, ['Manager']) # Note: we use our sample type here, which has extra fields. # This currently is Archetypes when testing on Plone 4, # and Dexterity when testing on Plone 5. self.portal.invokeFactory('SampleType', 'doc1') doc1 = getattr(self.portal, 'doc1') edit_content( doc1, title='Test Title', unsearchable='Test Unsearchable', ) # Test the initial values. self.assertEqual(doc1.Title(), 'Test Title') self.assertEqual(getRawText(doc1, 'unsearchable'), 'Test Unsearchable') # Search it with onlySearchableText true. parameters = dict( context=doc1, find='Unsearchable', replaceText='Foo', onlySearchableText=True, matchCase=False) results = self.srutil.searchObjects(**parameters) self.assertEqual(len(results), 0) # Replace it with onlySearchableText true. parameters['doReplace'] = True results = self.srutil.searchObjects(**parameters) self.assertEqual(results, 0) # Nothing should have changed. self.assertEqual(getRawText(doc1, 'unsearchable'), 'Test Unsearchable') # Now search everything, so onlySearchableText false. parameters['onlySearchableText'] = False parameters['doReplace'] = False results = self.srutil.searchObjects(**parameters) self.assertEqual(len(results), 1) # Nothing should have changed. self.assertEqual(getRawText(doc1, 'unsearchable'), 'Test Unsearchable') # Replace it. parameters['doReplace'] = True results = self.srutil.searchObjects(**parameters) self.assertEqual(results, 1) self.assertEqual(getRawText(doc1, 'unsearchable'), 'Test Foo')
def testReplaceUnsearchableTextFields(self): from collective.searchandreplace.searchreplaceutility import getRawText setRoles(self.portal, TEST_USER_ID, ['Manager']) # Note: we use our sample type here, which has extra fields. # This currently is Archetypes when testing on Plone 4, # and Dexterity when testing on Plone 5. self.portal.invokeFactory('SampleType', 'doc1') doc1 = getattr(self.portal, 'doc1') edit_content( doc1, title='Test Title', unsearchable='Test Unsearchable', ) # Test the initial values. self.assertEqual(doc1.Title(), 'Test Title') self.assertEqual(getRawText(doc1, 'unsearchable'), 'Test Unsearchable') # Search it with onlySearchableText true. parameters = dict(context=doc1, find='Unsearchable', replaceText='Foo', onlySearchableText=True, matchCase=False) results = self.srutil.searchObjects(**parameters) self.assertEqual(len(results), 0) # Replace it with onlySearchableText true. parameters['doReplace'] = True results = self.srutil.searchObjects(**parameters) self.assertEqual(results, 0) # Nothing should have changed. self.assertEqual(getRawText(doc1, 'unsearchable'), 'Test Unsearchable') # Now search everything, so onlySearchableText false. parameters['onlySearchableText'] = False parameters['doReplace'] = False results = self.srutil.searchObjects(**parameters) self.assertEqual(len(results), 1) # Nothing should have changed. self.assertEqual(getRawText(doc1, 'unsearchable'), 'Test Unsearchable') # Replace it. parameters['doReplace'] = True results = self.srutil.searchObjects(**parameters) self.assertEqual(results, 1) self.assertEqual(getRawText(doc1, 'unsearchable'), 'Test Foo')
def setUp(self): self.portal = self.layer["portal"] self.srutil = getUtility(ISearchReplaceUtility) setRoles(self.portal, TEST_USER_ID, ["Manager"]) self.portal.invokeFactory("Document", "doc1") doc1 = getattr(self.portal, "doc1") edit_content(doc1, title="Find Title", description="Find Description", text="Find Case") # when an object has never been saved to repository # any call to save to repository, like in _afterReplace, # triggers a change in the modification date # for this reason, save the document to avoid noise when testing # modification date repository = getToolByName(self.portal, "portal_repository", None) repository.save(doc1)
def testDoNotFindSubject(self): setRoles(self.portal, TEST_USER_ID, ["Manager"]) self.portal.invokeFactory("Document", "doc1") doc1 = getattr(self.portal, "doc1") edit_content(doc1, title="Find Title", subject=("Find subject", "Replace")) self.assertEqual(doc1.Subject(), ("Find subject", "Replace")) # Search it. parameters = dict( context=doc1, findWhat="find subject", matchCase=False, onlySearchableText=True, ) results = self.srutil.findObjects(**parameters) self.assertEqual(len(results), 0)
def testOneMatch(self): setRoles(self.portal, TEST_USER_ID, ["Manager"]) self.portal.invokeFactory("Document", "doc1") doc1 = getattr(self.portal, "doc1") edit_content(doc1, title="Find Title", text="Find Case") self.portal.invokeFactory("Document", "doc2") doc2 = getattr(self.portal, "doc2") edit_content(doc2, title="find title", text="find case") # path1 = '%s' % '/'.join(doc1.getPhysicalPath()) # path2 = '%s' % '/'.join(doc2.getPhysicalPath()) # paths = {path1: {'body': [0]}, path2: {'body': [0]}} results = self.srutil.findObjects( self.portal, "find case", matchCase=True, # occurences=paths ) self.assertEqual(len(results), 1)
def testOneMatch(self): setRoles(self.portal, TEST_USER_ID, ['Manager']) self.portal.invokeFactory('Document', 'doc1') doc1 = getattr(self.portal, 'doc1') edit_content(doc1, title='Test Title', text='Test Case') self.portal.invokeFactory('Document', 'doc2') doc2 = getattr(self.portal, 'doc2') edit_content(doc2, title='test title', text='test case') # path1 = '%s' % '/'.join(doc1.getPhysicalPath()) # path2 = '%s' % '/'.join(doc2.getPhysicalPath()) # paths = {path1: {'body': [0]}, path2: {'body': [0]}} results = self.srutil.searchObjects( self.portal, 'test case', replaceText='foo', matchCase=True, # searchItems=paths ) self.assertEqual(len(results), 1)
def testReplaceOnlyEditableContent(self): # setRoles(self.portal, TEST_USER_ID, ['Manager']) login(self.layer["app"], SITE_OWNER_NAME) # /mainfolder self.portal.invokeFactory("Folder", "mainfolder") mainfolder = getattr(self.portal, "mainfolder") edit_content(mainfolder, title="Find Title") # /mainfolder/maindoc mainfolder.invokeFactory("Document", "maindoc") maindoc = getattr(mainfolder, "maindoc") edit_content(maindoc, title="Find Title") # /mainfolder/subfolder mainfolder.invokeFactory("Folder", "subfolder") subfolder = getattr(mainfolder, "subfolder") edit_content(subfolder, title="Find Title") # /mainfolder/subfolder/subdoc subfolder.invokeFactory("Document", "subdoc") subdoc = getattr(subfolder, "subdoc") edit_content(subdoc, title="Find Title") # Give test user a local Editor role on the sub folder. subfolder.manage_addLocalRoles(TEST_USER_ID, ("Editor", )) self.portal.portal_catalog.reindexObject(mainfolder) self.portal.portal_catalog.reindexObject(maindoc) self.portal.portal_catalog.reindexObject(subfolder) self.portal.portal_catalog.reindexObject(subdoc) # We are logged in as portal owner, so we can edit everything. results = self.srutil.findObjects(mainfolder, "find title", matchCase=False) self.assertEqual(len(results), 4) # Login as the test user again. logout() login(self.portal, TEST_USER_NAME) # Now we can edit less: only the sub folder and sub doc. parameters = dict(context=mainfolder, findWhat="find title", matchCase=False) results = self.srutil.findObjects(**parameters) self.assertEqual(len(results), 2) paths = [x["path"] for x in results] self.assertIn("/".join(subfolder.getPhysicalPath()), paths) self.assertIn("/".join(subdoc.getPhysicalPath()), paths) self.assertNotIn("/".join(mainfolder.getPhysicalPath()), paths) self.assertNotIn("/".join(maindoc.getPhysicalPath()), paths) # Nothing has been changed, because we were only searching. self.assertEqual(mainfolder.Title(), "Find Title") self.assertEqual(maindoc.Title(), "Find Title") self.assertEqual(subfolder.Title(), "Find Title") self.assertEqual(subfolder.Title(), "Find Title") r_parameters = dict(replaceWith="replaced", ) r_parameters.update(parameters) results = self.srutil.replaceAllMatches(**r_parameters) self.assertEqual(results, 2) self.assertEqual(mainfolder.Title(), "Find Title") self.assertEqual(maindoc.Title(), "Find Title") self.assertEqual(subfolder.Title(), "replaced") self.assertEqual(subfolder.Title(), "replaced")
def testReplaceOnlyEditableContent(self): # setRoles(self.portal, TEST_USER_ID, ['Manager']) login(self.layer['app'], SITE_OWNER_NAME) # /mainfolder self.portal.invokeFactory('Folder', 'mainfolder') mainfolder = getattr(self.portal, 'mainfolder') edit_content(mainfolder, title='Test Title') # /mainfolder/maindoc mainfolder.invokeFactory('Document', 'maindoc') maindoc = getattr(mainfolder, 'maindoc') edit_content(maindoc, title='Test Title') # /mainfolder/subfolder mainfolder.invokeFactory('Folder', 'subfolder') subfolder = getattr(mainfolder, 'subfolder') edit_content(subfolder, title='Test Title') # /mainfolder/subfolder/subdoc subfolder.invokeFactory('Document', 'subdoc') subdoc = getattr(subfolder, 'subdoc') edit_content(subdoc, title='Test Title') # Give test user a local Editor role on the sub folder. subfolder.manage_addLocalRoles(TEST_USER_ID, ('Editor', )) self.portal.portal_catalog.reindexObject(mainfolder) self.portal.portal_catalog.reindexObject(maindoc) self.portal.portal_catalog.reindexObject(subfolder) self.portal.portal_catalog.reindexObject(subdoc) # We are logged in as portal owner, so we can edit everything. results = self.srutil.searchObjects(mainfolder, 'test title', replaceText='foo', matchCase=False) self.assertEqual(len(results), 4) # Login as the test user again. logout() login(self.portal, TEST_USER_NAME) # Now we can edit less: only the sub folder and sub doc. parameters = dict(context=mainfolder, find='test title', replaceText='foo', matchCase=False) results = self.srutil.searchObjects(**parameters) self.assertEqual(len(results), 2) paths = [x['path'] for x in results] self.assertIn('/'.join(subfolder.getPhysicalPath()), paths) self.assertIn('/'.join(subdoc.getPhysicalPath()), paths) self.assertNotIn('/'.join(mainfolder.getPhysicalPath()), paths) self.assertNotIn('/'.join(maindoc.getPhysicalPath()), paths) # Nothing has been changed, because we were only searching. self.assertEqual(mainfolder.Title(), 'Test Title') self.assertEqual(maindoc.Title(), 'Test Title') self.assertEqual(subfolder.Title(), 'Test Title') self.assertEqual(subfolder.Title(), 'Test Title') # Now replace instead of only searching. parameters['doReplace'] = True results = self.srutil.searchObjects(**parameters) self.assertEqual(results, 2) self.assertEqual(mainfolder.Title(), 'Test Title') self.assertEqual(maindoc.Title(), 'Test Title') self.assertEqual(subfolder.Title(), 'foo') self.assertEqual(subfolder.Title(), 'foo')
def testReplaceOnlyEditableContent(self): # setRoles(self.portal, TEST_USER_ID, ['Manager']) login(self.layer['app'], SITE_OWNER_NAME) # /mainfolder self.portal.invokeFactory('Folder', 'mainfolder') mainfolder = getattr(self.portal, 'mainfolder') edit_content(mainfolder, title='Test Title') # /mainfolder/maindoc mainfolder.invokeFactory('Document', 'maindoc') maindoc = getattr(mainfolder, 'maindoc') edit_content(maindoc, title='Test Title') # /mainfolder/subfolder mainfolder.invokeFactory('Folder', 'subfolder') subfolder = getattr(mainfolder, 'subfolder') edit_content(subfolder, title='Test Title') # /mainfolder/subfolder/subdoc subfolder.invokeFactory('Document', 'subdoc') subdoc = getattr(subfolder, 'subdoc') edit_content(subdoc, title='Test Title') # Give test user a local Editor role on the sub folder. subfolder.manage_addLocalRoles(TEST_USER_ID, ('Editor',)) self.portal.portal_catalog.reindexObject(mainfolder) self.portal.portal_catalog.reindexObject(maindoc) self.portal.portal_catalog.reindexObject(subfolder) self.portal.portal_catalog.reindexObject(subdoc) # We are logged in as portal owner, so we can edit everything. results = self.srutil.searchObjects( mainfolder, 'test title', replaceText='foo', matchCase=False) self.assertEqual(len(results), 4) # Login as the test user again. logout() login(self.portal, TEST_USER_NAME) # Now we can edit less: only the sub folder and sub doc. parameters = dict( context=mainfolder, find='test title', replaceText='foo', matchCase=False) results = self.srutil.searchObjects(**parameters) self.assertEqual(len(results), 2) paths = [x['path'] for x in results] self.assertIn('/'.join(subfolder.getPhysicalPath()), paths) self.assertIn('/'.join(subdoc.getPhysicalPath()), paths) self.assertNotIn('/'.join(mainfolder.getPhysicalPath()), paths) self.assertNotIn('/'.join(maindoc.getPhysicalPath()), paths) # Nothing has been changed, because we were only searching. self.assertEqual(mainfolder.Title(), 'Test Title') self.assertEqual(maindoc.Title(), 'Test Title') self.assertEqual(subfolder.Title(), 'Test Title') self.assertEqual(subfolder.Title(), 'Test Title') # Now replace instead of only searching. parameters['doReplace'] = True results = self.srutil.searchObjects(**parameters) self.assertEqual(results, 2) self.assertEqual(mainfolder.Title(), 'Test Title') self.assertEqual(maindoc.Title(), 'Test Title') self.assertEqual(subfolder.Title(), 'foo') self.assertEqual(subfolder.Title(), 'foo')