Skip to content

Commit 134a14e

Browse files
authored
Refactor kinship to allow other code to initiate import directly (#933)
* Add action to allow external server to trigger re-import of externally computed kinship data
1 parent 64616f9 commit 134a14e

7 files changed

Lines changed: 158 additions & 2 deletions

File tree

GeneticsCore/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ plugins {
66

77
dependencies {
88
BuildUtils.addLabKeyDependency(project: project, config: "implementation", depProjectPath: ":server:modules:LabDevKitModules:LDK", depProjectConfig: "apiJarFile")
9+
BuildUtils.addLabKeyDependency(project: project, config: "implementation", depProjectPath: ":server:modules:ehrModules:ehr", depProjectConfig: "apiJarFile")
10+
911
BuildUtils.addLabKeyDependency(project: project, config: "modules", depProjectPath: ":server:modules:ehrModules:ehr", depProjectConfig: 'published', depExtension: 'module')
1012
BuildUtils.addLabKeyDependency(project: project, config: "modules", depProjectPath: ":server:modules:LabDevKitModules:LDK", depProjectConfig: 'published', depExtension: 'module')
1113
BuildUtils.addLabKeyDependency(project: project, config: "implementation", depProjectPath: ":server:modules:dataintegration", depProjectConfig: "apiJarFile")
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<etl xmlns="http://labkey.org/etl/xml">
3+
<name>KinshipDataImport</name>
4+
<description>Import PRIMe-seq Kinship Data</description>
5+
<transforms>
6+
<transform id="kinship" type="TaskRefTransformStep">
7+
<taskref ref="org.labkey.GeneticsCore.etl.ImportGeneticsCalculationsStep">
8+
<settings>
9+
10+
</settings>
11+
</taskref>
12+
</transform>
13+
</transforms>
14+
</etl>

GeneticsCore/resources/module.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@
2121
</editPermissions>
2222
<description>This is the containerPath to the folder holding the primary data for Parentage. Use of slashes is very important - it should be in the format '/myProject/folder'</description>
2323
</propertyDescriptor>
24+
<propertyDescriptor name="KinshipDataPath">
25+
<canSetPerContainer>true</canSetPerContainer>
26+
<editPermissions>
27+
<permission>ADMIN</permission>
28+
</editPermissions>
29+
<description>This is the filepath of a folder where externally kinship/inbreeding TSVs calculated externally will be deposited. It is used by the KinshipData ETL to initiate import.</description>
30+
</propertyDescriptor>
2431
</properties>
2532
<clientDependencies>
2633
<dependency path="clientapi/ext4.lib.xml"/>

GeneticsCore/src/org/labkey/GeneticsCore/GeneticsCoreController.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@
44
import org.apache.logging.log4j.Logger;
55
import org.jetbrains.annotations.NotNull;
66
import org.labkey.GeneticsCore.mhc.MhcTaskRef;
7+
import org.labkey.api.action.ApiResponse;
8+
import org.labkey.api.action.ApiSimpleResponse;
79
import org.labkey.api.action.ConfirmAction;
10+
import org.labkey.api.action.MutatingApiAction;
811
import org.labkey.api.action.SpringActionController;
12+
import org.labkey.api.di.DataIntegrationService;
913
import org.labkey.api.security.RequiresPermission;
1014
import org.labkey.api.security.permissions.AdminPermission;
15+
import org.labkey.api.security.permissions.UpdatePermission;
1116
import org.labkey.api.util.HtmlString;
1217
import org.labkey.api.util.URLHelper;
1318
import org.labkey.api.view.HtmlView;
@@ -62,4 +67,26 @@ public URLHelper getSuccessURL(Object o)
6267
return getContainer().getStartURL(getUser());
6368
}
6469
}
70+
71+
72+
@RequiresPermission(UpdatePermission.class)
73+
public static class ImportGeneticsDataAction extends MutatingApiAction<Object>
74+
{
75+
@Override
76+
public ApiResponse execute(Object form, BindException errors)
77+
{
78+
try
79+
{
80+
DataIntegrationService.get().runTransformNow(getContainer(), getUser(), "{GeneticsCore}/KinshipDataImport");
81+
82+
return new ApiSimpleResponse("success", true);
83+
}
84+
catch (Exception e)
85+
{
86+
_log.error("Unable to initiate genetics data import", e);
87+
errors.reject(ERROR_MSG, "Unable to initiate genetics data import");
88+
return null;
89+
}
90+
}
91+
}
6592
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package org.labkey.GeneticsCore.etl;
2+
3+
import org.apache.commons.lang3.StringUtils;
4+
import org.apache.xmlbeans.XmlException;
5+
import org.jetbrains.annotations.NotNull;
6+
import org.labkey.GeneticsCore.GeneticsCoreModule;
7+
import org.labkey.api.data.Container;
8+
import org.labkey.api.data.ContainerManager;
9+
import org.labkey.api.di.TaskRefTask;
10+
import org.labkey.api.ehr.EHRService;
11+
import org.labkey.api.module.Module;
12+
import org.labkey.api.module.ModuleLoader;
13+
import org.labkey.api.module.ModuleProperty;
14+
import org.labkey.api.pipeline.PipelineJob;
15+
import org.labkey.api.pipeline.PipelineJobException;
16+
import org.labkey.api.pipeline.RecordedActionSet;
17+
import org.labkey.api.security.permissions.UpdatePermission;
18+
import org.labkey.api.view.UnauthorizedException;
19+
import org.labkey.api.writer.ContainerUser;
20+
21+
import java.io.File;
22+
import java.util.Collections;
23+
import java.util.List;
24+
import java.util.Map;
25+
26+
public class ImportGeneticsCalculationsStep implements TaskRefTask
27+
{
28+
protected ContainerUser _containerUser;
29+
30+
@Override
31+
public RecordedActionSet run(@NotNull PipelineJob job) throws PipelineJobException
32+
{
33+
Module ehr = ModuleLoader.getInstance().getModule("ehr");
34+
Module geneticsCore = ModuleLoader.getInstance().getModule(GeneticsCoreModule.class);
35+
36+
ModuleProperty mp = ehr.getModuleProperties().get("EHRStudyContainer");
37+
String ehrContainerPath = StringUtils.trimToNull(mp.getEffectiveValue(_containerUser.getContainer()));
38+
if (ehrContainerPath == null)
39+
{
40+
throw new PipelineJobException("EHRStudyContainer has not been set");
41+
}
42+
43+
Container ehrContainer = ContainerManager.getForPath(ehrContainerPath);
44+
if (ehrContainer == null)
45+
{
46+
throw new PipelineJobException("Invalid container: " + ehrContainerPath);
47+
}
48+
49+
if (!_containerUser.getContainer().equals(ehrContainer))
50+
{
51+
throw new PipelineJobException("This ETL can only be run from the EHRStudyContainer");
52+
}
53+
54+
// Downstream import events will get additional permissions checks
55+
if (!ehrContainer.hasPermission(_containerUser.getUser(), UpdatePermission.class))
56+
{
57+
throw new UnauthorizedException();
58+
}
59+
60+
ModuleProperty mp2 = geneticsCore.getModuleProperties().get("KinshipDataPath");
61+
String pipeDirPath = StringUtils.trimToNull(mp2.getEffectiveValue(ehrContainer));
62+
if (pipeDirPath == null)
63+
{
64+
throw new PipelineJobException("Must provide the filepath to import data using the KinshipDataPath module property");
65+
}
66+
67+
File pipeDir = new File(pipeDirPath);
68+
if (!pipeDir.exists())
69+
{
70+
throw new PipelineJobException("Path does not exist: " + pipeDir.getPath());
71+
}
72+
73+
File kinship = new File(pipeDir, "kinship.txt");
74+
if (!kinship.exists())
75+
{
76+
throw new PipelineJobException("File does not exist: " + kinship.getPath());
77+
}
78+
79+
File inbreeding = new File(pipeDir, "inbreeding.txt");
80+
if (!inbreeding.exists())
81+
{
82+
throw new PipelineJobException("File does not exist: " + inbreeding.getPath());
83+
}
84+
85+
EHRService.get().standaloneProcessKinshipAndInbreeding(ehrContainer, _containerUser.getUser(), pipeDir, job.getLogger());
86+
87+
return new RecordedActionSet();
88+
}
89+
90+
@Override
91+
public List<String> getRequiredSettings()
92+
{
93+
return Collections.emptyList();
94+
}
95+
96+
@Override
97+
public void setSettings(Map<String, String> settings) throws XmlException
98+
{
99+
100+
}
101+
102+
@Override
103+
public void setContainerUser(ContainerUser containerUser)
104+
{
105+
_containerUser = containerUser;
106+
}
107+
}

onprc_ehr/resources/queries/onprc_ehr/vet_assignment.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
require("ehr/triggers").initScript(this);
22

33
var triggerHelper = new org.labkey.onprc_ehr.query.ONPRC_EHRTriggerHelper(LABKEY.Security.currentUser.id, LABKEY.Security.currentContainer.id);
4-
var console = require("console");
54

65
EHR.Server.TriggerManager.registerHandlerForQuery(EHR.Server.TriggerManager.Events.COMPLETE, 'onprc_ehr', 'vet_assignment', function(event, helper){
7-
console.log('Complete is called!');
86
// NOTE: the rules behind vet assignment are complicated enough that any change to one row here could
97
// impact a lot of records. Therefore, just redo everything in the cache
108
triggerHelper.recalculateAllVetAssignmentRecords()

onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,6 +1261,7 @@ public void testGeneticsPipeline() throws Exception
12611261
waitAndClickAndWait(Locators.bodyPanel().append(Locator.tagContainingText("a", "EHR Admin Page")));
12621262
waitAndClickAndWait(Locator.tagContainingText("a", "Genetics Calculations"));
12631263
_ext4Helper.checkCheckbox(Ext4Helper.Locators.checkbox(this, "Kinship validation?:"));
1264+
_ext4Helper.checkCheckbox(Ext4Helper.Locators.checkbox(this, "Allow Import During Business Hours?:"));
12641265
Locator loc = Locator.inputByIdContaining("numberfield");
12651266
waitForElement(loc);
12661267
setFormElement(loc, "23");

0 commit comments

Comments
 (0)