Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
138
Merge Requests
138
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Jobs
Commits
Open sidebar
nexedi
erp5
Commits
f4a39ef0
Commit
f4a39ef0
authored
Mar 17, 2020
by
Romain Courteaud
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
erp5_hal_json_style: add support for action triggered on a different context
parent
ab41352f
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
723 additions
and
8 deletions
+723
-8
bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py
...rtal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py
+23
-8
bt5/erp5_ui_test/ActionTemplateItem/portal_types/Foo%20Module/other_context_action.xml
...teItem/portal_types/Foo%20Module/other_context_action.xml
+85
-0
bt5/erp5_ui_test/SkinTemplateItem/portal_skins/erp5_ui_test/Base_submitOtherContextDialog.py
...ortal_skins/erp5_ui_test/Base_submitOtherContextDialog.py
+1
-0
bt5/erp5_ui_test/SkinTemplateItem/portal_skins/erp5_ui_test/Base_submitOtherContextDialog.xml
...rtal_skins/erp5_ui_test/Base_submitOtherContextDialog.xml
+62
-0
bt5/erp5_ui_test/SkinTemplateItem/portal_skins/erp5_ui_test/Base_viewOtherContextDialog.xml
...portal_skins/erp5_ui_test/Base_viewOtherContextDialog.xml
+135
-0
bt5/erp5_ui_test/SkinTemplateItem/portal_skins/erp5_ui_test/Base_viewOtherContextDialog/my_title.xml
...ins/erp5_ui_test/Base_viewOtherContextDialog/my_title.xml
+272
-0
bt5/erp5_ui_test/bt/template_action_path_list
bt5/erp5_ui_test/bt/template_action_path_list
+1
-0
bt5/erp5_web_renderjs_ui_test/PathTemplateItem/portal_tests/renderjs_ui_page_templates_zuite/testFormDialogOtherContext.xml
...js_ui_page_templates_zuite/testFormDialogOtherContext.xml
+58
-0
bt5/erp5_web_renderjs_ui_test/PathTemplateItem/portal_tests/renderjs_ui_page_templates_zuite/testFormDialogOtherContext.zpt
...js_ui_page_templates_zuite/testFormDialogOtherContext.zpt
+86
-0
No files found.
bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py
View file @
f4a39ef0
...
...
@@ -344,14 +344,24 @@ def getRealRelativeUrl(document):
return
'/'
.
join
(
portal
.
portal_url
.
getRelativeContentPath
(
document
))
def
parseActionUrl
(
url
):
def
parseActionUrl
(
context_relative_url
,
url
):
"""Parse usual ERP5 Action URL into components: ~root, context~, view_id, param_dict, url.
:param url: {str} is expected to be in form https://<site_root>/context/view_id?optional=params
"""
param_dict
=
{}
url_and_params
=
url
.
split
(
site_root
.
absolute_url
())[
-
1
].
split
(
'?'
)
_
,
script
=
url_and_params
[
0
].
strip
(
"/ "
).
rsplit
(
'/'
,
1
)
url_path
=
url_and_params
[
0
].
strip
(
"/ "
)
other_context
=
None
_
,
script
=
url_path
.
rsplit
(
'/'
,
1
)
if
context_relative_url
is
not
None
:
context_index
=
url_path
.
find
(
context_relative_url
)
if
context_index
>
-
1
:
# Do not forget to remove the '/' after the relative url
url_path
=
url_path
[
context_index
+
len
(
context_relative_url
)
+
1
:]
if
'/'
in
url_path
:
# Check if there is an extra context
other_context
,
script
=
url_path
.
rsplit
(
'/'
,
1
)
if
len
(
url_and_params
)
>
1
:
for
param
in
url_and_params
[
1
].
split
(
'&'
):
param_name
,
param_value
=
param
.
split
(
'='
)
...
...
@@ -373,6 +383,7 @@ def parseActionUrl(url):
param_dict
[
param_name
]
=
param_value
return
{
'view_id'
:
script
,
'other_context'
:
other_context
,
'params'
:
param_dict
,
'url'
:
url
}
...
...
@@ -1326,7 +1337,7 @@ def calculateHateoas(is_portal=None, is_site_root=None, traversed_document=None,
for
view_action
in
erp5_action_dict
[
erp5_action_key
]:
# Try to embed the form in the result
if
(
view
==
view_action
[
'id'
]):
current_action
=
parseActionUrl
(
'%s'
%
view_action
[
'url'
])
# current action/view being rendered
current_action
=
parseActionUrl
(
relative_url
,
'%s'
%
view_action
[
'url'
])
# current action/view being rendered
current_action
[
'category_type'
]
=
erp5_action_key
if
view
and
(
view
!=
'view'
)
and
(
current_action
.
get
(
'view_id'
,
None
)
is
None
):
...
...
@@ -1338,7 +1349,11 @@ def calculateHateoas(is_portal=None, is_site_root=None, traversed_document=None,
# If we have current action definition we are able to render embedded view
# which should be a "ERP5 Form" but in reality can be anything
if
current_action
.
get
(
'view_id'
,
''
):
view_instance
=
getattr
(
traversed_document
,
current_action
[
'view_id'
])
if
current_action
.
get
(
'other_context'
,
None
)
is
None
:
view_context
=
traversed_document
else
:
view_context
=
traversed_document
.
restrictedTraverse
(
current_action
[
'other_context'
])
view_instance
=
getattr
(
view_context
,
current_action
[
'view_id'
])
if
(
view_instance
is
not
None
):
embedded_dict
=
{
'_links'
:
{
...
...
@@ -1359,9 +1374,9 @@ def calculateHateoas(is_portal=None, is_site_root=None, traversed_document=None,
# then we execute it directly
if
"Script"
in
getattr
(
view_instance
,
"meta_type"
,
"Script"
):
if
current_action
.
get
(
'category_type'
,
None
)
==
'object_jio_jump'
:
view_instance
=
getattr
(
traversed_documen
t
,
'Base_viewFakeJumpForm'
)
view_instance
=
getattr
(
view_contex
t
,
'Base_viewFakeJumpForm'
)
else
:
view_instance
=
getattr
(
traversed_documen
t
,
'Base_viewFakePythonScriptActionForm'
)
view_instance
=
getattr
(
view_contex
t
,
'Base_viewFakePythonScriptActionForm'
)
if
view_instance
.
pt
==
"form_dialog"
:
# If there is a "form_id" in the REQUEST then it means that last view was actually a form
...
...
@@ -1372,7 +1387,7 @@ def calculateHateoas(is_portal=None, is_site_root=None, traversed_document=None,
# REQUEST but expect all (formerly) URL query parameters to appear in their **kw
# thus we send extra_param_json (=rjs way of passing parameters to REQUEST) as
# selection_params so they get into callable's **kw.
renderForm
(
traversed_documen
t
,
view_instance
,
embedded_dict
,
renderForm
(
view_contex
t
,
view_instance
,
embedded_dict
,
selection_params
=
extra_param_json
,
extra_param_json
=
extra_param_json
)
if
view_instance
.
pt
in
[
"form_python_action"
,
"form_jump"
]:
...
...
@@ -1384,7 +1399,7 @@ def calculateHateoas(is_portal=None, is_site_root=None, traversed_document=None,
embedded_dict
[
'_actions'
]
=
{
'put'
:
{
"href"
:
url_template_dict
[
"form_action"
]
%
{
"traversed_document_url"
:
site_root
.
absolute_url
()
+
"/"
+
getRealRelativeUrl
(
traversed_documen
t
),
"traversed_document_url"
:
site_root
.
absolute_url
()
+
"/"
+
getRealRelativeUrl
(
view_contex
t
),
"action_id"
:
current_action
[
'view_id'
]
}
},
...
...
bt5/erp5_ui_test/ActionTemplateItem/portal_types/Foo%20Module/other_context_action.xml
0 → 100644
View file @
f4a39ef0
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"ActionInformation"
module=
"Products.CMFCore.ActionInformation"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
categories
</string>
</key>
<value>
<tuple>
<string>
action_type/object_jio_action
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
category
</string>
</key>
<value>
<string>
object_jio_action
</string>
</value>
</item>
<item>
<key>
<string>
condition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
icon
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
other_context_action
</string>
</value>
</item>
<item>
<key>
<string>
permissions
</string>
</key>
<value>
<tuple>
<string>
View
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Action Information
</string>
</value>
</item>
<item>
<key>
<string>
priority
</string>
</key>
<value>
<float>
30.0
</float>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Other Context
</string>
</value>
</item>
<item>
<key>
<string>
visible
</string>
</key>
<value>
<int>
1
</int>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"Expression"
module=
"Products.CMFCore.Expression"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
text
</string>
</key>
<value>
<string>
string:${object_url}/bar_module/Base_viewOtherContextDialog
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_ui_test/SkinTemplateItem/portal_skins/erp5_ui_test/Base_submitOtherContextDialog.py
0 → 100644
View file @
f4a39ef0
return
context
.
Base_redirect
(
'view'
,
keep_items
=
dict
(
portal_status_message
=
context
.
getRelativeUrl
()))
bt5/erp5_ui_test/SkinTemplateItem/portal_skins/erp5_ui_test/Base_submitOtherContextDialog.xml
0 → 100644
View file @
f4a39ef0
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"PythonScript"
module=
"Products.PythonScripts.PythonScript"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
Script_magic
</string>
</key>
<value>
<int>
3
</int>
</value>
</item>
<item>
<key>
<string>
_bind_names
</string>
</key>
<value>
<object>
<klass>
<global
name=
"NameAssignments"
module=
"Shared.DC.Scripts.Bindings"
/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key>
<string>
_asgns
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
name_container
</string>
</key>
<value>
<string>
container
</string>
</value>
</item>
<item>
<key>
<string>
name_context
</string>
</key>
<value>
<string>
context
</string>
</value>
</item>
<item>
<key>
<string>
name_m_self
</string>
</key>
<value>
<string>
script
</string>
</value>
</item>
<item>
<key>
<string>
name_subpath
</string>
</key>
<value>
<string>
traverse_subpath
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
**kw
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
Base_submitOtherContextDialog
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_ui_test/SkinTemplateItem/portal_skins/erp5_ui_test/Base_viewOtherContextDialog.xml
0 → 100644
View file @
f4a39ef0
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"ERP5 Form"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_objects
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
Base_submitOtherContextDialog
</string>
</value>
</item>
<item>
<key>
<string>
action_title
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
edit_order
</string>
</key>
<value>
<list/>
</value>
</item>
<item>
<key>
<string>
encoding
</string>
</key>
<value>
<string>
UTF-8
</string>
</value>
</item>
<item>
<key>
<string>
enctype
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
group_list
</string>
</key>
<value>
<list>
<string>
left
</string>
<string>
right
</string>
<string>
center
</string>
<string>
bottom
</string>
<string>
hidden
</string>
</list>
</value>
</item>
<item>
<key>
<string>
groups
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
bottom
</string>
</key>
<value>
<list/>
</value>
</item>
<item>
<key>
<string>
center
</string>
</key>
<value>
<list/>
</value>
</item>
<item>
<key>
<string>
hidden
</string>
</key>
<value>
<list/>
</value>
</item>
<item>
<key>
<string>
left
</string>
</key>
<value>
<list>
<string>
my_title
</string>
</list>
</value>
</item>
<item>
<key>
<string>
right
</string>
</key>
<value>
<list/>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
Base_viewOtherContextDialog
</string>
</value>
</item>
<item>
<key>
<string>
method
</string>
</key>
<value>
<string>
POST
</string>
</value>
</item>
<item>
<key>
<string>
name
</string>
</key>
<value>
<string>
Base_viewOtherContextDialog
</string>
</value>
</item>
<item>
<key>
<string>
pt
</string>
</key>
<value>
<string>
form_dialog
</string>
</value>
</item>
<item>
<key>
<string>
row_length
</string>
</key>
<value>
<int>
4
</int>
</value>
</item>
<item>
<key>
<string>
stored_encoding
</string>
</key>
<value>
<string>
UTF-8
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Other Context
</string>
</value>
</item>
<item>
<key>
<string>
unicode_mode
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
update_action
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
update_action_title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_ui_test/SkinTemplateItem/portal_skins/erp5_ui_test/Base_viewOtherContextDialog/my_title.xml
0 → 100644
View file @
f4a39ef0
This diff is collapsed.
Click to expand it.
bt5/erp5_ui_test/bt/template_action_path_list
View file @
f4a39ef0
...
...
@@ -16,6 +16,7 @@ Foo Module | do_nothing_report_jio
Foo Module | empty_mass_action
Foo Module | list
Foo Module | list_ui
Foo Module | other_context_action
Foo Module | search
Foo Module | sort_on
Foo Module | view
...
...
bt5/erp5_web_renderjs_ui_test/PathTemplateItem/portal_tests/renderjs_ui_page_templates_zuite/testFormDialogOtherContext.xml
0 → 100644
View file @
f4a39ef0
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"ZopePageTemplate"
module=
"Products.PageTemplates.ZopePageTemplate"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_bind_names
</string>
</key>
<value>
<object>
<klass>
<global
name=
"NameAssignments"
module=
"Shared.DC.Scripts.Bindings"
/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key>
<string>
_asgns
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
name_subpath
</string>
</key>
<value>
<string>
traverse_subpath
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
text/html
</string>
</value>
</item>
<item>
<key>
<string>
expand
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
testFormDialogOtherContext
</string>
</value>
</item>
<item>
<key>
<string>
output_encoding
</string>
</key>
<value>
<string>
utf-8
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<unicode></unicode>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_web_renderjs_ui_test/PathTemplateItem/portal_tests/renderjs_ui_page_templates_zuite/testFormDialogOtherContext.zpt
0 → 100644
View file @
f4a39ef0
<html
xmlns:tal=
"http://xml.zope.org/namespaces/tal"
xmlns:metal=
"http://xml.zope.org/namespaces/metal"
>
<head>
<meta
http-equiv=
"Content-Type"
content=
"text/html; charset=UTF-8"
>
<title>
Test Workflow Transition with Invalid Form
</title>
</head>
<body>
<table
cellpadding=
"1"
cellspacing=
"1"
border=
"1"
>
<thead>
<tr><td
rowspan=
"1"
colspan=
"3"
>
Test dialog with multiple forms
</td></tr>
</thead><tbody>
<tal:block
metal:use-macro=
"here/PTZuite_CommonTemplate/macros/init"
/>
<tr>
<td>
open
</td>
<td>
${base_url}/web_site_module/renderjs_runner/#/foo_module
</td>
<td></td>
</tr>
<tal:block
metal:use-macro=
"here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_app_loaded"
/>
<tal:block
tal:define=
"click_configuration python: {'text': 'Actions'}"
>
<tal:block
metal:use-macro=
"here/Zuite_CommonTemplateForRenderjsUi/macros/click_on_header_link"
/>
</tal:block>
<tal:block
metal:use-macro=
"here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_content_loaded"
/>
<tal:block
tal:define=
"click_configuration python: {'text': 'Other Context'}"
>
<tal:block
metal:use-macro=
"here/Zuite_CommonTemplateForRenderjsUi/macros/click_on_page_link"
/>
</tal:block>
<tal:block
metal:use-macro=
"here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_content_loaded"
/>
<tr>
<td
colspan=
"3"
><b>
Check that the dialog is rendered on the bar module context
</b></td>
</tr>
<tr>
<td>
assertValue
</td>
<td>
field_my_title
</td>
<td>
Bars
</td>
</tr>
<tr>
<td
colspan=
"3"
><b>
But header/panel are on the Foo Module
</b></td>
</tr>
<tr>
<td>
assertTextPresent
</td>
<td>
Foo Module
</td>
<td></td>
</tr>
<tr>
<td>
assertTextNotPresent
</td>
<td>
Bar Module
</td>
<td></td>
</tr>
<tr>
<td>
assertTextPresent
</td>
<td>
Do Nothing Action
</td>
<td></td>
</tr>
<tal:block
metal:use-macro=
"here/Zuite_CommonTemplateForRenderjsUi/macros/submit_dialog"
/>
<tal:block
tal:define=
"notification_configuration python: {'class': 'success',
'text': 'bar_module'}"
>
<tal:block
metal:use-macro=
"here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_notification"
/>
</tal:block>
<tal:block
metal:use-macro=
"here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_content_loaded"
/>
<tr>
<td
colspan=
"3"
><b>
Redireted to Bar Module
</b></td>
</tr>
<tr>
<td>
assertTextNotPresent
</td>
<td>
Foo Module
</td>
<td></td>
</tr>
<tr>
<td>
assertTextPresent
</td>
<td>
Bar Module
</td>
<td></td>
</tr>
<tr>
<td>
assertTextNotPresent
</td>
<td>
Do Nothing Action
</td>
<td></td>
</tr>
</tbody></table>
</body>
</html>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment