diff --git a/sanofi/dist/etc/sanofi-dropbox/sanofi-dropbox.py b/sanofi/dist/etc/sanofi-dropbox/sanofi-dropbox.py index b6cbeb3804f5196d201a04611ad4bd3b8d3e6b0f..53bbcaa6bdc7cca56788618ba3c74af316c59be0 100644 --- a/sanofi/dist/etc/sanofi-dropbox/sanofi-dropbox.py +++ b/sanofi/dist/etc/sanofi-dropbox/sanofi-dropbox.py @@ -1,21 +1,60 @@ -import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.MaterialIdentifierCollection as MaterialIdentifierCollection -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria as SearchCriteria -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause as MatchClause -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute as MatchClauseAttribute -import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ScreeningConstants as ScreeningConstants +from ch.systemsx.cisd.common.mail import From + +from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria +from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria import MatchClause, MatchClauseAttribute +from ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1 import MaterialIdentifierCollection + +from ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto import ScreeningConstants PLATE_TYPE = "PLATE" DATA_SET_TYPE = "HCS_IMAGE_RAW" DATA_SET_BATCH_PROPNAME = "ACQUISITION_BATCH" -registeredDataSets = [] +OPENBIS_URL = "https://bwl27.sanofi-aventis.com:8443/openbis" + +EXPERIMENT_RECIPIENTS_PROPNAME = "EMAIL_RECIPIENTS" +DEFAULT_RECIPIENT_LIST = "Matthew.Smicker@sanofi-aventis.com" + +def rollback_transaction(service, transaction, runner, ex): + plateLink = createPlateLink(OPENBIS_URL, plate.getCode()) + errorMessage = ex.getMessage() + sendEmail("openBIS: Data registration failed", """ + + Dear Mr./Mrs. + + Registering new data for plate %(plateLink)s has failed with error '%(errorMessage)s'. + + openBIS + """ % vars()) + +def commit_transaction(service, transaction): + plateLink = createPlateLink(OPENBIS_URL, plate.getCode()) + sendEmail("openBIS: New data registered", """ + + Dear Mr./Mrs. + + New data for the plate %(plateLink)s has been registered. + + Have a nice day! + + openBIS + """ % vars()) -def rollback_transaction(service, tr, runner, ex): - pass +def sendEmail(title, content): + if experiment is not None: + recipientsProp = experiment.getPropertyValue(EXPERIMENT_RECIPIENTS_PROPNAME) + + if not recipientsProp: + recipientsProp = DEFAULT_RECIPIENT_LIST + + recipients = [ email.strip() for email in recipientsProp.split(",") ] + fromAddress = From("openbis@sanofi-aventis.com") + replyTo = None + state.mailClient.sendMessage(title, content, replyTo, fromAddress, recipients) -def commit_transaction(service, tr): - pass +def createPlateLink(openbisUrl, code): + return "<a href='%(openbisUrl)s#entity=SAMPLE&sample_type=PLATE&action=SEARCH&code=%(code)s'>%(code)s</a>" % vars() def findPlateByCode(code): """ @@ -105,8 +144,6 @@ class PlateInitializer: "Plate geometry (width=%i) does not agree with LIBRARY_TEMPLATE (line=%i,width=%i)." % (plateWidth, i, len(csvLists[i])) def parseLibraryTemplate(self): - experimentId = plate.getExperiment().getExperimentIdentifier() - experiment = transaction.getExperiment(experimentId) template = experiment.getPropertyValue(self.LIBRARY_TEMPLATE_PROPNAME) csvLists = [ line.split(",") for line in template.splitlines() ] @@ -231,6 +268,8 @@ dataSet = transaction.createNewDataSet(DATA_SET_TYPE) (batchName, barCode) = parseIncomingDirname(incoming.getName()) dataSet.setPropertyValue(DATA_SET_BATCH_PROPNAME, batchName) plate = findPlateByCode(barCode) +experimentId = plate.getExperiment().getExperimentIdentifier() +experiment = transaction.getExperiment(experimentId) if len(plate.getContainedSamples()) == 0: plateInitializer = PlateInitializer(plate) @@ -238,3 +277,5 @@ if len(plate.getContainedSamples()) == 0: dataSet.setSample(plate) transaction.moveFile(incoming.getAbsolutePath(), dataSet) + +commit_transaction(None, None) \ No newline at end of file diff --git a/sanofi/sourceTest/java/ch/systemsx/cisd/sanofi/dss/test/SanofiDropboxJythonTest.java b/sanofi/sourceTest/java/ch/systemsx/cisd/sanofi/dss/test/SanofiDropboxJythonTest.java index 91757453906b13da254e6a0589e96499e4150f44..54ae5e3f7524277d6cb48f68d033ede3e3922f55 100644 --- a/sanofi/sourceTest/java/ch/systemsx/cisd/sanofi/dss/test/SanofiDropboxJythonTest.java +++ b/sanofi/sourceTest/java/ch/systemsx/cisd/sanofi/dss/test/SanofiDropboxJythonTest.java @@ -28,12 +28,15 @@ import java.util.Map; import java.util.Properties; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang.StringUtils; import org.jmock.Expectations; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import ch.systemsx.cisd.common.eodsql.MockDataSet; import ch.systemsx.cisd.common.filesystem.FileUtilities; +import ch.systemsx.cisd.common.mail.From; +import ch.systemsx.cisd.common.test.AssertionUtil; import ch.systemsx.cisd.common.test.RecordingMatcher; import ch.systemsx.cisd.etlserver.registrator.AbstractJythonDataSetHandlerTest; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria; @@ -72,6 +75,11 @@ public class SanofiDropboxJythonTest extends AbstractJythonDataSetHandlerTest private static final String LIBRARY_TEMPLATE_PROPNAME = "LIBRARY_TEMPLATE"; + private static final String EXPERIMENT_RECIPIENTS_PROPNAME = "EMAIL_RECIPIENTS"; + + private static final String[] EXPERIMENT_RECIPIENTS = new String[] + { "admin@sanofi.com", "mickey@mouse.org" }; + private static final String MATERIAL_TYPE = "COMPOUND_BATCH"; private static final String POSITIVE_CONTROL_TYPE = "POSITIVE_CONTROL"; @@ -123,6 +131,7 @@ public class SanofiDropboxJythonTest extends AbstractJythonDataSetHandlerTest new RecordingMatcher<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails>(); final RecordingMatcher<ListMaterialCriteria> materialCriteria = new RecordingMatcher<ListMaterialCriteria>(); + final RecordingMatcher<String> email = new RecordingMatcher<String>(); context.checking(new Expectations() { { @@ -153,6 +162,10 @@ public class SanofiDropboxJythonTest extends AbstractJythonDataSetHandlerTest one(openBisService).performEntityOperations(with(atomicatOperationDetails)); will(returnValue(new AtomicEntityOperationResult())); + + one(mailClient).sendMessage(with(any(String.class)), with(email), + with(aNull(String.class)), with(any(From.class)), + with(equal(EXPERIMENT_RECIPIENTS))); } }); @@ -182,6 +195,11 @@ public class SanofiDropboxJythonTest extends AbstractJythonDataSetHandlerTest assertEquals(DATA_SET_CODE, dataSet.getCode()); assertEquals(DATA_SET_TYPE, dataSet.getDataSetType()); + AssertionUtil + .assertContains( + "New data for the plate <a href='https://bwl27.sanofi-aventis.com:8443/openbis#entity=SAMPLE" + + "&sample_type=PLATE&action=SEARCH&code=TEST-PLATE'>TEST-PLATE</a> has been registered.", + email.recordedObject()); context.assertIsSatisfied(); } @@ -291,6 +309,8 @@ public class SanofiDropboxJythonTest extends AbstractJythonDataSetHandlerTest ExperimentBuilder experimentBuilder = new ExperimentBuilder(); experimentBuilder.identifier(EXPERIMENT_IDENTIFIER); experimentBuilder.property(LIBRARY_TEMPLATE_PROPNAME, libraryTemplate); + String recipients = StringUtils.join(Arrays.asList(EXPERIMENT_RECIPIENTS), ","); + experimentBuilder.property(EXPERIMENT_RECIPIENTS_PROPNAME, recipients); SampleBuilder sampleBuilder = new SampleBuilder(); sampleBuilder.experiment(experimentBuilder.getExperiment());