def _setTextField(self, obj, fieldname, text): obj_base = aq_base(obj) if getattr(obj_base, 'Schema', None): # Archetypes field = obj_base.getField(fieldname) if field is None: logger.warn('Field %s not found for %s', fieldname, obj.getId()) return field.set(obj, text) else: # Dexterity field = self._getField(obj_base, fieldname) if field is None: logger.warn('Field %s not found for %s', fieldname, obj.getId()) return if IRichText.providedBy(field): # Get mimetype from old value. old = field.get(obj) if old is None: text = RichTextValue(text) else: text = RichTextValue( text, old.mimeType, old.outputMimeType) field.set(obj, text)
def setTextField(obj, fieldname, text): text = six.text_type(text) obj_base = aq_base(obj) if getattr(obj_base, "Schema", None): # Archetypes field = obj_base.getField(fieldname) if field is None: logger.warn("Field %s not found for %s", fieldname, obj.getId()) return field.set(obj, text) else: # Dexterity field = getField(obj_base, fieldname) if field is None: logger.warn("Field %s not found for %s", fieldname, obj.getId()) return if IRichText.providedBy(field): # Get mimetype from old value. old = field.get(obj) if old is None: text = RichTextValue(text) else: text = RichTextValue(text, old.mimeType, old.outputMimeType) if ITuple.providedBy(field) and ITextLine.providedBy(field.value_type): text = tuple(text.split("\n")) setattr(field.interface(obj), field.__name__, text)
def test_richtextvalue_output_relative_to(self): if HAS_RICH_TEXT_VALUE: value = RichTextValue( raw='<p>Hello World</p>', mimeType='text/html', outputMimeType='text/html', encoding='utf-8' ) alsoProvides(self.layer['request'], IThemingLayer) adapter = getMultiAdapter((value, self.layer['request']), name='output_relative_to') self.assertEqual( value.output_relative_to(self.layer['portal']), adapter(self.layer['portal']) )
def setUp(self): self.portal = self.layer["portal"] self.request = self.layer["request"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) self.channel = api.content.create( container=self.portal, type='Channel', title=u'Example channel', is_subscribable=True, ) self.message = api.content.create( container=self.channel, type='Message', title=u'Newsletter Foo vol. 1', text=RichTextValue(u'This is the first message'), ) api.content.transition(obj=self.message, transition='publish') self.adapter = getMultiAdapter( (self.channel, self.request), IChannelSender ) api.portal.set_registry_record( 'queue_endpoint', QUEUE_URL, interface=INewsletterPluginFlaskSettings, )
def test_existing_content_tile_show_title(self): """ """ page_id = self.portal.invokeFactory('Document', 'an-another-page', title=u'An another page', description=u'A description', text=u'Hello World!') self.portal[page_id].text = RichTextValue(u'Hello World!') page_uuid = IUUID(self.portal[page_id]) transaction.commit() self.unprivileged_browser.open( self.portalURL + '/@@plone.app.standardtiles.existingcontent/unique?content_uid=' + page_uuid + '&show_title=True') self.assertIn(u'An another page', self.unprivileged_browser.contents) self.unprivileged_browser.open( self.portalURL + '/@@plone.app.standardtiles.existingcontent/unique?content_uid=' + page_uuid) self.assertNotIn(u'An another page', self.unprivileged_browser.contents)
def testNewsItemCreate(self): self.folder.invokeFactory('News Item', id='newsitem', text=RichTextValue(u'data'), title='Foo') self.assertEqual(self.folder.newsitem.text.raw, 'data') self.assertEqual(self.folder.newsitem.Title(), 'Foo')
def test_portlet_text(self): renderer = self.renderer( assignment=existing_content_portlet.Assignment( content_uid=self.doc.UID(), show_text=True, ), ) self.assertEqual( renderer.text, self.doc.text, ) self.doc.text = RichTextValue( '<p>lorem ipsum dolor ...</p>', mimeType='text/html', outputMimeType='text/x-html-safe', ) self.doc.reindexObject() renderer = self.renderer(assignment=renderer.data) self.assertEqual( renderer.text, self.doc.text.output, )
def test_mailonly_filter_in_issue_public_view(self): self.issue = api.content.create( type="Newsletter Issue", id="issue", title="Issue 1", container=self.newsletter, ) self.issue.title = "Test Newsletter Issue" body = ( '<h1>This is the newsletter body!</h1><div class="mailonly">' "This test should only visible in mails not in public view!</div>") self.issue.text = RichTextValue( raw=body, mimeType="text/html", outputMimeType="text/x-plone-outputfilters-html", encoding="utf-8", ) self.issue.prologue = self.default_prologue self.issue.epilogue = self.default_epilogue self.issue.output_template = "output_default" zt.commit() view = getMultiAdapter((self.issue, self.portal.REQUEST), name="get-public-body") view_result = view() self.assertTrue( "mailonly" not in safe_unicode(view_result), "get-public-body view contains mailonly elements," " this should filtert out!", )
def add_textarea_to_page(portal): setSite(portal) content_page = create(Builder('sl content page').titled(u'contentpage')) textarea_having_link = create( Builder('sl textblock').within(content_page).having( text=RichTextValue('...')).titled('textarea')) return textarea_having_link
def test_existing_content_tile_private(self): """When the current user does not have enough permissions to view the content linked to existing content tile, the tile renders empty""" self.portal.portal_workflow.setDefaultChain( 'simple_publication_workflow') page_id = self.portal.invokeFactory('Document', 'an-another-page', title=u'An another page', description=u'A description', text=u'Hello World!') self.portal[page_id].text = RichTextValue(u'Hello World!') page_uuid = IUUID(self.portal[page_id]) transaction.commit() browser = Browser(self.layer['app']) browser.handleErrors = False browser.open( self.portalURL + '/@@plone.app.standardtiles.existingcontent/unique?content_uid=' + page_uuid) self.assertNotIn(u'Hello World!', browser.contents) self.assertIn(u'<body></body>', browser.contents)
def send_sample_message(self, body): self.assertSequenceEqual(self.mailhost.messages, []) self.issue = api.content.create( type="Newsletter Issue", id="issue", title="with image", container=self.newsletter, ) self.issue.text = RichTextValue( raw=body, mimeType="text/html", outputMimeType="text/x-plone-outputfilters-html", ) self.issue.prologue = self.default_prologue self.issue.epilogue = self.default_epilogue self.issue.output_template = "output_default" self.portal.REQUEST.form.update({ "sender_name": self.newsletter.sender_name, "sender_email": self.newsletter.sender_email, "test_receiver": self.newsletter.test_email, "subject": self.issue.title, "test": "submit", }) self.portal.REQUEST["REQUEST_METHOD"] = "POST" zt.commit() view = getMultiAdapter((self.issue, self.portal.REQUEST), name="send-issue") view() self.assertEqual(len(self.mailhost.messages), 1) self.assertTrue(self.mailhost.messages[0]) return safe_unicode(self.mailhost.messages[0])
def get_text(self, department, mode="raw"): """Returns the text saved for the selected department """ row = self.context.getResultsInterpretationByDepartment(department) rt = RichTextValue(row.get("richtext", ""), "text/plain", "text/html") if mode == "output": return rt.output return rt.raw
def __call__(self): text = self.render_aggregation_sources() self.context.text = RichTextValue( raw=text, mimeType="text/html", outputMimeType="text/html", ) return self.request.response.redirect(self.context.absolute_url(), status=301)
def _set_text(self, obj, text): if IDexterityContent.providedBy(obj): # Dexterity obj.text = RichTextValue(text) else: # Archetypes obj.setText(text, mimetype='text/html') modified(obj)
def test_remove_cleans_ref_catalog(self): doc1 = self.portal['doc1'] doc1.text = RichTextValue('<a href="doc1">doc1</a>') modified(doc1) ref_catalog = self.portal.reference_catalog self.assertEquals(1, len(ref_catalog())) self.portal.manage_delObjects(['doc1']) self.assertEquals(0, len(ref_catalog()))
def setUp(self): self.portal = self.layer['portal'] setRoles(self.portal, TEST_USER_ID, ['Manager']) self.portal.invokeFactory('Document', 'doc1') self.doc1 = getattr(self.portal, 'doc1') self.doc1.setTitle("Ploneは素晴らしい。") text = "このページは予想している通り、テストです。 Pages Testing." self.doc1.text = RichTextValue(text, 'text/html', 'text/x-html-safe') self.doc1.reindexObject()
def getText(self, department, mode='raw'): """ Returns the text saved for the selected department. """ row = self.context.getResultsInterpretationByDepartment(department) rt = RichTextValue(row.get('richtext', ''), 'text/plain', 'text/html') if mode == 'output': return rt.output else: return rt.raw
def setUp(self): self.mail_settings = get_portal_mail_settings() self.portal = self.layer["portal"] self.request = self.layer["request"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) login(self.portal, TEST_USER_NAME) self.portal.invokeFactory("Folder", "test-folder") self.folder = self.portal["test-folder"] self.portal = self.layer["portal"] self.folder.invokeFactory("Newsletter", "newsletter") self.newsletter = self.folder.newsletter self.newsletter.sender_email = "*****@*****.**" self.newsletter.sender_name = "ACME newsletter" self.newsletter.test_email = "*****@*****.**" prologue_output = self.newsletter.default_prologue.output self.default_prologue = RichTextValue( raw=prologue_output, mimeType="text/html", outputMimeType="text/x-plone-outputfilters-html", ) epilogue_output = self.newsletter.default_epilogue.output self.default_epilogue = RichTextValue( raw=epilogue_output, mimeType="text/html", outputMimeType="text/x-plone-outputfilters-html", ) # Set up a mock mailhost self.portal._original_MailHost = self.portal.MailHost self.portal.MailHost = mailhost = MockMailHost("MailHost") sm = getSiteManager(context=self.portal) sm.unregisterUtility(provided=IMailHost) sm.registerUtility(mailhost, provided=IMailHost) # We need to fake a valid mail setup # self.mail_settings.email_from_address = u'*****@*****.**' self.mailhost = self.portal.MailHost # image for image testing self.folder.invokeFactory("Image", "image") self.image = self.folder.image image = self.folder["image"] image.title = "My Image" image.description = "This is my image." image.image = dummy_image(image) self.image = image
def afterSetUp(self): super(TestRenderBody, self).afterSetUp() self.folder.invokeFactory('News Item', 'news1') self.folder.invokeFactory('News Item', 'news2') self.news1 = self.folder.news1 self.news1.setTitle('News 1') self.news1.setDescription('The news item #1') self.news1.text = RichTextValue(BODY_TEXT, 'text/html', 'text/html') self.news2 = self.folder.news2 self.news2.setTitle('News 2') self.news2.text = RichTextValue(ROOTED_BODY_TEXT, 'text/html', 'text/html') # Enable syndication on folder registry = getUtility(IRegistry) self.site_settings = registry.forInterface(ISiteSyndicationSettings) settings = IFeedSettings(self.folder) settings.enabled = True settings.render_body = True self.folder_settings = settings
def afterSetUp(self): self.syndication = getToolByName(self.portal, 'portal_syndication') self.folder.invokeFactory('Document', 'doc') self.folder.invokeFactory('Document', 'doc1') self.folder.invokeFactory('News Item', 'news1') self.folder.invokeFactory('News Item', 'news2') self.folder.invokeFactory('File', 'file') self.doc1 = self.folder.doc1 self.news1 = self.folder.news1 self.news1.text = RichTextValue(BODY_TEXT, 'text/html', 'text/html') self.news2 = self.folder.news2 self.news2.text = RichTextValue(ROOTED_BODY_TEXT, 'text/html', 'text/html') self.file = self.folder.file # Enable syndication on folder registry = getUtility(IRegistry) self.site_settings = registry.forInterface(ISiteSyndicationSettings) settings = IFeedSettings(self.folder) settings.enabled = True self.folder_settings = settings
def test_edit_existing_content_tile(self): """The existing content tile takes the uuid of a content object in the site and displays the result of calling its default view's content-core macro """ page_id = self.portal.invokeFactory('Document', 'an-another-page') page = self.portal[page_id] page_uuid = IUUID(page) page.text = RichTextValue(u'Hello World!') transaction.commit() self.browser.open( '{}/@@edit-tile/plone.app.standardtiles.existingcontent/unique'. format(page.absolute_url())) self.browser.getControl( name='plone.app.standardtiles.existingcontent.content_uid' ).value = page_uuid self.browser.getControl(name='buttons.save').click() self.assertIn(u'not select the same content', self.browser.contents) page2_id = self.portal.invokeFactory('Document', 'an-another-page-2', title=u'An another page', description=u'A description', text=u'Hello World!') page2 = self.portal[page2_id] page2_uuid = IUUID(page2) page2.text = RichTextValue(u'Hello World!') transaction.commit() self.browser.getControl( name='plone.app.standardtiles.existingcontent.content_uid' ).value = page2_uuid self.browser.getControl(name='buttons.save').click() self.assertIn(u'Hello World!', self.browser.contents)
def setup_acessibilidade(self): with api.env.adopt_roles(['Manager', 'Reviewer']): pasta = api.content.create(type='Folder', id='acessibilidade', title='Pasta de Acessibilidade', description='Acessibilidade no Portal', container=self.portal) acessibilidade = api.content.create( type='Document', id='acessibilidade', title='Documento de Acessibilidade', description='Acessibilidade no Brasil', container=pasta) acessibilidade.text = RichTextValue(u'Homenagem à @garotadpi') return acessibilidade
def test_slider_pane_with_title_and_with_text(self, browser): """ This test makes sure that a slider pane configured to show the title and having some text will render both the title and the text. """ container = create( Builder('slider container').titled(u'Slider Container')) create( Builder('slider pane').titled(u'The title of the pane').having( text=RichTextValue('The text of the pane')).having( show_title=True).with_dummy_image().within(container)) browser.visit(container, view='slider_view') self.assertEqual(['The title of the pane The text of the pane'], browser.css('.sliderPane').text)
def test_slider_pane_with_text_does_only_render_the_text(self, browser): """ This test makes sure that a slider pane having some text will really render the text. """ container = create( Builder('slider container').titled(u'Slider Container')) create( Builder('slider pane').titled(u'The title of the pane').having( text=RichTextValue('The text of the pane')).with_dummy_image(). within(container)) browser.visit(container, view='slider_view') self.assertEqual(['The text of the pane'], browser.css('.sliderPane').text)
def __call__(self): text = self.render_aggregation_sources() self.context.text = RichTextValue( raw=text, mimeType="text/html", outputMimeType="text/html", ) api.portal.show_message( message=_("Newsletter content successfully aggregated."), request=self.request, type="info", ) self.request.response.setHeader("Pragma", "no-cache") self.request.response.setHeader("Cache-Control", "no-cache") return self.request.response.redirect(self.context.absolute_url(), status=301)
def reset_datagridfields(context, logger=None): """Reset some data grid fields to empty rich text fields. Some data grid fields were replaced by a rich text field showing new contained objects. """ if logger is None: # Called as upgrade step: define our own logger. logger = logging.getLogger('uwosh.oie.studyabroadstudent') catalog = api.portal.get_tool('portal_catalog') brains = catalog(portal_type='OIEStudyAbroadProgram') count = 0 for brain in brains: obj = brain.getObject() if not isinstance(obj.courses, RichText): obj.courses = \ RichTextValue(raw='<em>There are currently no courses</em>') if (getattr(obj.add_course_link, 'raw', None) and len(obj.add_course_link.raw) == 0) or \ (not getattr(obj.add_course_link, 'raw', None) and len(obj.add_course_link) == 0): obj.add_course_link = \ RichTextValue( raw='<em>You can add courses after saving this program</em>', # noqa ) if not isinstance(obj.health_safety_security_documents, RichText): obj.health_safety_security_documents = \ RichTextValue( raw='<em>There are currently no documents</em>', ) if (getattr(obj.add_health_document_link, 'raw', None) and len(obj.add_health_document_link.raw) == 0) or \ (not getattr(obj.add_health_document_link, 'raw', None) and len(obj.add_health_document_link) == 0): obj.add_health_document_link = \ RichTextValue( raw='<em>You can add health documents after saving this program</em>', # noqa ) if not isinstance(obj.travelDatesTransitionsAndDestinations, RichText): obj.travelDatesTransitionsAndDestinations = \ RichTextValue( raw='<em>There are currently no transitions</em>', ) if (getattr(obj.add_transition_link, 'raw', None) and len(obj.add_transition_link.raw) == 0) or \ (not getattr(obj.add_transition_link, 'raw', None) and len(obj.add_transition_link) == 0): obj.add_transition_link = \ RichTextValue( raw='<em>You can add transitions after saving this program</em>', # noqa ) logger.info('updated rich text fields for {0}'.format(obj.title)) count += 1 logger.info('{0} items migrated'.format(count))
def upgrade_3(context): pages = plone.api.portal.get_tool('portal_catalog')(portal_type='Document') for page in pages: changed = False page = page.getObject() if page.text: soup = BeautifulSoup(page.text.raw, 'html.parser') for elem in soup.find_all('img'): src = elem.attrs.get('src') if '@@latex' in src: elem.attrs['data-mce-object'] = 'latex' changed = True if changed: page.text = RichTextValue( str(soup), mimeType=page.text.mimeType, outputMimeType=page.text.outputMimeType)
def test_rename_updates_ref_catalog(self): doc1 = self.portal['doc1'] doc2 = self.portal['doc2'] ref_catalog = self.portal.reference_catalog doc1.text = RichTextValue('<a href="doc2">doc2</a>') modified(doc1) self.assertEquals(1, len(ref_catalog())) self.assertEquals([doc2], IReferenceable(doc1).getReferences()) ref_brain = ref_catalog()[0] self.assertTrue(ref_brain.getPath().startswith('doc1')) self.portal.manage_renameObject(id='doc1', new_id='new_name') modified(doc1) self.assertEquals(1, len(ref_catalog())) ref_brain = ref_catalog()[0] self.assertTrue(ref_brain.getPath().startswith('new_name')) self.assertEquals([doc2], IReferenceable(doc1).getReferences())
def test_permission(self): setRoles(self.portal, TEST_USER_ID, ["Editor"]) self.portal.REQUEST.set("ACTUAL_URL", "http://nohost") self.issue = api.content.create( type="Newsletter Issue", id="issue", title=u"Issue 1", container=self.newsletter, ) self.issue.title = "Test Newsletter Issue" body = "<h1>This is the newsletter body!" self.issue.text = RichTextValue( raw=body, mimeType="text/html", outputMimeType="text/x-plone-outputfilters-html", encoding="utf-8", ) self.issue.prologue = self.default_prologue self.issue.epilogue = self.default_epilogue self.issue.output_template = "output_default" view = getMultiAdapter( (self.newsletter, self.portal.REQUEST), name="newsletter-drafts" ) view_result = view() self.assertIn("test-folder/newsletter/issue", view_result) view = self.newsletter.restrictedTraverse("issue/send-issue-form") view_result = view() self.assertIn("Test Newsletter", view_result) # Editor is not allowed to call the one-step send-issue meant for cron # XXX # with self.assertRaises(Unauthorized): # self.newsletter.restrictedTraverse("issue/send-issue-immediately") # check for postonly view = self.newsletter.restrictedTraverse("issue/send-issue") with self.assertRaises(Forbidden): view()
def test_portlet_rendering(self): self.doc.description = 'a description' self.doc.text = RichTextValue( '<p>lorem ipsum dolor ...</p>', mimeType='text/html', outputMimeType='text/x-html-safe', ) self.doc.reindexObject() renderer = self.renderer( assignment=existing_content_portlet.Assignment( content_uid=self.doc.UID(), show_title=True, show_description=True, show_text=True, ), ) renderer_output = renderer.render() self.assertIn(self.doc.title, renderer_output) self.assertIn(self.doc.description, renderer_output) self.assertIn(self.doc.text.output, renderer_output)
def setUpPloneSite(self, portal): # Install into Plone site using portal_setup if 'Document' not in portal.portal_types: applyProfile(portal, 'plone.app.contenttypes:default') setRoles(portal, TEST_USER_ID, ['Manager']) login(portal, TEST_USER_NAME) for i in range(0, 12): portal.invokeFactory( 'Document', 'my-page' + str(i), text=RichTextValue(u'spam spam ham eggs', 'text/html', 'text/x-html-safe'), ) # Sleep before creating the next one, otherwise ordering by date is # not deterministic. time.sleep(0.1) setRoles(portal, TEST_USER_ID, ['Member']) # Commit so that the test browser sees these objects import transaction transaction.commit()