workflows: use a rich text widget to configure display message action (#27993) #797

Merged
fpeters merged 1 commits from wip/27993-display-message-rich-text into main 2024-01-26 08:46:57 +01:00
3 changed files with 36 additions and 3 deletions

View File

@ -3,7 +3,8 @@ from quixote import cleanup
from wcs.workflows import Workflow
from ..utilities import clean_temporary_pub, create_temporary_pub
from ..admin_pages.test_all import create_superuser
from ..utilities import clean_temporary_pub, create_temporary_pub, get_app, login
def setup_module(module):
@ -42,3 +43,22 @@ def test_display_message_migrate(pub):
workflow.migrate()
assert not workflow.possible_status[0].items[0].level
assert workflow.possible_status[0].items[0].message == '<div class="errornotice blah">message</div>'
def test_display_message_rich_text(pub):
create_superuser(pub)
workflow = Workflow(name='display message to')
st1 = workflow.add_status('Status1', 'st1')
display_message = st1.add_action('displaymsg')
display_message.message = '<p>hello world</p>'
workflow.store()
app = login(get_app(pub))
resp = app.get(display_message.get_admin_url())
assert resp.pyquery('textarea[data-godo-schema]') # godo
display_message.message = '<table><tr><td>hello world</td></tr></table>'
workflow.store()
resp = app.get(display_message.get_admin_url())
assert resp.pyquery('textarea[data-config]') # ckeditor

View File

@ -3962,3 +3962,11 @@ class DjangoConditionWidget(StringWidget):
Condition({'type': 'django', 'value': self.value}).validate()
except ValidationError as e:
self.set_error(str(e))
def get_rich_text_widget_class(content):
# use godo.js if all tags in existing content are supported
tags = set(re.findall(r'<([a-z]+)[\s>]', content or ''))
if tags.issubset(set(RichTextWidget.ALL_TAGS)):
return RichTextWidget
return WysiwygTextWidget
Review

L'existant permet d'écrire manuellement du balisage HTML, pour ne pas le perdre on envoie sur RichTextWidget (godo) uniquement si le on est uniquement sur les balises acceptées/gérées, sinon ça va vers WysiwygTextWidget (ckeditor).

Il sera peut-être opportun un jour de déprécier la possibilité de n'importe quelle balise mais je préfère ne pas mêler ça maintenant.

L'existant permet d'écrire manuellement du balisage HTML, pour ne pas le perdre on envoie sur RichTextWidget (godo) uniquement si le on est uniquement sur les balises acceptées/gérées, sinon ça va vers WysiwygTextWidget (ckeditor). Il sera peut-être opportun un jour de déprécier la possibilité de n'importe quelle balise mais je préfère ne pas mêler ça maintenant.

View File

@ -21,7 +21,12 @@ from quixote import get_publisher
from quixote.html import htmltext
from wcs.qommon import _, ezt, misc
from wcs.qommon.form import ComputedExpressionWidget, SingleSelectWidget, TextWidget, WidgetListOfRoles
from wcs.qommon.form import (
ComputedExpressionWidget,
SingleSelectWidget,
WidgetListOfRoles,
get_rich_text_widget_class,
)
from wcs.qommon.template import Template
from wcs.workflows import WorkflowGlobalAction, WorkflowStatusItem, register_item_class
@ -107,7 +112,7 @@ class DisplayMessageWorkflowStatusItem(WorkflowStatusItem):
in_global_action = isinstance(self.parent, WorkflowGlobalAction)
if 'message' in parameters:
form.add(
TextWidget,
get_rich_text_widget_class(self.message),
'%smessage' % prefix,
title=_('Message'),
value=self.message,