Skip to content

Commit d50b66d

Browse files
authored
Merge pull request #366 from LabKey/fb_merge_25.3_to_develop
Merge 25.3 to develop
2 parents 99279f5 + 48e39df commit d50b66d

File tree

45 files changed

+1886
-48
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1886
-48
lines changed

SequenceAnalysis/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ dependencies {
4444
BuildUtils.addLabKeyDependency(project: project, config: "apiImplementation", depProjectPath: ":server:modules:LabDevKitModules:laboratory", depProjectConfig: "apiJarFile")
4545
BuildUtils.addLabKeyDependency(project: project, config: "implementation", depProjectPath: ":server:modules:LabDevKitModules:LDK", depProjectConfig: "apiJarFile")
4646
BuildUtils.addLabKeyDependency(project: project, config: "apiImplementation", depProjectPath: ":server:modules:LabDevKitModules:LDK", depProjectConfig: "apiJarFile")
47+
BuildUtils.addLabKeyDependency(project: project, config: "implementation", depProjectPath: ":server:modules:DiscvrLabKeyModules:discvrcore", depProjectConfig: "apiJarFile")
4748
BuildUtils.addExternalDependency(
4849
project,
4950
new ExternalDependency(

SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
import org.labkey.api.data.Table;
7373
import org.labkey.api.data.TableInfo;
7474
import org.labkey.api.data.TableSelector;
75+
import org.labkey.api.discvrcore.annotation.UtilityAction;
7576
import org.labkey.api.exceptions.OptimisticConflictException;
7677
import org.labkey.api.exp.ExperimentException;
7778
import org.labkey.api.exp.api.DataType;
@@ -427,7 +428,8 @@ public void addNavTrail(NavTree tree)
427428
tree.addChild("Analyze Alignments");
428429
}
429430
}
430-
431+
432+
@UtilityAction(label = "Find Orphan Files", description = "This will start a pipeline job that will inspect all files in this folder to identify potential orphan or otherwise unnecessary files")
431433
@RequiresPermission(ReadPermission.class)
432434
public static class FindOrphanFilesAction extends ConfirmAction<Object>
433435
{
@@ -4955,6 +4957,7 @@ public void setOutputFileIds(Integer[] outputFileIds)
49554957
}
49564958
}
49574959

4960+
@UtilityAction(label = "Update ExpData Path", description = "This will update the DataFileUrl on the selected ExpData to the path provided")
49584961
@RequiresSiteAdmin
49594962
public static class UpdateExpDataPathAction extends ConfirmAction<UpdateExpDataPathForm>
49604963
{
@@ -5241,4 +5244,4 @@ public void setDataFileUrl(String dataFileUrl)
52415244
_dataFileUrl = dataFileUrl;
52425245
}
52435246
}
5244-
}
5247+
}

SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisMaintenanceTask.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ private void processContainer(Container c, Logger log) throws IOException, Pipel
300300
if (root != null && !root.isCloudRoot())
301301
{
302302
//first sequences
303+
log.debug("Inspecting sequences");
303304
File sequenceDir = new File(root.getRootPath(), ".sequences");
304305
TableInfo tableRefNtSequences = SequenceAnalysisSchema.getTable(SequenceAnalysisSchema.TABLE_REF_NT_SEQUENCES);
305306
TableSelector ntTs = new TableSelector(tableRefNtSequences, new SimpleFilter(FieldKey.fromString("container"), c.getId()), null);
@@ -342,6 +343,7 @@ private void processContainer(Container c, Logger log) throws IOException, Pipel
342343
}
343344

344345
//then libraries
346+
log.debug("Inspecting genomes");
345347
File libraryDir = SequenceAnalysisManager.get().getReferenceLibraryDir(c);
346348
if (libraryDir != null && libraryDir.exists())
347349
{
@@ -516,6 +518,7 @@ private void processContainer(Container c, Logger log) throws IOException, Pipel
516518
}
517519

518520
//finally outputfiles
521+
log.debug("Inspecting outputs");
519522
TableInfo ti = SequenceAnalysisSchema.getTable(SequenceAnalysisSchema.TABLE_OUTPUTFILES);
520523
TableSelector ts = new TableSelector(ti, Collections.singleton("dataid"), new SimpleFilter(FieldKey.fromString("container"), c.getId()), null);
521524
Set<String> expectedFileNames = new HashSet<>();
@@ -563,6 +566,8 @@ private void processContainer(Container c, Logger log) throws IOException, Pipel
563566
}
564567
}
565568
}
569+
570+
log.debug("done");
566571
}
567572

568573
for (Container child : c.getChildren())

SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceProvider.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -217,30 +217,38 @@ public List<NavItem> getSubjectIdSummary(Container c, User u, String subjectId)
217217
@Override
218218
public List<TabbedReportItem> getTabbedReportItems(Container c, User u)
219219
{
220+
if (!c.getActiveModules().contains(getOwningModule()))
221+
{
222+
return Collections.emptyList();
223+
}
224+
220225
List<TabbedReportItem> items = new ArrayList<>();
221226

222-
NavItem owner = getDataNavItems(c, u).get(0);
227+
NavItem owner = getReportItems(c, u).get(0);
223228
String category = "Sequence Data";
224229
QueryCache cache = new QueryCache();
225230

226231
TabbedReportItem readsets = new QueryTabbedReportItem(cache, this, SequenceAnalysisSchema.SCHEMA_NAME, SequenceAnalysisSchema.TABLE_READSETS, "Sequence Readsets", category);
227232
readsets.setOwnerKey(owner.getPropertyManagerKey());
233+
readsets.setVisible(owner.isVisible(c, u));
228234
items.add(readsets);
229235

230236
TabbedReportItem analyses = new QueryTabbedReportItem(cache, this, SequenceAnalysisSchema.SCHEMA_NAME, SequenceAnalysisSchema.TABLE_ANALYSES, "Sequence Analyses", category);
231237
analyses.setSubjectIdFieldKey(FieldKey.fromString("readset/subjectid"));
232238
analyses.setSampleDateFieldKey(FieldKey.fromString("readset/sampledate"));
233-
analyses.setAllProjectsFieldKey(FieldKey.fromString("readset/allProjectsPivot"));
234-
analyses.setOverlappingProjectsFieldKey(FieldKey.fromString("readset/overlappingProjectsPivot"));
239+
analyses.setKeyOverride("allProjectsFieldName", FieldKey.fromString("readset/allProjectsPivot"));
240+
analyses.setKeyOverride("overlappingProjectsFieldName", FieldKey.fromString("readset/overlappingProjectsPivot"));
235241
analyses.setOwnerKey(owner.getPropertyManagerKey());
242+
analyses.setVisible(owner.isVisible(c, u));
236243
items.add(analyses);
237244

238245
TabbedReportItem outputs = new QueryTabbedReportItem(cache, this, SequenceAnalysisSchema.SCHEMA_NAME, SequenceAnalysisSchema.TABLE_OUTPUTFILES, "Sequence Outputs", category);
239246
outputs.setSubjectIdFieldKey(FieldKey.fromString("readset/subjectid"));
240247
outputs.setSampleDateFieldKey(FieldKey.fromString("readset/sampledate"));
241-
outputs.setAllProjectsFieldKey(FieldKey.fromString("readset/allProjectsPivot"));
242-
outputs.setOverlappingProjectsFieldKey(FieldKey.fromString("readset/overlappingProjectsPivot"));
248+
outputs.setKeyOverride("allProjectsFieldName", FieldKey.fromString("readset/allProjectsPivot"));
249+
outputs.setKeyOverride("overlappingProjectsFieldName", FieldKey.fromString("readset/overlappingProjectsPivot"));
243250
outputs.setOwnerKey(owner.getPropertyManagerKey());
251+
outputs.setVisible(owner.isVisible(c, u));
244252
items.add(outputs);
245253

246254
return items;

SequenceAnalysis/src/org/labkey/sequenceanalysis/pipeline/OrphanFilePipelineJob.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,8 @@ public void getOrphanFilesForContainer(Container c, User u, Set<File> orphanFile
344344
return;
345345
}
346346

347+
348+
getJob().updateStatusForTask();
347349
if (getJob().isCancelled())
348350
{
349351
throw new CancelledException();

Studies/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
resources/credits/jars.txt

Studies/api-src/org/labkey/api/studies/StudiesService.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package org.labkey.api.studies;
22

33
import org.labkey.api.data.Container;
4+
import org.labkey.api.data.TableCustomizer;
45
import org.labkey.api.module.Module;
56
import org.labkey.api.resource.Resource;
67
import org.labkey.api.security.User;
8+
import org.labkey.api.studies.study.EventProvider;
79
import org.labkey.api.util.Path;
810

911
import java.io.IOException;
12+
import java.util.List;
1013

1114
/**
1215
* Created by bimber on 11/3/2016.
@@ -28,4 +31,10 @@ static public void setInstance(StudiesService instance)
2831
abstract public void importFolderDefinition(Container container, User user, Module m, Path sourceFolderDirPath) throws IOException;
2932

3033
abstract public void loadTsv(Resource tsv, String schemaName, User u, Container c);
34+
35+
abstract public void registerEventProvider(EventProvider ep);
36+
37+
abstract public List<EventProvider> getEventProviders(Container c);
38+
39+
abstract public TableCustomizer getStudiesTableCustomizer();
3140
}

Studies/src/org/labkey/studies/query/ResultsOOODisplayColumn.java renamed to Studies/api-src/org/labkey/api/studies/query/ResultsOORDisplayColumn.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.labkey.studies.query;
1+
package org.labkey.api.studies.query;
22

33
import org.apache.commons.lang3.StringUtils;
44
import org.labkey.api.data.ColumnInfo;
@@ -9,9 +9,9 @@
99
import java.text.DecimalFormat;
1010
import java.util.Set;
1111

12-
public class ResultsOOODisplayColumn extends DataColumn
12+
public class ResultsOORDisplayColumn extends DataColumn
1313
{
14-
public ResultsOOODisplayColumn(ColumnInfo col)
14+
public ResultsOORDisplayColumn(ColumnInfo col)
1515
{
1616
super(col);
1717
}
@@ -48,15 +48,15 @@ public Object getDisplayValue(RenderContext ctx)
4848

4949
private FieldKey getOOR()
5050
{
51-
FieldKey oor = FieldKey.fromString("resultOOOIndicator");
52-
if (getBoundColumn() != null)
51+
ColumnInfo col = getBoundColumn();
52+
if (col == null)
5353
{
54-
return FieldKey.fromParts(getBoundColumn().getFieldKey().getParent(), oor);
55-
}
56-
else
57-
{
58-
return oor;
54+
return null;
5955
}
56+
57+
FieldKey oor = FieldKey.fromString(col.getFieldKey().getName() + "OORIndicator");
58+
59+
return getBoundColumn().getFieldKey().getParent() == null ? oor : FieldKey.fromParts(getBoundColumn().getFieldKey().getParent(), oor);
6060
}
6161

6262
@Override
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package org.labkey.api.studies.study;
2+
3+
import org.jetbrains.annotations.Nullable;
4+
import org.labkey.api.data.Container;
5+
import org.labkey.api.data.TableInfo;
6+
import org.labkey.api.module.Module;
7+
import org.labkey.api.query.QueryService;
8+
import org.labkey.api.query.UserSchema;
9+
import org.labkey.api.security.User;
10+
import org.labkey.api.security.permissions.ReadPermission;
11+
12+
import java.util.Collection;
13+
import java.util.Date;
14+
import java.util.HashMap;
15+
import java.util.Map;
16+
17+
public abstract class AbstractEventProvider implements EventProvider
18+
{
19+
private final String _name;
20+
private final String _label;
21+
private final String _description;
22+
private final Module _owner;
23+
24+
public AbstractEventProvider(String name, String label, String description, Module owner)
25+
{
26+
_name = name;
27+
_label = label;
28+
_description = description;
29+
_owner = owner;
30+
}
31+
32+
@Override
33+
public String getDescription()
34+
{
35+
return _description;
36+
}
37+
38+
@Override
39+
public String getLabel()
40+
{
41+
return _label;
42+
}
43+
44+
@Override
45+
public String getName()
46+
{
47+
return _name;
48+
}
49+
50+
@Override
51+
public boolean isAvailable(Container c)
52+
{
53+
return c.getActiveModules().contains(_owner);
54+
}
55+
56+
@Override
57+
public final Map<String, Date> inferDates(Collection<String> subjectList, Container c, User u)
58+
{
59+
Map<String, Date> result = new HashMap<>(inferDatesRaw(subjectList, c, u));
60+
subjectList.forEach(x -> {
61+
if (!result.containsKey(x))
62+
{
63+
result.put(x, null);
64+
}
65+
});
66+
67+
return result;
68+
}
69+
70+
abstract protected Map<String, Date> inferDatesRaw(Collection<String> subjectList, Container c, User u);
71+
72+
protected @Nullable TableInfo getTable(Container c, User u, String schema, String table)
73+
{
74+
UserSchema us = QueryService.get().getUserSchema(u, c, schema);
75+
if (us == null)
76+
{
77+
return null;
78+
}
79+
80+
TableInfo ti = us.getTable("assignment");
81+
if (ti == null || !ti.hasPermission(u, ReadPermission.class))
82+
{
83+
return null;
84+
}
85+
86+
return ti;
87+
}
88+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.labkey.api.studies.study;
2+
3+
import org.labkey.api.data.Container;
4+
import org.labkey.api.security.User;
5+
6+
import java.util.Collection;
7+
import java.util.Date;
8+
import java.util.Map;
9+
10+
/**
11+
* Each study will have a handful of important dates, which are used to define relative dates for each subject/participant.
12+
* The EventProvider classes provide a code-based way to establish the handful of critical dates. This code is executed to populate
13+
* the KeyEvents table, which maps subject/event to date.
14+
*/
15+
public interface EventProvider
16+
{
17+
boolean isAvailable(Container c);
18+
19+
String getName();
20+
21+
String getLabel();
22+
23+
String getDescription();
24+
25+
Map<String, Date> inferDates(Collection<String> subjectList, Container c, User u);
26+
}

0 commit comments

Comments
 (0)