From 9dbf26ebbacea50e75e51e14ffc9271f7576f752 Mon Sep 17 00:00:00 2001 From: Romain Courteaud <romain@nexedi.com> Date: Thu, 30 Apr 2015 11:52:39 +0200 Subject: [PATCH] ERP5.get: returns properties based on document default form calculation. --- src/jio.storage/erp5storage.js | 67 +++++++++++++-- test/jio.storage/erp5storage.tests.js | 117 +++++++++++++++++++++++++- 2 files changed, 173 insertions(+), 11 deletions(-) diff --git a/src/jio.storage/erp5storage.js b/src/jio.storage/erp5storage.js index 655d64b..d688f0d 100644 --- a/src/jio.storage/erp5storage.js +++ b/src/jio.storage/erp5storage.js @@ -62,6 +62,59 @@ }); } + var allowed_field_dict = { + "StringField": null, + "IntegerField": null, + "FloatField": null, + "TextAreaField": null + }; + + function extractPropertyFromForm(context, id) { + return context.getAttachment(id, "view") + .push(function (blob) { + return jIO.util.readBlobAsText(blob); + }) + .push(function (evt) { + return JSON.parse(evt.target.result); + }) + .push(function (json) { + var form = json._embedded._view, + converted_json = { + portal_type: json.portal_type + }, + form_data_json = {}, + field, + key; + + form_data_json.form_id = { + "key": [form.form_id.key], + "default": form.form_id["default"] + }; + // XXX How to store datetime + for (key in form) { + if (form.hasOwnProperty(key)) { + field = form[key]; + if ((key.indexOf('my_') === 0) && + (field.editable) && + (allowed_field_dict.hasOwnProperty(field.type))) { + + form_data_json[key.substring(3)] = { + "default": field["default"], + "key": field.key + }; + converted_json[key.substring(3)] = field["default"]; + } + } + } + + return { + action_href: form._actions.put.href, + data: converted_json, + form_data: form_data_json + }; + }); + } + // XXX docstring function ERP5Storage(spec) { if (typeof spec.url !== "string" || !spec.url) { @@ -73,22 +126,18 @@ } ERP5Storage.prototype.get = function (id) { - return getDocumentAndHateoas(this, id) - .push(function (response) { - var result = JSON.parse(response.target.responseText), - key; - // action_type; - result.portal_type = result._links.type.name; - + return extractPropertyFromForm(this, id) + .push(function (result) { + var key; + result = result.data; // Remove all ERP5 hateoas links / convert them into jIO ID for (key in result) { if (result.hasOwnProperty(key)) { - if (key.indexOf("_") === 0) { + if (!result[key]) { delete result[key]; } } } - return result; }); }; diff --git a/test/jio.storage/erp5storage.tests.js b/test/jio.storage/erp5storage.tests.js index 27e419a..7dd9918 100644 --- a/test/jio.storage/erp5storage.tests.js +++ b/test/jio.storage/erp5storage.tests.js @@ -55,7 +55,8 @@ this.jio = jIO.createJIO({ type: "erp5", - url: domain + url: domain, + default_view_reference: "bar_view" }); }, teardown: function () { @@ -93,10 +94,73 @@ }); }); + test("get ERP5 document with empty form", function () { + var id = "person_module/20150119_azerty", + traverse_url = domain + "?mode=traverse&relative_url=" + + encodeURIComponent(id) + "&view=bar_view", + document_hateoas = JSON.stringify({ + // Kept property + "title": "foo", + // Remove all _ properties + "_bar": "john doo", + "_links": { + type: { + name: "Person" + } + }, + "_embedded": { + "_view": { + form_id: { + key: "form_id", + "default": "Base_view" + }, + "_actions": { + put: { + href: "one erp5 url" + } + } + } + } + }), + server = this.server; + + this.server.respondWith("GET", domain, [200, { + "Content-Type": "application/hal+json" + }, root_hateoas]); + this.server.respondWith("GET", traverse_url, [200, { + "Content-Type": "application/hal+json" + }, document_hateoas]); + + stop(); + expect(10); + + this.jio.get(id) + .then(function (result) { + deepEqual(result, { + portal_type: "Person" + }, "Check document"); + equal(server.requests.length, 2); + equal(server.requests[0].method, "GET"); + equal(server.requests[0].url, domain); + equal(server.requests[0].requestBody, undefined); + equal(server.requests[0].withCredentials, true); + equal(server.requests[1].method, "GET"); + equal(server.requests[1].url, traverse_url); + equal(server.requests[1].requestBody, undefined); + equal(server.requests[1].withCredentials, true); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + test("get ERP5 document", function () { var id = "person_module/20150119_azerty", traverse_url = domain + "?mode=traverse&relative_url=" + - encodeURIComponent(id), + encodeURIComponent(id) + "&view=bar_view", document_hateoas = JSON.stringify({ // Kept property "title": "foo", @@ -106,6 +170,55 @@ type: { name: "Person" } + }, + "_embedded": { + "_view": { + form_id: { + key: "form_id", + "default": "Base_view" + }, + my_title: { + key: "field_my_title", + "default": "foo", + editable: true, + type: "StringField" + }, + my_id: { + key: "field_my_id", + "default": "", + editable: true, + type: "StringField" + }, + my_title_non_editable: { + key: "field_my_title_non_editable", + "default": "foo", + editable: false, + type: "StringField" + }, + my_start_date: { + key: "field_my_start_date", + "default": "foo", + editable: true, + type: "DateTimeField" + }, + your_reference: { + key: "field_your_title", + "default": "bar", + editable: true, + type: "StringField" + }, + sort_index: { + key: "field_sort_index", + "default": "foobar", + editable: true, + type: "StringField" + }, + "_actions": { + put: { + href: "one erp5 url" + } + } + } } }), server = this.server; -- 2.30.9