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
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
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
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Leo Le Bouter
erp5
Commits
275758e6
Commit
275758e6
authored
Apr 19, 2018
by
Tomáš Peterka
Committed by
Tomáš Peterka
Apr 20, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[hal_json] Render messages alongside with Forms
parent
6352d285
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
134 additions
and
36 deletions
+134
-36
bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_restricted_style/ERP5Document_getHateoas.py
...erp5_hal_json_restricted_style/ERP5Document_getHateoas.py
+3
-1
bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_restricted_style/ERP5Document_getHateoas.xml
...rp5_hal_json_restricted_style/ERP5Document_getHateoas.xml
+1
-1
bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_renderForm.py
...eItem/portal_skins/erp5_hal_json_style/Base_renderForm.py
+23
-1
bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_renderForm.xml
...Item/portal_skins/erp5_hal_json_style/Base_renderForm.xml
+1
-1
bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py
...rtal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py
+57
-30
bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.xml
...tal_skins/erp5_hal_json_style/ERP5Document_getHateoas.xml
+1
-1
bt5/erp5_hal_json_style/TestTemplateItem/portal_components/test.erp5.testHalJsonStyle.py
...plateItem/portal_components/test.erp5.testHalJsonStyle.py
+22
-0
product/ERP5/bootstrap/erp5_xhtml_style/SkinTemplateItem/portal_skins/erp5_xhtml_style/Base_renderForm.py
...lateItem/portal_skins/erp5_xhtml_style/Base_renderForm.py
+25
-0
product/ERP5/bootstrap/erp5_xhtml_style/SkinTemplateItem/portal_skins/erp5_xhtml_style/Base_renderForm.xml
...ateItem/portal_skins/erp5_xhtml_style/Base_renderForm.xml
+1
-1
No files found.
bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_restricted_style/ERP5Document_getHateoas.py
View file @
275758e6
...
...
@@ -24,6 +24,8 @@ return context.ERP5Document_getHateoas(
sort_on
=
sort_on
,
local_roles
=
local_roles
,
selection_domain
=
selection_domain
,
restricted
=
1
,
extra_param_json
=
extra_param_json
,
restricted
=
1
portal_status_message
=
portal_status_message
,
portal_status_level
=
portal_status_level
)
bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_restricted_style/ERP5Document_getHateoas.xml
View file @
275758e6
...
...
@@ -50,7 +50,7 @@
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
REQUEST=None, response=None, view=None, mode=\'root\', query=None, select_list=None, limit=10, local_roles=None, form=None, relative_url=None, list_method=None, default_param_json=None, form_relative_url=None, bulk_list="[]", sort_on=None, selection_domain=None, extra_param_json=None
</string>
</value>
<value>
<string>
REQUEST=None, response=None, view=None, mode=\'root\', query=None, select_list=None, limit=10, local_roles=None, form=None, relative_url=None, list_method=None, default_param_json=None, form_relative_url=None, bulk_list="[]", sort_on=None, selection_domain=None, extra_param_json=None
, portal_status_message=\'\', portal_status_level=None
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
...
...
bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_renderForm.py
View file @
275758e6
"""Render form while keeping its values back to user.
This script differs from Base_redirect that it keeps the form values in place.
:param message: {str} message to be displayed at the user
:param level: {str|int} severity of the message using ERP5Type.Log levels or their names like 'info', 'warn', 'error'
:param keep_items: {dict} items to be available in the next call. They will be either added as hidden fields to the
rendered form or in case of "portal_status_message" just displayed to the user
:param REQUEST: request
:param **kwargs: should contain parameters to ERP5Document_getHateoas such as 'query' to replace Selections
"""
keep_items
=
keep_items
or
{}
form
=
getattr
(
context
,
form_id
)
return
context
.
ERP5Document_getHateoas
(
form
=
form
,
mode
=
'form'
)
if
not
message
and
"portal_status_message"
in
keep_items
:
message
=
keep_items
.
pop
(
"portal_status_message"
)
if
not
level
and
"portal_status_level"
in
keep_items
:
level
=
keep_items
.
pop
(
"portal_status_level"
)
return
context
.
ERP5Document_getHateoas
(
form
=
form
,
mode
=
'form'
,
REQUEST
=
REQUEST
,
extra_param_json
=
keep_items
,
portal_status_message
=
message
,
portal_status_level
=
level
,
**
kwargs
)
bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_renderForm.xml
View file @
275758e6
...
...
@@ -50,7 +50,7 @@
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
form_id
</string>
</value>
<value>
<string>
form_id
, message=\'\', level=None, keep_items=None, REQUEST=None, **kwargs
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
...
...
bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py
View file @
275758e6
...
...
@@ -41,10 +41,10 @@ import time
from
email.Utils
import
formatdate
import
re
from
zExceptions
import
Unauthorized
from
Products.ERP5Type.
Utils
import
UpperCase
from
Products.ERP5Type.
Log
import
log
,
DEBUG
,
INFO
,
WARNING
,
ERROR
from
Products.ERP5Type.Message
import
Message
from
Products.ERP5Type.Utils
import
UpperCase
from
Products.ZSQLCatalog.SQLCatalog
import
Query
,
ComplexQuery
from
Products.ERP5Type.Log
import
log
from
collections
import
OrderedDict
from
urlparse
import
urlparse
...
...
@@ -1190,33 +1190,22 @@ def renderFormDefinition(form, response_dict):
response_dict
[
"action"
]
=
form
.
action
response_dict
[
"update_action"
]
=
form
.
update_action
mime_type
=
'application/hal+json'
portal
=
context
.
getPortalObject
()
sql_catalog
=
portal
.
portal_catalog
.
getSQLCatalog
()
# Calculate the site root to prevent unexpected browsing
is_web_mode
=
(
context
.
REQUEST
.
get
(
'current_web_section'
,
None
)
is
not
None
)
or
(
hasattr
(
context
,
'isWebMode'
)
and
context
.
isWebMode
())
# is_web_mode = traversed_document.isWebMode()
if
is_web_mode
:
site_root
=
context
.
getWebSectionValue
()
view_action_type
=
site_root
.
getLayoutProperty
(
"configuration_view_action_category"
,
default
=
'object_view'
)
else
:
site_root
=
portal
view_action_type
=
"object_view"
context
.
Base_prepareCorsResponse
(
RESPONSE
=
response
)
# Check if traversed_document is the site_root
if
relative_url
:
temp_traversed_document
=
site_root
.
restrictedTraverse
(
relative_url
,
None
)
if
(
temp_traversed_document
is
None
):
response
.
setStatus
(
404
)
return
""
else
:
temp_traversed_document
=
context
def
statusLevelToString
(
level
):
"""Transform any level format to lowercase string representation"""
if
isinstance
(
level
,
(
str
,
unicode
)):
if
level
.
lower
()
==
"error"
:
return
"error"
elif
level
.
lower
().
startswith
(
"warn"
):
return
"error"
# we might want to add another level for warning
else
:
return
"success"
if
level
==
ERROR
:
return
"error"
elif
level
==
WARNING
:
return
"error"
else
:
return
"success"
temp_is_site_root
=
(
temp_traversed_document
.
getPath
()
==
site_root
.
getPath
())
temp_is_portal
=
(
temp_traversed_document
.
getPath
()
==
portal
.
getPath
())
def
calculateHateoas
(
is_portal
=
None
,
is_site_root
=
None
,
traversed_document
=
None
,
REQUEST
=
None
,
response
=
None
,
view
=
None
,
mode
=
None
,
query
=
None
,
...
...
@@ -1260,8 +1249,17 @@ def calculateHateoas(is_portal=None, is_site_root=None, traversed_document=None,
"name"
:
portal
.
getTitle
(),
}
}
# possible other attributes
# _notification {dict} form of {'message': "", 'status': ""}
# _embedded {dict} form of {"_view": <erp5_document_properties>}
}
# Inject notification into response no matter the kind of request
if
portal_status_message
:
result_dict
[
'_notification'
]
=
{
'message'
:
str
(
portal_status_message
),
'status'
:
statusLevelToString
(
portal_status_level
)
}
if
(
restricted
==
1
)
and
(
portal
.
portal_membership
.
isAnonymousUser
()):
login_relative_url
=
site_root
.
getLayoutProperty
(
"configuration_login"
,
default
=
""
)
...
...
@@ -2101,6 +2099,35 @@ def calculateHateoas(is_portal=None, is_site_root=None, traversed_document=None,
return result_dict
mime_type = '
application
/
hal
+
json
'
portal = context.getPortalObject()
sql_catalog = portal.portal_catalog.getSQLCatalog()
# Calculate the site root to prevent unexpected browsing
is_web_mode = (context.REQUEST.get('
current_web_section
', None) is not None) or (hasattr(context, '
isWebMode
') and context.isWebMode())
# is_web_mode = traversed_document.isWebMode()
if is_web_mode:
site_root = context.getWebSectionValue()
view_action_type = site_root.getLayoutProperty("configuration_view_action_category", default='
object_view
')
else:
site_root = portal
view_action_type = "object_view"
context.Base_prepareCorsResponse(RESPONSE=response)
# Check if traversed_document is the site_root
if relative_url:
temp_traversed_document = site_root.restrictedTraverse(relative_url, None)
if (temp_traversed_document is None):
response.setStatus(404)
return ""
else:
temp_traversed_document = context
temp_is_site_root = (temp_traversed_document.getPath() == site_root.getPath())
temp_is_portal = (temp_traversed_document.getPath() == portal.getPath())
response.setHeader('
Content
-
Type
', mime_type)
hateoas = calculateHateoas(is_portal=temp_is_portal, is_site_root=temp_is_site_root,
traversed_document=temp_traversed_document,
...
...
bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.xml
View file @
275758e6
...
...
@@ -56,7 +56,7 @@
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
REQUEST=None, response=None, view=None, mode=\'root\', query=None, select_list=None, limit=10, local_roles=None, form=None, relative_url=None, restricted=0, list_method=None, default_param_json=None, form_relative_url=None, bulk_list="[]", sort_on=None, selection_domain=None, extra_param_json=None
</string>
</value>
<value>
<string>
REQUEST=None, response=None, view=None, mode=\'root\', query=None, select_list=None, limit=10, local_roles=None, form=None, relative_url=None, restricted=0, list_method=None, default_param_json=None, form_relative_url=None, bulk_list="[]", sort_on=None, selection_domain=None, extra_param_json=None
, portal_status_message=\'\', portal_status_level=None
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
...
...
bt5/erp5_hal_json_style/TestTemplateItem/portal_components/test.erp5.testHalJsonStyle.py
View file @
275758e6
...
...
@@ -1615,6 +1615,28 @@ return portal.portal_simulation.getInventoryList(section_uid=context.getUid())
self
.
assertEqual
(
result_dict
[
'_embedded'
].
get
(
'count'
,
None
),
None
)
class
TestERP5Document_getHateoas_mode_form
(
ERP5HALJSONStyleSkinsMixin
):
@
simulate
(
'Base_getRequestHeader'
,
'*args, **kwargs'
,
'return "application/hal+json"'
)
@
createIndexedDocument
()
@
changeSkin
(
'Hal'
)
def
test_getHateoasForm_message
(
self
,
document
):
fake_request
=
do_fake_request
(
"POST"
)
result
=
self
.
portal
.
web_site_module
.
hateoas
.
ERP5Document_getHateoas
(
REQUEST
=
fake_request
,
mode
=
"form"
,
relative_url
=
document
.
getRelativeUrl
(),
form
=
getattr
(
document
,
'Foo_view'
),
portal_status_message
=
"Couscous"
,
portal_status_level
=
'error'
)
self
.
assertEquals
(
fake_request
.
RESPONSE
.
status
,
200
)
self
.
assertEquals
(
fake_request
.
RESPONSE
.
getHeader
(
'Content-Type'
),
"application/hal+json"
)
result_dict
=
json
.
loads
(
result
)
self
.
assertEqual
(
result_dict
[
"_notification"
][
"status"
],
"error"
)
self
.
assertEqual
(
result_dict
[
"_notification"
][
"message"
],
"Couscous"
)
class
TestERP5Document_getHateoas_mode_bulk
(
ERP5HALJSONStyleSkinsMixin
):
@
simulate
(
'Base_getRequestHeader'
,
'*args, **kwargs'
,
...
...
product/ERP5/bootstrap/erp5_xhtml_style/SkinTemplateItem/portal_skins/erp5_xhtml_style/Base_renderForm.py
View file @
275758e6
"""Render form while keeping its values back to user.
This script differs from Base_redirect that it keeps the form values in place.
:param message: {str} message to be displayed at the user
:param level: {str|int} is ignored in XHTML style - no support for message level distinction
:param keep_items: {dict} items to be available in the next call. They will be either added as hidden fields to the
rendered form or in case of "portal_status_message" just displayed to the user
:param REQUEST: request
:param **kwargs: is used to pass necessary parameters to overcome backend-held state (aka Selections)
"""
keep_items
=
keep_items
or
{}
if
message
and
"portal_status_message"
not
in
keep_items
:
keep_items
[
"portal_status_message"
]
=
message
keep_items
.
pop
(
"portal_status_level"
,
None
)
if
REQUEST
is
None
:
REQUEST
=
context
.
REQUEST
for
key
,
value
in
keep_items
.
items
():
REQUEST
.
set
(
key
,
value
)
return
getattr
(
context
,
form_id
)()
product/ERP5/bootstrap/erp5_xhtml_style/SkinTemplateItem/portal_skins/erp5_xhtml_style/Base_renderForm.xml
View file @
275758e6
...
...
@@ -50,7 +50,7 @@
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
form_id
</string>
</value>
<value>
<string>
form_id
, message=\'\', level=None, keep_items=None, REQUEST=None, **kwargs
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
...
...
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