Skip to content

Commit

Permalink
Merge pull request #132 from gotcha/ckeditor_3.2
Browse files Browse the repository at this point in the history
Enable multiple editors - Plone 5.2
  • Loading branch information
mauritsvanrees authored Nov 26, 2021
2 parents a6d5794 + c403ace commit 07c3bcc
Show file tree
Hide file tree
Showing 12 changed files with 71 additions and 236 deletions.
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

0 comments on commit 07c3bcc

Please sign in to comment.