From ac0027c7358a3b358161bb073366e4d83bd274e6 Mon Sep 17 00:00:00 2001 From: Katja Danilova Date: Thu, 22 Apr 2021 14:37:14 +0300 Subject: [PATCH 1/2] specs version --- metaform-api-spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metaform-api-spec b/metaform-api-spec index 612171fb..93361bb1 160000 --- a/metaform-api-spec +++ b/metaform-api-spec @@ -1 +1 @@ -Subproject commit 612171fb0d621f5863f5b2726230842b466b6a9f +Subproject commit 93361bb107fbda35508bc5b79a302e87ae5f6741 From 1f9f13476a67a5d816cdf3af9a78ec994a427925 Mon Sep 17 00:00:00 2001 From: Katja Danilova Date: Thu, 22 Apr 2021 21:53:15 +0300 Subject: [PATCH 2/2] implemented value sources based auto filling of replies --- .../server/metaforms/FieldController.java | 48 ++++++++++++-- .../test/functional/tests/ReplyTestsIT.java | 63 +++++++++++++++++++ .../testforms/simple-meta-value-sources.json | 44 +++++++++++++ 3 files changed, 149 insertions(+), 6 deletions(-) create mode 100644 src/test/resources/fi/metatavu/metaform/testforms/simple-meta-value-sources.json diff --git a/src/main/java/fi/metatavu/metaform/server/metaforms/FieldController.java b/src/main/java/fi/metatavu/metaform/server/metaforms/FieldController.java index 1f97b509..6740a2ed 100644 --- a/src/main/java/fi/metatavu/metaform/server/metaforms/FieldController.java +++ b/src/main/java/fi/metatavu/metaform/server/metaforms/FieldController.java @@ -13,10 +13,7 @@ import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; -import fi.metatavu.metaform.api.spec.model.Metaform; -import fi.metatavu.metaform.api.spec.model.MetaformField; -import fi.metatavu.metaform.api.spec.model.MetaformFieldType; -import fi.metatavu.metaform.api.spec.model.MetaformSection; +import fi.metatavu.metaform.api.spec.model.*; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; @@ -127,12 +124,17 @@ public Object getFieldValue(Metaform metaformEntity, Reply reply, String fieldNa if (isMetafield(metaformEntity, fieldName)) { return resolveMetaField(fieldName, reply); } - + else if (isValueSourceField(metaformEntity, fieldName)) { + MetaformField metaformField = getField(metaformEntity, fieldName); + MetaformFieldValueSource valueSource = metaformField.getValueSource(); + return resolveValueSourceField(valueSource, reply); + } + ReplyField field = replyFieldMap.get(fieldName); if (field == null) { return null; } - + if (field instanceof NumberReplyField) { return ((NumberReplyField) field).getValue(); } else if (field instanceof BooleanReplyField) { @@ -153,6 +155,40 @@ public Object getFieldValue(Metaform metaformEntity, Reply reply, String fieldNa return null; } + /** + * Returns the value based on the value source + * + * @param valueSource value source + * @param reply reply + * @return generated value + */ + private Object resolveValueSourceField(MetaformFieldValueSource valueSource, Reply reply) { + switch (valueSource) { + case REPLYLASTMODIFIERID: + return reply.getUserId(); + case REPLYCREATORID: + return reply.getUserId(); + case REPLYCREATEDAT: + return formatDateTime(reply.getCreatedAt()); + case REPLYMODIFIEDAT: + return formatDateTime(reply.getModifiedAt()); + } + + return null; + } + + /** + * Checks if the value should be auto filled based on its value Source type. Does not apply to MetaformFieldValueSource.REPLYVALUE + * + * @param metaformEntity metaform + * @param name field name + * @return if the value should be generated + */ + private boolean isValueSourceField(Metaform metaformEntity, String name) { + MetaformField field = getField(metaformEntity, name); + return field != null && field.getValueSource() != null && field.getValueSource() != MetaformFieldValueSource.REPLYVALUE; + } + /** * Returns table field row as map * diff --git a/src/test/java/fi/metatavu/metaform/test/functional/tests/ReplyTestsIT.java b/src/test/java/fi/metatavu/metaform/test/functional/tests/ReplyTestsIT.java index 867beb7c..263c8e78 100644 --- a/src/test/java/fi/metatavu/metaform/test/functional/tests/ReplyTestsIT.java +++ b/src/test/java/fi/metatavu/metaform/test/functional/tests/ReplyTestsIT.java @@ -16,6 +16,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.time.Instant; import java.time.OffsetDateTime; import java.time.ZoneId; import java.time.temporal.ChronoUnit; @@ -488,6 +489,68 @@ public void testMetafields() throws Exception { } } + /* + * Tests creating metaform with auto filled fields defined by value source properties + */ + @Test + public void testMetafieldsFieldValueSource() throws Exception { + try (TestBuilder testBuilder = new TestBuilder()) { + Metaform parsedMetaform = testBuilder.metaformAdmin().metaforms().readMetaform("simple-meta-value-sources"); + Metaform metaform = testBuilder.metaformAdmin().metaforms().create(parsedMetaform); + + Map replyData = new HashMap<>(); + replyData.put("text", "test 1"); + replyData.put("customTextValue", "custom test value 1"); + + Reply replyWithData = testBuilder.test1().replies().createReplyWithData(replyData); + Reply createdReply = testBuilder.test1().replies().create(metaform.getId(), ReplyMode.REVISION.toString(), replyWithData); + + Assertions.assertNotNull(createdReply.getCreatedAt()); + Assertions.assertNotNull(createdReply.getModifiedAt()); + + OffsetDateTime parsedCreated = OffsetDateTime.parse(createdReply.getCreatedAt()); + OffsetDateTime parsedModified = OffsetDateTime.parse(createdReply.getModifiedAt()); + + Reply reply = testBuilder.test1().replies().findReply(metaform.getId(), createdReply.getId(), null); + + Assertions.assertNotNull(reply.getData()); + + Assertions.assertEquals(parsedCreated.truncatedTo(ChronoUnit.MINUTES).toInstant(), parseOffsetDateTime((String) reply.getData().get("customNamedCreate")).truncatedTo(ChronoUnit.MINUTES).toInstant()); + Assertions.assertEquals(parsedModified.truncatedTo(ChronoUnit.MINUTES).toInstant(), parseOffsetDateTime((String) reply.getData().get("customNamedModify")).truncatedTo(ChronoUnit.MINUTES).toInstant()); + Assertions.assertEquals(REALM1_USER_1_ID.toString(), reply.getData().get("customLastEditor")); + Assertions.assertEquals(REALM1_USER_1_ID.toString(), reply.getData().get("customCreator")); + Assertions.assertEquals("custom test value 1", reply.getData().get("customTextValue")); + } + } + + /* + Compares the metaform replies created using metafields and value sources + */ + @Test + public void testMetafieldsFieldValueSourceCompare() throws Exception { + try (TestBuilder testBuilder = new TestBuilder()) { + Metaform parsedSimple = testBuilder.metaformAdmin().metaforms().readMetaform("simple-meta"); + Metaform simpleMeta = testBuilder.metaformAdmin().metaforms().create(parsedSimple); + + Metaform parsedValueSrc = testBuilder.metaformAdmin().metaforms().readMetaform("simple-meta-value-sources"); + Metaform valueSrcMeta = testBuilder.metaformAdmin().metaforms().create(parsedValueSrc); + + Reply simpleReply = testBuilder.test1().replies().createSimpleReply(simpleMeta, "test 1", ReplyMode.CUMULATIVE); + Reply valueSrcReply = testBuilder.test1().replies().createSimpleReply(valueSrcMeta, "test 1", ReplyMode.CUMULATIVE); + + Instant parsedCreated1 = parseOffsetDateTime((String) simpleReply.getData().get("created")).truncatedTo(ChronoUnit.MINUTES).toInstant(); + Instant parsedCreated2 = parseOffsetDateTime((String) valueSrcReply.getData().get("customNamedCreate")).truncatedTo(ChronoUnit.MINUTES).toInstant(); + + Assertions.assertEquals(parsedCreated1, parsedCreated2); + + Instant parsedModified1 = parseOffsetDateTime((String) simpleReply.getData().get("modified")).truncatedTo(ChronoUnit.MINUTES).toInstant(); + Instant parsedModified2 = parseOffsetDateTime((String) valueSrcReply.getData().get("customNamedModify")).truncatedTo(ChronoUnit.MINUTES).toInstant(); + + Assertions.assertEquals(parsedModified1, parsedModified2); + Assertions.assertEquals(simpleReply.getData().get("lastEditor"), valueSrcReply.getData().get("customLastEditor")); + } + } + @Test public void testFindReplyOwnerKeys() throws Exception { try (TestBuilder testBuilder = new TestBuilder()) { diff --git a/src/test/resources/fi/metatavu/metaform/testforms/simple-meta-value-sources.json b/src/test/resources/fi/metatavu/metaform/testforms/simple-meta-value-sources.json new file mode 100644 index 00000000..6801b4eb --- /dev/null +++ b/src/test/resources/fi/metatavu/metaform/testforms/simple-meta-value-sources.json @@ -0,0 +1,44 @@ +{ + "sections": [ + { + "title": "Simple form with value source fields", + "fields": [ + { + "name": "text", + "type": "text", + "title": "Text field" + }, + { + "name": "customTextValue", + "type": "text", + "title": "reply value fields", + "valueSource": "replyValue" + }, + { + "name": "customNamedCreate", + "type": "date-time", + "title": "Created field", + "valueSource": "replyCreatedAt" + }, + { + "name": "customNamedModify", + "type": "date-time", + "title": "modified field", + "valueSource": "replyModifiedAt" + }, + { + "name": "customLastEditor", + "type": "text", + "title": "lastEditor field", + "valueSource": "replyLastModifierId" + }, + { + "name": "customCreator", + "type": "text", + "title": "creator field", + "valueSource": "replyCreatorId" + } + ] + } + ] +} \ No newline at end of file