Commit eeafb265 authored by Titouan Soulard's avatar Titouan Soulard

erp5_action_information_api: support for OpenAPI hyperdocument

parent cff390ef
<?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_api_type</string>
</tuple>
</value>
</item>
<item>
<key> <string>category</string> </key>
<value> <string>object_api_type</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>api_openapi</string> </value>
</item>
<item>
<key> <string>permissions</string> </key>
<value>
<tuple>
<string>View</string>
</tuple>
</value>
</item>
<item>
<key> <string>priority</string> </key>
<value> <float>1.0</float> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>OpenAPI</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}/ActionInformationAPI_api_openapi</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -120,8 +120,7 @@ class ActionInformationAPI(XMLObject): ...@@ -120,8 +120,7 @@ class ActionInformationAPI(XMLObject):
def handleRequest(self, request): def handleRequest(self, request):
portal = self.getPortalObject() portal = self.getPortalObject()
action_filter = self.getActionReferenceValue() (hyperdocument, actions) = self.getTypeInfo().getDefaultViewFor(self, view=self.getApiTypeReference())(self, portal, request)
(hyperdocument, actions) = self.getTypeInfo().getDefaultViewFor(self, view=self.getApiTypeReference())(portal, action_filter, request.getURL())
response = request.RESPONSE response = request.RESPONSE
request_content_type = request.getHeader("content-type") request_content_type = request.getHeader("content-type")
......
import json
schema = caller.getTypeInfo().getSchema()
schema.setdefault("servers", []).insert(
0, {
"url": caller.absolute_url(),
"description": caller.getDescription()
})
hyperdocument = json.dumps(schema)
return (hyperdocument, {})
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</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>caller, portal, request</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>ActionInformationAPI_api_openapi</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
import json import json
url = request.getURL()
base_url_absolute = portal.portal_callables.absolute_url().strip() base_url_absolute = portal.portal_callables.absolute_url().strip()
base_url_relative = portal.portal_callables.getPath().strip() base_url_relative = portal.portal_callables.getPath().strip()
action_filter = caller.getActionReferenceValue()
raw_action_list = portal.portal_catalog( raw_action_list = portal.portal_catalog(
portal_type="Action Information", portal_type="Action Information",
action_type__uid=action_filter.getUid() action_type__uid=action_filter.getUid()
......
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
</item> </item>
<item> <item>
<key> <string>_params</string> </key> <key> <string>_params</string> </key>
<value> <string>portal, action_filter, url</string> </value> <value> <string>caller, portal, request</string> </value>
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
......
...@@ -58,22 +58,6 @@ class TestActionInformationAPI(ERP5TypeTestCase): ...@@ -58,22 +58,6 @@ class TestActionInformationAPI(ERP5TypeTestCase):
self.tic() self.tic()
self.commit() self.commit()
ai_type = self.portal.portal_catalog(
portal_type="Action Information",
action_type__uid=self.portal.portal_categories.action_type.object_api_type.getUid(),
reference="api_slap",
)[0]
self.web_service = self.portal.portal_web_services.newContent(
portal_type="Action Information API",
)
self.web_service.edit(
api_type=ai_type.getRelativeUrl(),
action_reference=self.object_api_value.getRelativeUrl(),
)
self.tic()
self.commit()
portal_type_name = "Person" portal_type_name = "Person"
portal_type = self.portal.portal_types[portal_type_name] portal_type = self.portal.portal_types[portal_type_name]
action_id = "Person_updateEmail" action_id = "Person_updateEmail"
...@@ -113,6 +97,39 @@ return {"status": 200}""") ...@@ -113,6 +97,39 @@ return {"status": 200}""")
self.tic() self.tic()
self.commit() self.commit()
def setupAiApi(self):
ai_type = self.portal.portal_catalog(
portal_type="Action Information",
action_type__uid=self.portal.portal_categories.action_type.object_api_type.getUid(),
reference="api_slap",
)[0]
self.web_service = self.portal.portal_web_services.newContent(
portal_type="Action Information API",
)
self.web_service.edit(
api_type=ai_type.getRelativeUrl(),
action_reference=self.object_api_value.getRelativeUrl(),
)
self.tic()
self.commit()
def setupOpenApi(self):
ai_type = self.portal.portal_catalog(
portal_type="Action Information",
action_type__uid=self.portal.portal_categories.action_type.object_api_type.getUid(),
reference="api_openapi",
)[0]
self.web_service = self.portal.portal_web_services.newContent(
portal_type="Pet Store Open API",
)
self.web_service.edit(
api_type=ai_type.getRelativeUrl(),
)
self.tic()
self.commit()
def loggedInRequest(self, path, method, content): def loggedInRequest(self, path, method, content):
return self.publish( return self.publish(
self.web_service.getPath() + path, self.web_service.getPath() + path,
...@@ -124,7 +141,9 @@ return {"status": 200}""") ...@@ -124,7 +141,9 @@ return {"status": 200}""")
user="ERP5TypeTestCase" user="ERP5TypeTestCase"
) )
def test_hyperdocument(self): def test_hyperdocument_script(self):
self.setupAiApi()
response = self.loggedInRequest("/api", "GET", {}) response = self.loggedInRequest("/api", "GET", {})
response_json = json.loads(response.getBody()) response_json = json.loads(response.getBody())
...@@ -133,7 +152,9 @@ return {"status": 200}""") ...@@ -133,7 +152,9 @@ return {"status": 200}""")
self.assertTrue("Person_updateEmail/getInputJSONSchema" in response_json["links"][0]["$schemaRequest"]) self.assertTrue("Person_updateEmail/getInputJSONSchema" in response_json["links"][0]["$schemaRequest"])
self.assertTrue("Person_updateEmail/getOutputJSONSchema" in response_json["links"][0]["$schemaResponse"]) self.assertTrue("Person_updateEmail/getOutputJSONSchema" in response_json["links"][0]["$schemaResponse"])
def test_update(self): def test_update_script(self):
self.setupAiApi()
person = self.portal.person_module.newContent( person = self.portal.person_module.newContent(
id="%s_person" % self.current_id, id="%s_person" % self.current_id,
portal_type="Person", portal_type="Person",
...@@ -152,3 +173,11 @@ return {"status": 200}""") ...@@ -152,3 +173,11 @@ return {"status": 200}""")
self.assertEqual(response.getBody(), json.dumps({ "status": 200 }, indent=2)) self.assertEqual(response.getBody(), json.dumps({ "status": 200 }, indent=2))
self.assertEqual(response.getStatus(), 200) self.assertEqual(response.getStatus(), 200)
self.assertEqual(person.getDefaultEmailUrlString(), "alice@looking.glass") self.assertEqual(person.getDefaultEmailUrlString(), "alice@looking.glass")
def test_hyperdocument_openapi(self):
self.setupOpenApi()
response = self.loggedInRequest("/api", "GET", {})
response_json = json.loads(response.getBody())
self.assertEqual(response_json["openapi"], "3.0.2")
Action Information API | api_openapi
Action Information API | api_slap Action Information API | api_slap
Action Information API | view Action Information API | view
\ No newline at end of file
erp5_full_text_mroonga_catalog erp5_full_text_mroonga_catalog
erp5_open_api_ui_test
\ No newline at end of file
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