From 3470d12f18ba2484bdb89a42c3d958ebdbd0e4fd Mon Sep 17 00:00:00 2001 From: William Welling Date: Mon, 14 Aug 2023 16:58:44 -0500 Subject: [PATCH 1/7] Add container type to data and analytics view --- .../middleware/view/model/ContainerType.java | 5 +++++ .../view/model/DataAndAnalyticsView.java | 15 +++++++++++++++ .../resources/defaults/dataAndanalyticViews.yml | 3 +++ 3 files changed, 23 insertions(+) create mode 100644 src/main/java/edu/tamu/scholars/middleware/view/model/ContainerType.java diff --git a/src/main/java/edu/tamu/scholars/middleware/view/model/ContainerType.java b/src/main/java/edu/tamu/scholars/middleware/view/model/ContainerType.java new file mode 100644 index 000000000..06b1be7c6 --- /dev/null +++ b/src/main/java/edu/tamu/scholars/middleware/view/model/ContainerType.java @@ -0,0 +1,5 @@ +package edu.tamu.scholars.middleware.view.model; + +public enum ContainerType { + ACADEMIC_AGE_GROUP, QUANTITY_DISTRIBUTION, PROFILE_SUMMARIES_EXPORT +} diff --git a/src/main/java/edu/tamu/scholars/middleware/view/model/DataAndAnalyticsView.java b/src/main/java/edu/tamu/scholars/middleware/view/model/DataAndAnalyticsView.java index 3412c98e0..3b492cb52 100644 --- a/src/main/java/edu/tamu/scholars/middleware/view/model/DataAndAnalyticsView.java +++ b/src/main/java/edu/tamu/scholars/middleware/view/model/DataAndAnalyticsView.java @@ -1,6 +1,9 @@ package edu.tamu.scholars.middleware.view.model; +import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; import javax.persistence.Table; @Entity @@ -9,4 +12,16 @@ public class DataAndAnalyticsView extends CollectionView { private static final long serialVersionUID = 2912876591264398726L; + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private ContainerType type; + + public ContainerType getType() { + return type; + } + + public void setType(ContainerType type) { + this.type = type; + } + } diff --git a/src/main/resources/defaults/dataAndanalyticViews.yml b/src/main/resources/defaults/dataAndanalyticViews.yml index e95ef6064..2fb23cf19 100644 --- a/src/main/resources/defaults/dataAndanalyticViews.yml +++ b/src/main/resources/defaults/dataAndanalyticViews.yml @@ -1,7 +1,10 @@ --- - name: Publications by Academic Age Group layout: CONTAINER + type: ACADEMIC_AGE_GROUP - name: Research by UN SDG layout: CONTAINER + type: QUANTITY_DISTRIBUTION - name: Download Profile Summaries by Department layout: CONTAINER + type: PROFILE_SUMMARIES_EXPORT \ No newline at end of file From b54b33782bd32323fccc562e78b37c9fb252b068 Mon Sep 17 00:00:00 2001 From: William Welling Date: Mon, 14 Aug 2023 16:59:29 -0500 Subject: [PATCH 2/7] Update individual model resources --- .../IndividualExportController.java | 65 +++++++++++++++++-- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/src/main/java/edu/tamu/scholars/middleware/export/controller/IndividualExportController.java b/src/main/java/edu/tamu/scholars/middleware/export/controller/IndividualExportController.java index 6619a8446..01a707361 100644 --- a/src/main/java/edu/tamu/scholars/middleware/export/controller/IndividualExportController.java +++ b/src/main/java/edu/tamu/scholars/middleware/export/controller/IndividualExportController.java @@ -19,6 +19,8 @@ import edu.tamu.scholars.middleware.discovery.assembler.model.IndividualModel; import edu.tamu.scholars.middleware.discovery.model.Individual; +import edu.tamu.scholars.middleware.discovery.model.Organization; +import edu.tamu.scholars.middleware.discovery.model.Person; import edu.tamu.scholars.middleware.discovery.model.repo.IndividualRepo; import edu.tamu.scholars.middleware.export.exception.UnknownExporterTypeException; import edu.tamu.scholars.middleware.export.service.Exporter; @@ -54,16 +56,69 @@ public ResponseEntity export( @Override public IndividualModel process(IndividualModel resource) { + // TODO: figure out how to add links from appropriate display view export views + Individual individual = resource.getContent(); + if (individual != null) { + if (individual.getProxy().equals(Person.class.getSimpleName())) { + addResource(resource, new ResourceLink(individual, "docx", "Single Page Bio", "Individual single page bio export")); + addResource(resource, new ResourceLink(individual, "docx", "Profile Summary", "Individual profile summary export")); + addResource(resource, new ResourceLink(individual, "zip", "5 Year Publications", "Individual 5 year publications export")); + addResource(resource, new ResourceLink(individual, "zip", "8 Year Publications", "Individual 8 year publications export")); + } else if (individual.getProxy().equals(Organization.class.getSimpleName())) { + addResource(resource, new ResourceLink(individual, "zip", "5 Year Publications", "Organization 5 year publications export")); + addResource(resource, new ResourceLink(individual, "zip", "8 Year Publications", "Organization 8 year publications export")); + } + } + + return resource; + } + + private void addResource(IndividualModel resource, ResourceLink link) { try { resource.add(linkTo(methodOn(this.getClass()).export( - resource.getContent().getId(), - "docx", - "Profile Summary" - )).withRel("export").withTitle("Individual export")); + link.getIndividual().getId(), + link.getType(), + link.getName() + )).withRel(link.getName().toLowerCase().replace(" ", "_")).withTitle(link.getTitle())); } catch (NullPointerException | UnknownExporterTypeException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } - return resource; + } + + private class ResourceLink { + private final Individual individual; + private final String type; + private final String name; + private final String title; + + private ResourceLink( + Individual individual, + String type, + String name, + String title + ) { + this.individual = individual; + this.type = type; + this.name = name; + this.title = title; + } + + public Individual getIndividual() { + return individual; + } + + public String getType() { + return type; + } + + public String getName() { + return name; + } + + public String getTitle() { + return title; + } + } } From c7ff11c9701ec28546ba7e42def81919ee3b0ca0 Mon Sep 17 00:00:00 2001 From: William Welling Date: Mon, 14 Aug 2023 17:17:43 -0500 Subject: [PATCH 3/7] Update tests --- .../edu/tamu/scholars/middleware/view/ViewTestUtility.java | 2 ++ .../controller/DataAndAnalyticsViewControllerTest.java | 7 +++++++ .../middleware/view/model/DataAndAnalyticsViewTest.java | 1 + 3 files changed, 10 insertions(+) diff --git a/src/test/java/edu/tamu/scholars/middleware/view/ViewTestUtility.java b/src/test/java/edu/tamu/scholars/middleware/view/ViewTestUtility.java index 84e1db48a..175f46b34 100644 --- a/src/test/java/edu/tamu/scholars/middleware/view/ViewTestUtility.java +++ b/src/test/java/edu/tamu/scholars/middleware/view/ViewTestUtility.java @@ -9,6 +9,7 @@ import edu.tamu.scholars.middleware.model.OpKey; import edu.tamu.scholars.middleware.view.model.Boost; +import edu.tamu.scholars.middleware.view.model.ContainerType; import edu.tamu.scholars.middleware.view.model.DataAndAnalyticsView; import edu.tamu.scholars.middleware.view.model.DirectoryView; import edu.tamu.scholars.middleware.view.model.DiscoveryView; @@ -37,6 +38,7 @@ public static DataAndAnalyticsView getMockDataAndAnalyticsView() { dataAndAnalyticsView.setName(MOCK_VIEW_NAME); dataAndAnalyticsView.setLayout(Layout.GRID); + dataAndAnalyticsView.setType(ContainerType.PROFILE_SUMMARIES_EXPORT); Map templates = new HashMap(); templates.put("default", "

Element template from WSYWIG

"); diff --git a/src/test/java/edu/tamu/scholars/middleware/view/controller/DataAndAnalyticsViewControllerTest.java b/src/test/java/edu/tamu/scholars/middleware/view/controller/DataAndAnalyticsViewControllerTest.java index fe3191577..db2bf5f0e 100644 --- a/src/test/java/edu/tamu/scholars/middleware/view/controller/DataAndAnalyticsViewControllerTest.java +++ b/src/test/java/edu/tamu/scholars/middleware/view/controller/DataAndAnalyticsViewControllerTest.java @@ -51,6 +51,7 @@ public void testCreateDataAndAnalyticsView() throws JsonProcessingException, Exc requestFields( describeDataAndAnalyticsView.withField("name", "The name of the Data And Analytics View."), describeDataAndAnalyticsView.withField("layout", "The layout of the Data And Analytics View."), + describeDataAndAnalyticsView.withField("type", "The container type of the Data And Analytics View."), describeDataAndAnalyticsView.withSubsection("templates", "The result templates of the Data And Analytics View."), describeDataAndAnalyticsView.withField("styles", "An array of result style strings of the Data And Analytics View."), describeDataAndAnalyticsView.withField("fields", "An array of fields of the Data And Analytics View."), @@ -67,6 +68,7 @@ public void testCreateDataAndAnalyticsView() throws JsonProcessingException, Exc responseFields( describeDataAndAnalyticsView.withField("name", "The name of the Data And Analytics View."), describeDataAndAnalyticsView.withField("layout", "The layout of the Data And Analytics View."), + describeDataAndAnalyticsView.withField("type", "The container type of the Data And Analytics View."), describeDataAndAnalyticsView.withSubsection("templates", "The result templates of the Data And Analytics View."), describeDataAndAnalyticsView.withField("styles", "An array of result style strings of the Data And Analytics View."), describeDataAndAnalyticsView.withField("fields", "An array of fields of the Data And Analytics View."), @@ -98,6 +100,7 @@ public void testUpdateDataAndAnalyticsView() throws JsonProcessingException, Exc describeDataAndAnalyticsView.withField("id", "The Data And Analytics View id."), describeDataAndAnalyticsView.withField("name", "The name of the Data And Analytics View."), describeDataAndAnalyticsView.withField("layout", "The layout of the Data And Analytics View."), + describeDataAndAnalyticsView.withField("type", "The container type of the Data And Analytics View."), describeDataAndAnalyticsView.withSubsection("templates", "The result templates of the Data And Analytics View."), describeDataAndAnalyticsView.withField("styles", "An array of result style strings of the Data And Analytics View."), describeDataAndAnalyticsView.withField("fields", "An array of fields of the Data And Analytics View."), @@ -114,6 +117,7 @@ public void testUpdateDataAndAnalyticsView() throws JsonProcessingException, Exc responseFields( describeDataAndAnalyticsView.withField("name", "The name of the Data And Analytics View."), describeDataAndAnalyticsView.withField("layout", "The layout of the Data And Analytics View."), + describeDataAndAnalyticsView.withField("type", "The container type of the Data And Analytics View."), describeDataAndAnalyticsView.withSubsection("templates", "The result templates of the Data And Analytics View."), describeDataAndAnalyticsView.withField("styles", "An array of result style strings of the Data And Analytics View."), describeDataAndAnalyticsView.withField("fields", "An array of fields of the Data And Analytics View."), @@ -152,6 +156,7 @@ public void testPatchTheme() throws JsonProcessingException, Exception { describeDataAndAnalyticsView.withParameter("id", "The Data And Analytics View id.").optional(), describeDataAndAnalyticsView.withParameter("name", "The name of the Data And Analytics View.").optional(), describeDataAndAnalyticsView.withParameter("layout", "The layout of the Data And Analytics View.").optional(), + describeDataAndAnalyticsView.withParameter("type", "The container type of the Data And Analytics View.").optional(), describeDataAndAnalyticsView.withParameter("templates", "The result templates of the Data And Analytics View.").optional(), describeDataAndAnalyticsView.withParameter("styles", "An array of result style strings of the Data And Analytics View.").optional(), describeDataAndAnalyticsView.withParameter("fields", "An array of fields of the Data And Analytics View.").optional(), @@ -168,6 +173,7 @@ public void testPatchTheme() throws JsonProcessingException, Exception { responseFields( describeDataAndAnalyticsView.withField("name", "The name of the Data And Analytics View."), describeDataAndAnalyticsView.withField("layout", "The layout of the Data And Analytics View."), + describeDataAndAnalyticsView.withField("type", "The container type of the Data And Analytics View."), describeDataAndAnalyticsView.withSubsection("templates", "The result templates of the Data And Analytics View."), describeDataAndAnalyticsView.withField("styles", "An array of result style strings of the Data And Analytics View."), describeDataAndAnalyticsView.withField("fields", "An array of fields of the Data And Analytics View."), @@ -206,6 +212,7 @@ public void testGetDataAndAnalyticsView() throws JsonProcessingException, Except responseFields( describeDataAndAnalyticsView.withField("name", "The name of the Data And Analytics View."), describeDataAndAnalyticsView.withField("layout", "The layout of the Data And Analytics View."), + describeDataAndAnalyticsView.withField("type", "The container type of the Data And Analytics View."), describeDataAndAnalyticsView.withSubsection("templates", "The result templates of the Data And Analytics View."), describeDataAndAnalyticsView.withField("styles", "An array of result style strings of the Data And Analytics View."), describeDataAndAnalyticsView.withField("fields", "An array of fields of the Data And Analytics View."), diff --git a/src/test/java/edu/tamu/scholars/middleware/view/model/DataAndAnalyticsViewTest.java b/src/test/java/edu/tamu/scholars/middleware/view/model/DataAndAnalyticsViewTest.java index d1c1e8ff3..07c6be391 100644 --- a/src/test/java/edu/tamu/scholars/middleware/view/model/DataAndAnalyticsViewTest.java +++ b/src/test/java/edu/tamu/scholars/middleware/view/model/DataAndAnalyticsViewTest.java @@ -37,6 +37,7 @@ public void testGettersAndSetters() { assertEquals(1L, dataAndAnalyticsView.getId(), 1); assertEquals(MOCK_VIEW_NAME, dataAndAnalyticsView.getName()); assertEquals(Layout.GRID, dataAndAnalyticsView.getLayout()); + assertEquals(ContainerType.PROFILE_SUMMARIES_EXPORT, dataAndAnalyticsView.getType()); assertTrue(dataAndAnalyticsView.getTemplates().containsKey("default")); assertEquals("

Element template from WSYWIG

", dataAndAnalyticsView.getTemplates().get("default")); From d9d239661d472cf833308b50c4607c63115c267d Mon Sep 17 00:00:00 2001 From: William Welling Date: Mon, 14 Aug 2023 17:24:10 -0500 Subject: [PATCH 4/7] Add eof newline to data and analytics default yaml --- src/main/resources/defaults/dataAndanalyticViews.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/defaults/dataAndanalyticViews.yml b/src/main/resources/defaults/dataAndanalyticViews.yml index 2fb23cf19..a6ad7f774 100644 --- a/src/main/resources/defaults/dataAndanalyticViews.yml +++ b/src/main/resources/defaults/dataAndanalyticViews.yml @@ -7,4 +7,4 @@ type: QUANTITY_DISTRIBUTION - name: Download Profile Summaries by Department layout: CONTAINER - type: PROFILE_SUMMARIES_EXPORT \ No newline at end of file + type: PROFILE_SUMMARIES_EXPORT From aaa8bead9a59cfc5bcd21d0ab4cc97c64337cc4d Mon Sep 17 00:00:00 2001 From: William Welling Date: Mon, 14 Aug 2023 20:34:00 -0500 Subject: [PATCH 5/7] Update export view names --- .../export/controller/IndividualExportController.java | 9 ++++----- src/main/resources/defaults/displayViews.yml | 8 ++++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/edu/tamu/scholars/middleware/export/controller/IndividualExportController.java b/src/main/java/edu/tamu/scholars/middleware/export/controller/IndividualExportController.java index 01a707361..966cd468f 100644 --- a/src/main/java/edu/tamu/scholars/middleware/export/controller/IndividualExportController.java +++ b/src/main/java/edu/tamu/scholars/middleware/export/controller/IndividualExportController.java @@ -56,17 +56,16 @@ public ResponseEntity export( @Override public IndividualModel process(IndividualModel resource) { - // TODO: figure out how to add links from appropriate display view export views Individual individual = resource.getContent(); if (individual != null) { if (individual.getProxy().equals(Person.class.getSimpleName())) { addResource(resource, new ResourceLink(individual, "docx", "Single Page Bio", "Individual single page bio export")); addResource(resource, new ResourceLink(individual, "docx", "Profile Summary", "Individual profile summary export")); - addResource(resource, new ResourceLink(individual, "zip", "5 Year Publications", "Individual 5 year publications export")); - addResource(resource, new ResourceLink(individual, "zip", "8 Year Publications", "Individual 8 year publications export")); + addResource(resource, new ResourceLink(individual, "zip", "Last 5 Years", "Individual 5 year publications export")); + addResource(resource, new ResourceLink(individual, "zip", "Last 8 Years", "Individual 8 year publications export")); } else if (individual.getProxy().equals(Organization.class.getSimpleName())) { - addResource(resource, new ResourceLink(individual, "zip", "5 Year Publications", "Organization 5 year publications export")); - addResource(resource, new ResourceLink(individual, "zip", "8 Year Publications", "Organization 8 year publications export")); + addResource(resource, new ResourceLink(individual, "zip", "Last 5 Years", "Organization 5 year publications export")); + addResource(resource, new ResourceLink(individual, "zip", "Last 8 Years", "Organization 8 year publications export")); } } diff --git a/src/main/resources/defaults/displayViews.yml b/src/main/resources/defaults/displayViews.yml index 4b9f88459..1f0589891 100644 --- a/src/main/resources/defaults/displayViews.yml +++ b/src/main/resources/defaults/displayViews.yml @@ -77,7 +77,7 @@ - field: class value: Relationship AND type:Grant opKey: EXPRESSION - - name: 5 Year Publications + - name: Last 5 Years contentTemplate: "defaults/displayViews/persons/5YearPublicationsContentTemplate.html" headerTemplate: "defaults/displayViews/emptyHeaderTemplate.html" lazyReferences: @@ -127,7 +127,7 @@ - field: class value: Relationship AND type:Grant opKey: EXPRESSION - - name: 8 Year Publications + - name: Last 8 Years contentTemplate: "defaults/displayViews/persons/8YearPublicationsContentTemplate.html" headerTemplate: "defaults/displayViews/emptyHeaderTemplate.html" lazyReferences: @@ -930,7 +930,7 @@ asideTemplate: "defaults/displayViews/organizations/asideTemplate.html" asideLocation: RIGHT exportViews: - - name: 5 Year Publications + - name: Last 5 Years contentTemplate: "defaults/displayViews/persons/5YearPublicationsContentTemplate.html" headerTemplate: "defaults/displayViews/emptyHeaderTemplate.html" multipleReference: @@ -987,7 +987,7 @@ - field: class value: Relationship AND type:Grant opKey: EXPRESSION - - name: 8 Year Publications + - name: Last 8 Years contentTemplate: "defaults/displayViews/persons/8YearPublicationsContentTemplate.html" headerTemplate: "defaults/displayViews/emptyHeaderTemplate.html" multipleReference: From 467ec6f8552239f629f7d3cd948cc7e687cd70e8 Mon Sep 17 00:00:00 2001 From: William Welling Date: Tue, 15 Aug 2023 09:53:04 -0500 Subject: [PATCH 6/7] Fix analytics endpoint mapping for academicAge --- .../discovery/controller/IndividualAnalyticsController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/tamu/scholars/middleware/discovery/controller/IndividualAnalyticsController.java b/src/main/java/edu/tamu/scholars/middleware/discovery/controller/IndividualAnalyticsController.java index d58a4c7c2..72e82e1ca 100644 --- a/src/main/java/edu/tamu/scholars/middleware/discovery/controller/IndividualAnalyticsController.java +++ b/src/main/java/edu/tamu/scholars/middleware/discovery/controller/IndividualAnalyticsController.java @@ -26,7 +26,7 @@ public class IndividualAnalyticsController { private IndividualRepo repo; @PreAuthorize("hasRole('ROLE_ADMIN')") - @GetMapping("/aca") + @GetMapping("/academicAge") public ResponseEntity academicAge( QueryArg query, List filters, From 24398cae3f9443c097a1118df5ff0e9bc43b86b4 Mon Sep 17 00:00:00 2001 From: William Welling Date: Tue, 15 Aug 2023 09:54:09 -0500 Subject: [PATCH 7/7] Remove authorize for now --- .../discovery/controller/IndividualAnalyticsController.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/tamu/scholars/middleware/discovery/controller/IndividualAnalyticsController.java b/src/main/java/edu/tamu/scholars/middleware/discovery/controller/IndividualAnalyticsController.java index 72e82e1ca..f3856b2d1 100644 --- a/src/main/java/edu/tamu/scholars/middleware/discovery/controller/IndividualAnalyticsController.java +++ b/src/main/java/edu/tamu/scholars/middleware/discovery/controller/IndividualAnalyticsController.java @@ -4,19 +4,18 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import edu.tamu.scholars.middleware.discovery.argument.DiscoveryQuantityDistributionDescriptor; import edu.tamu.scholars.middleware.discovery.argument.DiscoveryAcademicAgeDescriptor; +import edu.tamu.scholars.middleware.discovery.argument.DiscoveryQuantityDistributionDescriptor; import edu.tamu.scholars.middleware.discovery.argument.FilterArg; import edu.tamu.scholars.middleware.discovery.argument.QueryArg; import edu.tamu.scholars.middleware.discovery.model.repo.IndividualRepo; -import edu.tamu.scholars.middleware.discovery.response.DiscoveryQuantityDistribution; import edu.tamu.scholars.middleware.discovery.response.DiscoveryAcademicAge; +import edu.tamu.scholars.middleware.discovery.response.DiscoveryQuantityDistribution; @RestController @RequestMapping("/individual/analytics") @@ -25,7 +24,6 @@ public class IndividualAnalyticsController { @Autowired private IndividualRepo repo; - @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/academicAge") public ResponseEntity academicAge( QueryArg query,