Skip to content

Commit 65d4743

Browse files
authored
Support full data file paths in Signal Data metadata (#921)
1 parent 2bc9b5d commit 65d4743

16 files changed

Lines changed: 222 additions & 59 deletions

File tree

signalData/resources/assay/signalData/domains/result.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
</exp:PropertyDescriptor>
88
<exp:PropertyDescriptor>
99
<exp:Name>DataFile</exp:Name>
10-
<exp:Required>true</exp:Required>
1110
<exp:RangeURI>http://cpas.fhcrc.org/exp/xml#fileLink</exp:RangeURI>
1211
<exp:Label>Data File</exp:Label>
1312
</exp:PropertyDescriptor>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
SELECT core.executeJavaUpgradeCode('updateDataFileField');

signalData/resources/views/signalDataUpload.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<p>Signal Data Files</p>
22
<ol>
33
<li>
4-
Import (or paste) the results file. Data must include a column that has the signal data filename (case-sensitive).
4+
Import (or paste) the results file. Data must include a column that has the signal data filename.
55
<br/><a class="signaldata-upload-templatelink labkey-text-link">Download Spreadsheet Template</a><br/>
66
</li>
77
<li>

signalData/resources/web/signaldata/QCView/DataService.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,9 @@ Ext4.define('LABKEY.SignalData.DataService', {
247247
name = name[0];
248248
var filePath = "";
249249
var dataFile = run.dataRows[r]['DataFile'];
250+
// dataFile values can be empty, indicating no file was uploaded for the results row, ignore these.
251+
if (!dataFile)
252+
continue;
250253

251254
var osDelimiter = '/';
252255
var fileName = dataFile.split(osDelimiter).pop(); //Hack to make fileLink and pipe resolve file

signalData/resources/web/signaldata/UploadView/UploadLog.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Ext4.define('LABKEY.SignalData.UploadLog', {
1616
DATA_FILE: 'DataFile',
1717
FILE_URL: 'DataFileURL',
1818
FILENAME: 'FileName',
19+
1920
constructor: function (config) {
2021
if (!Ext4.ModelManager.isRegistered(this.modelClass)) {
2122
Ext4.define(this.modelClass, {
@@ -54,13 +55,22 @@ Ext4.define('LABKEY.SignalData.UploadLog', {
5455

5556
getFields: function (resultFields) {
5657
if (!this.fields) {
58+
// issue 52421 data file metadata can contain full paths
59+
var fileNameFromPath = function(v, rec) {
60+
if (v.indexOf('/') > -1)
61+
return v.substring(v.lastIndexOf('/') + 1, v.length);
62+
63+
return v.substring(v.lastIndexOf('\\') + 1, v.length);
64+
};
65+
5766
var fields = [];
5867
resultFields.forEach(function (field) {
5968
fields.push({
6069
name: field.name,
61-
type: 'string'
70+
type: 'string',
71+
convert: field.fieldKey === this.DATA_FILE ? fileNameFromPath : null
6272
});
63-
});
73+
}, this);
6474

6575
this.fields = fields.concat([
6676
{name: this.FILE_URL, type: 'string'},
@@ -158,7 +168,10 @@ Ext4.define('LABKEY.SignalData.UploadLog', {
158168
var fileName = row.get(this.DATA_FILE);
159169
var me = this;
160170

161-
//Delete File
171+
// don't delete if no file has been uploaded
172+
if (!row.get(this.UPLOAD_TIME))
173+
return;
174+
162175
this.fileSystem.deletePath({
163176
path: this.fileSystem.concatPaths(this.getFullWorkingPath(), fileName),
164177
isFile: true,

signalData/resources/web/signaldata/UploadView/uploadResultDataForm.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ LABKEY.SignalData.initializeUploadForm = function(metadataFormElId, metadataFile
140140
}],
141141
submit:function(){
142142
LABKEY.Ajax.request({
143+
method: 'POST',
143144
url: LABKEY.ActionURL.buildURL("assay", "assayFileUpload", LABKEY.ActionURL.getContainer()),
144145
params: { protocolId: assay.id, fileName: metadataTSVId + '.txt', fileContent: this.getTsvInput() },
145146
success: function(response) {

signalData/resources/web/signaldata/UploadView/uploadResultFiles.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -376,17 +376,20 @@ LABKEY.SignalData.initializeDataFileUploadForm = function (metadataFormId, eleme
376376

377377
var dataRows = [];
378378
var dataInputs = [];
379-
380379
var rows = uploadLog.getStore().getRange();
381-
382380
var runFolder = getRunFolderName();
381+
383382
rows.forEach(function (row){
384383
var dataRow = {};
385384
row.fields.eachKey(function(key){
386-
dataRow[key] = row.get(key);
385+
386+
// if there was no actual file uploaded, ignore the dataFile field value so we don't
387+
// try to validate on the server
388+
if (key !== uploadLog.DATA_FILE || row.get('file'))
389+
dataRow[key] = row.get(key);
387390
});
388391

389-
if(row.get('file')) {
392+
if (row.get('file')) {
390393
dataRow[uploadLog.DATA_FILE] = decodeURI(dataRow[uploadLog.FILE_URL]).replace('file:','');
391394

392395
dataInputs.push({

signalData/src/org/labkey/signaldata/SignalDataController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.labkey.api.webdav.WebdavResource;
4040
import org.labkey.api.webdav.WebdavService;
4141
import org.labkey.signaldata.assay.SignalDataAssayDataHandler;
42+
import org.labkey.vfs.FileLike;
4243
import org.springframework.validation.BindException;
4344

4445
import java.io.File;
@@ -83,11 +84,10 @@ public ApiResponse execute(Object form, BindException errors) throws Exception
8384
{
8485
containerPath = root.getContainer().getPath();
8586
webdavURL = root.getWebdavURL();
86-
if (!SignalDataAssayDataHandler.NAMESPACE.isEmpty())
87-
webdavURL = webdavURL.resolve(SignalDataAssayDataHandler.NAMESPACE);
87+
webdavURL = webdavURL.resolve(SignalDataAssayDataHandler.NAMESPACE);
8888

8989
//Create folder if needed
90-
File sdFileRoot = new File(root.getRootPath(), SignalDataAssayDataHandler.NAMESPACE);
90+
FileLike sdFileRoot = root.getRootFileLike().resolveChild(SignalDataAssayDataHandler.NAMESPACE);
9191
if(!sdFileRoot.exists())
9292
sdFileRoot.mkdirs();
9393
}

signalData/src/org/labkey/signaldata/SignalDataModule.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,19 @@
1717
package org.labkey.signaldata;
1818

1919
import org.jetbrains.annotations.NotNull;
20+
import org.jetbrains.annotations.Nullable;
2021
import org.labkey.api.data.Container;
21-
import org.labkey.api.module.CodeOnlyModule;
22+
import org.labkey.api.data.UpgradeCode;
23+
import org.labkey.api.module.DefaultModule;
2224
import org.labkey.api.module.ModuleContext;
2325
import org.labkey.api.module.ModuleProperty;
2426
import org.labkey.api.view.WebPartFactory;
2527

2628
import java.util.Collection;
2729
import java.util.Collections;
30+
import java.util.List;
2831

29-
public class SignalDataModule extends CodeOnlyModule
32+
public class SignalDataModule extends DefaultModule
3033
{
3134
public static final String NAME = "SignalData";
3235
public static final String QC_PROVIDER_PROPERTY_NAME = "QCViewProviderModule";
@@ -67,6 +70,30 @@ public void doStartup(ModuleContext moduleContext)
6770
{
6871
}
6972

73+
@Override
74+
public @Nullable Double getSchemaVersion()
75+
{
76+
return 25.001;
77+
}
78+
79+
@Override
80+
public boolean hasScripts()
81+
{
82+
return true;
83+
}
84+
85+
@Override
86+
public @NotNull Collection<String> getSchemaNames()
87+
{
88+
return List.of("signaldata");
89+
}
90+
91+
@Override
92+
public @Nullable UpgradeCode getUpgradeCode()
93+
{
94+
return new SignalDataUpgradeCode();
95+
}
96+
7097
@Override
7198
@NotNull
7299
public Collection<String> getSummary(Container c)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.labkey.signaldata;
2+
3+
import org.apache.logging.log4j.Logger;
4+
import org.labkey.api.assay.AssayProvider;
5+
import org.labkey.api.assay.AssayService;
6+
import org.labkey.api.data.Container;
7+
import org.labkey.api.data.ContainerManager;
8+
import org.labkey.api.data.UpgradeCode;
9+
import org.labkey.api.exp.api.ExpProtocol;
10+
import org.labkey.api.exp.api.ExperimentService;
11+
import org.labkey.api.exp.property.Domain;
12+
import org.labkey.api.exp.property.DomainProperty;
13+
import org.labkey.api.module.Module;
14+
import org.labkey.api.module.ModuleContext;
15+
import org.labkey.api.module.ModuleLoader;
16+
import org.labkey.api.security.User;
17+
import org.labkey.api.util.logging.LogHelper;
18+
19+
public class SignalDataUpgradeCode implements UpgradeCode
20+
{
21+
private static final Logger LOG = LogHelper.getLogger(SignalDataUpgradeCode.class, "SignalData upgrade code");
22+
23+
/**
24+
* Called from signaldata-25.000-25.001.sql
25+
* Updates SignalData assay protocols to make the result domain DataFile field not required.
26+
*/
27+
@SuppressWarnings({"UnusedDeclaration"})
28+
public static void updateDataFileField(ModuleContext ctx) throws Exception
29+
{
30+
Module module = ModuleLoader.getInstance().getModule(SignalDataModule.NAME);
31+
if (module != null)
32+
{
33+
for (Container c : ContainerManager.getAllChildrenWithModule(ContainerManager.getRoot(), module))
34+
{
35+
for (ExpProtocol protocol : ExperimentService.get().getExpProtocols(c))
36+
{
37+
AssayProvider provider = AssayService.get().getProvider(protocol);
38+
if (provider != null && provider.getName().equalsIgnoreCase("Signal Data"))
39+
{
40+
Domain domain = provider.getResultsDomain(protocol, true);
41+
DomainProperty dataFile = domain.getPropertyByName("DataFile");
42+
if (dataFile != null && dataFile.isRequired())
43+
{
44+
LOG.info(String.format("Updating Signal Data assay in folder '%s'", c.getPath()));
45+
dataFile.setRequired(false);
46+
domain.save(User.getAdminServiceUser());
47+
}
48+
}
49+
}
50+
}
51+
}
52+
}
53+
}

0 commit comments

Comments
 (0)