Commit 582ddaec authored by Cédric Le Ninivin's avatar Cédric Le Ninivin Committed by Titouan Soulard

erp5_json_form: Integrate dedicated method to provide clean and cached schemas

parent cddd521a
...@@ -29,6 +29,7 @@ import json ...@@ -29,6 +29,7 @@ import json
import jsonschema import jsonschema
from erp5.component.document.JSONType import JSONType from erp5.component.document.JSONType import JSONType
from erp5.component.document.TextDocument import TextDocument from erp5.component.document.TextDocument import TextDocument
import re
from AccessControl import ClassSecurityInfo from AccessControl import ClassSecurityInfo
from Products.ERP5Type import Permissions, PropertySheet from Products.ERP5Type import Permissions, PropertySheet
...@@ -74,9 +75,7 @@ class JSONForm(JSONType, TextDocument): ...@@ -74,9 +75,7 @@ class JSONForm(JSONType, TextDocument):
""" """
Validate contained JSON with the Schema defined in the Portal Type. Validate contained JSON with the Schema defined in the Portal Type.
""" """
if not json_data: defined_schema = json.loads(self.getInputJSONSchema() or "")
return True
defined_schema = json.loads(self.getTextContent() or "")
try: try:
jsonschema.validate(json_data, defined_schema, format_checker=jsonschema.FormatChecker()) jsonschema.validate(json_data, defined_schema, format_checker=jsonschema.FormatChecker())
except jsonschema.exceptions.ValidationError as err: except jsonschema.exceptions.ValidationError as err:
...@@ -89,3 +88,26 @@ class JSONForm(JSONType, TextDocument): ...@@ -89,3 +88,26 @@ class JSONForm(JSONType, TextDocument):
} }
return err return err
return True return True
security.declarePublic('getInputJSONSchema')
def getInputJSONSchema(self, REQUEST=None):
"""
Clean way to retrive the schema
* Set proper cache headers
* Properly set the $id property
"""
schema = self.getTextContent()
regex = re.compile(r'"\$id": "(([^"])*)"')
result = regex.search(schema)
schema_id = self.absolute_url().strip() + "/getInputJSONSchema"
if result:
schema = schema.replace(result.group(1), schema_id, 1)
#print data
else:
schema = schema.replace("{", '{\n "$id": "%s",' % schema_id, 1)
if REQUEST is not None:
control = []
control.append( 'max-age=3600' )
control.append( 'private' )
REQUEST.RESPONSE.setHeader('Cache-control', ', '.join( control ) )
return schema
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