Commit 954bb69e authored by Jean-Paul Smets's avatar Jean-Paul Smets

Add a silent mode to Base_edit so that other scripts (in particular web...

Add a silent mode to Base_edit so that other scripts (in particular web widgets relate scripts) can reuse Base_edit. This should probably be taken out of Base_edit and made into a kind of library. Moreover, it should be extended so that only part of a form is validated (which is very useful for forms with multiple groups and validation buttons).

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@18874 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent d4e1c707
...@@ -67,6 +67,15 @@ ...@@ -67,6 +67,15 @@
<key> <string>_body</string> </key> <key> <string>_body</string> </key>
<value> <string encoding="cdata"><![CDATA[ <value> <string encoding="cdata"><![CDATA[
"""\n
This script validates a form to the current REQUEST,\n
processes the REQUEST to extract form data and editors,\n
then updates the current context with the form data\n
by calling edit on it or by invoking editors.\n
\n
TODO: split the generic form validation logic\n
from the context update logic\n
"""\n
from Products.Formulator.Errors import FormValidationError\n from Products.Formulator.Errors import FormValidationError\n
from Products.CMFActivity.Errors import ActivityPendingError\n from Products.CMFActivity.Errors import ActivityPendingError\n
\n \n
...@@ -74,6 +83,10 @@ request=context.REQUEST\n ...@@ -74,6 +83,10 @@ request=context.REQUEST\n
portal = context.getPortalObject()\n portal = context.getPortalObject()\n
N_ = portal.Base_translateString\n N_ = portal.Base_translateString\n
\n \n
# Extra security\n
if request.get(\'field_prefix\', None):\n
field_prefix = \'my_\' # Prevent changing the prefix through publisher\n
\n
# Use dialog_id if present, otherwise fall back on form_id.\n # Use dialog_id if present, otherwise fall back on form_id.\n
if dialog_id not in (\'\', None):\n if dialog_id not in (\'\', None):\n
form_id = dialog_id\n form_id = dialog_id\n
...@@ -81,7 +94,7 @@ if dialog_id not in (\'\', None):\n ...@@ -81,7 +94,7 @@ if dialog_id not in (\'\', None):\n
# Prevent users who don\'t have rights to edit the object from\n # Prevent users who don\'t have rights to edit the object from\n
# editing it by calling the Base_edit script with correct\n # editing it by calling the Base_edit script with correct\n
# parameters directly.\n # parameters directly.\n
if not request.AUTHENTICATED_USER.has_permission(\'Modify portal content\', context) :\n if not silent_mode and not request.AUTHENTICATED_USER.has_permission(\'Modify portal content\', context) :\n
redirect_url = \'%s/%s?selection_index=%s&selection_name=%s&%s\' % (context.absolute_url(), form_id, selection_index, selection_name, \'portal_status_message=You+don\\\'t+have+the+permissions+to+edit+the+object.\')\n redirect_url = \'%s/%s?selection_index=%s&selection_name=%s&%s\' % (context.absolute_url(), form_id, selection_index, selection_name, \'portal_status_message=You+don\\\'t+have+the+permissions+to+edit+the+object.\')\n
return request[\'RESPONSE\'].redirect(redirect_url)\n return request[\'RESPONSE\'].redirect(redirect_url)\n
\n \n
...@@ -102,6 +115,7 @@ except FormValidationError, validation_errors:\n ...@@ -102,6 +115,7 @@ except FormValidationError, validation_errors:\n
value = request.get(field_id)\n value = request.get(field_id)\n
if callable(value):\n if callable(value):\n
value(request)\n value(request)\n
if silent_mode: return form(request), \'form\'\n
return form(request)\n return form(request)\n
\n \n
def editListBox(listbox_field, listbox):\n def editListBox(listbox_field, listbox):\n
...@@ -189,6 +203,8 @@ def editMatrixBox(matrixbox_field, matrixbox):\n ...@@ -189,6 +203,8 @@ def editMatrixBox(matrixbox_field, matrixbox):\n
else:\n else:\n
return "Cell %s does not exist" % str(k)\n return "Cell %s does not exist" % str(k)\n
\n \n
field_prefix_len = len(field_prefix)\n
\n
def parseField(f):\n def parseField(f):\n
"""\n """\n
Parse given form field, to put them in\n Parse given form field, to put them in\n
...@@ -201,10 +217,10 @@ def parseField(f):\n ...@@ -201,10 +217,10 @@ def parseField(f):\n
# call it\n # call it\n
encapsulated_editor_list.append(v)\n encapsulated_editor_list.append(v)\n
elif v is not MARKER:\n elif v is not MARKER:\n
if k.startswith(\'my_\'):\n if k.startswith(field_prefix):\n
# We only take into account\n # We only take into account\n
# the object attributes\n # the object attributes\n
k = k[3:]\n k = k[field_prefix_len:]\n
# Form: \'\' -> ERP5: None\n # Form: \'\' -> ERP5: None\n
if v == \'\':\n if v == \'\':\n
v = None\n v = None\n
...@@ -232,10 +248,13 @@ try:\n ...@@ -232,10 +248,13 @@ try:\n
editListBox(field, request.get(field.id))\n editListBox(field, request.get(field.id))\n
elif(field_meta_type == \'MatrixBox\'):\n elif(field_meta_type == \'MatrixBox\'):\n
editMatrixBox(field, request.get(field.id))\n editMatrixBox(field, request.get(field.id))\n
\n
# Return parsed values \n
if silent_mode: return (kw, encapsulated_editor_list), \'edit\'\n
\n \n
# Maybe we should build a list of objects we need\n # Maybe we should build a list of objects we need\n
# Update basic attributes\n # Update basic attributes\n
context.edit(REQUEST=request,**kw)\n context.edit(REQUEST=request, **kw)\n
for encapsulated_editor in encapsulated_editor_list:\n for encapsulated_editor in encapsulated_editor_list:\n
encapsulated_editor.edit(context)\n encapsulated_editor.edit(context)\n
except ActivityPendingError,e:\n except ActivityPendingError,e:\n
...@@ -261,7 +280,9 @@ else:\n ...@@ -261,7 +280,9 @@ else:\n
editable_mode,\n editable_mode,\n
message)\n message)\n
\n \n
return request[\'RESPONSE\'].redirect(redirect_url)\n result = request[\'RESPONSE\'].redirect(redirect_url) \n
if silent_mode: return result, \'redirect\'\n
return result\n
]]></string> </value> ]]></string> </value>
...@@ -280,7 +301,7 @@ return request[\'RESPONSE\'].redirect(redirect_url)\n ...@@ -280,7 +301,7 @@ return request[\'RESPONSE\'].redirect(redirect_url)\n
</item> </item>
<item> <item>
<key> <string>_params</string> </key> <key> <string>_params</string> </key>
<value> <string>form_id, selection_index=0, selection_name=\'\', dialog_id=\'\', ignore_layout=0, editable_mode=1</string> </value> <value> <string>form_id, selection_index=0, selection_name=\'\', dialog_id=\'\', ignore_layout=0, editable_mode=1, silent_mode=0, field_prefix=\'my_\'</string> </value>
</item> </item>
<item> <item>
<key> <string>errors</string> </key> <key> <string>errors</string> </key>
...@@ -300,7 +321,7 @@ return request[\'RESPONSE\'].redirect(redirect_url)\n ...@@ -300,7 +321,7 @@ return request[\'RESPONSE\'].redirect(redirect_url)\n
<dictionary> <dictionary>
<item> <item>
<key> <string>co_argcount</string> </key> <key> <string>co_argcount</string> </key>
<value> <int>6</int> </value> <value> <int>8</int> </value>
</item> </item>
<item> <item>
<key> <string>co_varnames</string> </key> <key> <string>co_varnames</string> </key>
...@@ -312,6 +333,8 @@ return request[\'RESPONSE\'].redirect(redirect_url)\n ...@@ -312,6 +333,8 @@ return request[\'RESPONSE\'].redirect(redirect_url)\n
<string>dialog_id</string> <string>dialog_id</string>
<string>ignore_layout</string> <string>ignore_layout</string>
<string>editable_mode</string> <string>editable_mode</string>
<string>silent_mode</string>
<string>field_prefix</string>
<string>Products.Formulator.Errors</string> <string>Products.Formulator.Errors</string>
<string>FormValidationError</string> <string>FormValidationError</string>
<string>Products.CMFActivity.Errors</string> <string>Products.CMFActivity.Errors</string>
...@@ -335,8 +358,10 @@ return request[\'RESPONSE\'].redirect(redirect_url)\n ...@@ -335,8 +358,10 @@ return request[\'RESPONSE\'].redirect(redirect_url)\n
<string>callable</string> <string>callable</string>
<string>editListBox</string> <string>editListBox</string>
<string>editMatrixBox</string> <string>editMatrixBox</string>
<string>MARKER</string> <string>len</string>
<string>field_prefix_len</string>
<string>kw</string> <string>kw</string>
<string>MARKER</string>
<string>encapsulated_editor_list</string> <string>encapsulated_editor_list</string>
<string>parseField</string> <string>parseField</string>
<string>message</string> <string>message</string>
...@@ -346,6 +371,7 @@ return request[\'RESPONSE\'].redirect(redirect_url)\n ...@@ -346,6 +371,7 @@ return request[\'RESPONSE\'].redirect(redirect_url)\n
<string>encapsulated_editor</string> <string>encapsulated_editor</string>
<string>e</string> <string>e</string>
<string>int</string> <string>int</string>
<string>result</string>
</tuple> </tuple>
</value> </value>
</item> </item>
...@@ -363,6 +389,8 @@ return request[\'RESPONSE\'].redirect(redirect_url)\n ...@@ -363,6 +389,8 @@ return request[\'RESPONSE\'].redirect(redirect_url)\n
<string></string> <string></string>
<int>0</int> <int>0</int>
<int>1</int> <int>1</int>
<int>0</int>
<string>my_</string>
</tuple> </tuple>
</value> </value>
</item> </item>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment