Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable multiple editors - Plone 5.2 #132

Merged
merged 5 commits into from
Nov 26, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ dist
/lib*
.*.swp
pip-selfcheck.json
pyvenv.cfg
210 changes: 0 additions & 210 deletions bootstrap-buildout.py

This file was deleted.

4 changes: 3 additions & 1 deletion buildout.cfg
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
[buildout]
extends = https://raw.githubusercontent.com/collective/buildout.plonetest/master/test-5.1.x.cfg
extends = https://raw.githubusercontent.com/collective/buildout.plonetest/master/test-5.2.x.cfg
package-name = plone.app.z3cform
package-extras = [tests]

[versions]
plone.app.z3cform =
zc.buildout =
plone.app.textfield = 1.3.6
1 change: 1 addition & 0 deletions news/multiple_editors.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Enable multiple wysiwyg editors (use default editor registry setting) [duchenean, gotcha]
6 changes: 6 additions & 0 deletions plone/app/z3cform/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -234,4 +234,10 @@
factory=".factories.Zope2FileUploadStorable"
/>

<utility
component=".widget.tinymce_richtextwidget_render"
provides=".interfaces.IRichTextWidgetInputModeRenderer"
name="tinymce"
/>

</configure>
4 changes: 4 additions & 0 deletions plone/app/z3cform/interfaces.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,7 @@ class ILinkWidget(ITextWidget):

class ISingleCheckBoxBoolWidget(ISingleCheckBoxWidget):
"""Marker interface for the SingleCheckboxBoolWidget."""


class IRichTextWidgetInputModeRenderer(Interface):
"""Marker interface to render multiple wysiwyg editors"""
4 changes: 4 additions & 0 deletions plone/app/z3cform/tests/example.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,3 +84,7 @@ def handleApply(self, action):

class MyMultiFormWrapper(FormWrapper):
form = MyMultiForm


def dummy_richtextwidget_render(widget):
return "<p>dummy</p>"
24 changes: 24 additions & 0 deletions plone/app/z3cform/tests/test_widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -1671,6 +1671,30 @@ def test_dx_tinymcewidget_multiple_mimetypes_edit(self):
)
self.assertTrue('pat-tinymce' not in rendered)

def test_use_default_editor_value(self):
""" Use dummy utility registered in testing.zcml """
if IMarkupSchema:
# if not, don't run this test
self._set_mimetypes(allowed=('text/html',))
registry = getUtility(IRegistry)
from Products.CMFPlone.interfaces import IEditingSchema
proxy = registry.forInterface(IEditingSchema, check=False,
prefix='plone')
proxy.available_editors = [u'dummy', u'TinyMCE']
proxy.default_editor = u'dummy'
from plone.app.z3cform.widget import RichTextWidget
widget = FieldWidget(self.field, RichTextWidget(self.request))
widget.context = self.portal
rendered = widget.render()
self.assertTrue('<p>dummy</p>' in rendered)

proxy.default_editor = u'TinyMCE'
from plone.app.z3cform.widget import RichTextWidget
widget = FieldWidget(self.field, RichTextWidget(self.request))
widget.context = self.portal
rendered = widget.render()
self.assertTrue('pat-tinymce' in rendered)


class LinkWidgetIntegrationTests(unittest.TestCase):

Expand Down
6 changes: 6 additions & 0 deletions plone/app/z3cform/tests/testing.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,10 @@
class=".example.MyMultiFormWrapper"
permission="zope.Public" />

<utility
component=".example.dummy_richtextwidget_render"
provides="..interfaces.IRichTextWidgetInputModeRenderer"
name="dummy"
/>

</configure>
44 changes: 20 additions & 24 deletions plone/app/z3cform/widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,13 @@
from plone.app.z3cform.interfaces import IQueryStringWidget
from plone.app.z3cform.interfaces import IRelatedItemsWidget
from plone.app.z3cform.interfaces import IRichTextWidget
from plone.app.z3cform.interfaces import IRichTextWidgetInputModeRenderer
from plone.app.z3cform.interfaces import ISelectWidget
from plone.app.z3cform.interfaces import ISingleCheckBoxBoolWidget
from plone.app.z3cform.utils import call_callables
from plone.app.z3cform.utils import closest_content
from plone.registry.interfaces import IRegistry
from Products.CMFCore.utils import getToolByName
from Products.CMFPlone.interfaces import IEditingSchema
from Products.CMFPlone.utils import safe_unicode
from six.moves import UserDict
from z3c.form import interfaces as form_ifaces
Expand Down Expand Up @@ -706,23 +706,7 @@ def pattern(self):
"""dynamically grab the actual pattern name so it will
work with custom visual editors"""
if self._pattern is None:
registry = getUtility(IRegistry)
try:
records = registry.forInterface(IEditingSchema, check=False,
prefix='plone')
default = records.default_editor.lower()
available = records.available_editors
except AttributeError:
default = 'tinymce'
available = ['TinyMCE']
tool = getToolByName(self.wrapped_context(), 'portal_membership')
member = tool.getAuthenticatedMember()
editor = member.getProperty('wysiwyg_editor')
if editor in available:
self._pattern = editor.lower()
elif editor in ('None', None):
self._pattern = 'plaintexteditor'
return default
self._pattern = self.getWysiwygEditor()
return self._pattern

def _base_args(self):
Expand Down Expand Up @@ -752,6 +736,22 @@ def render(self):
:rtype: string
"""
if self.mode != 'display':
renderer = queryUtility(
IRichTextWidgetInputModeRenderer,
name=self.getWysiwygEditor(),
default=tinymce_richtextwidget_render
)
return renderer(self)

if not self.value:
return ''

if isinstance(self.value, RichTextValue):
return self.value.output_relative_to(self.context)

return super(RichTextWidget, self).render()

def render_input_mode(self):
# MODE "INPUT"
rendered = ''
allowed_mime_types = self.allowedMimeTypes()
Expand Down Expand Up @@ -814,13 +814,9 @@ def render(self):
)
return rendered

if not self.value:
return ''

if isinstance(self.value, RichTextValue):
return self.value.output_relative_to(self.context)

return super(RichTextWidget, self).render()
def tinymce_richtextwidget_render(widget):
return RichTextWidget.render_input_mode(widget)


@implementer_only(ILinkWidget)
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
zc.buildout==3.0.0b4
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ def read(*rnames):
zip_safe=False,
install_requires=[
'Acquisition',
'plone.app.textfield',
'plone.app.textfield>=1.3.6',
'plone.app.widgets>=2.4.2.dev0',
'plone.protect',
'plone.z3cform>=0.5.11dev',
Expand Down