From de1b85b87ee2035fc9de6ba280b5677caeaabcf2 Mon Sep 17 00:00:00 2001 From: juanf <juanf> Date: Wed, 10 Dec 2014 13:49:34 +0000 Subject: [PATCH] SSDM-1285 : ELN - Peter Lab Migration SVN: 33014 --- .../petermigration/1/as/definitions.py | 1 - .../drop-boxes/petermigration/migration.py | 152 +++++++++++++----- 2 files changed, 112 insertions(+), 41 deletions(-) diff --git a/plasmid/source/core-plugins/petermigration/1/as/definitions.py b/plasmid/source/core-plugins/petermigration/1/as/definitions.py index 1693894fdc3..2f679851f7d 100644 --- a/plasmid/source/core-plugins/petermigration/1/as/definitions.py +++ b/plasmid/source/core-plugins/petermigration/1/as/definitions.py @@ -351,7 +351,6 @@ siRNADefinition = [ # Data Set Types # documentDefinition = [ - ["NOTES", "General", "Notes", DataType.MULTILINE_VARCHAR, None, "", None, None, False], ["CREATION_DATE", "General", "date created", DataType.TIMESTAMP, None, "", None, None, False], ["MODIFICATION_DATE", "General", "date modified", DataType.TIMESTAMP, None, "", None, None, False], ["INFO", "General", "info", DataType.VARCHAR, None, "", None, None, False], diff --git a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/migration.py b/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/migration.py index 1f045369161..d7674e43958 100644 --- a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/migration.py +++ b/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/migration.py @@ -5,17 +5,11 @@ import definitionsVoc import re import random from datetime import datetime +from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria, SearchSubCriteria import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - import java.lang.Class as Class -import java.sql.Connection as Connection import java.sql.DriverManager as DriverManager -import java.sql.PreparedStatement as PreparedStatement -import java.sql.ResultSet as ResultSet -import java.sql.SQLException as SQLException -import java.util.ArrayList as ArrayList -import java.util.List as List ## ## Generic Process Method @@ -35,7 +29,41 @@ def process(tr): print "FINISH!" ## -## Generic Adaptor Pattern +## Help Methods +## +def setEntityProperties(tr, definition, entity, properties): + for propertyCode, propertyValue in properties.iteritems(): + propertyDefinition = definitions.getPropertyDefinitionByCode(definition, propertyCode) + if propertyValue is not None: + propertyValue = unicode(propertyValue) + + if propertyDefinition is not None and propertyDefinition[3] == DataType.CONTROLLEDVOCABULARY and propertyValue is not None: + possiblePropertyValue = definitionsVoc.getVocaularyTermCodeForVocabularyAndTermLabel(propertyDefinition[4], propertyValue) + if possiblePropertyValue is not None: + propertyValue = possiblePropertyValue + else: #We rely on the Add Hock Terms if is None + #Create new vocabulary term + vocabulary = tr.getVocabularyForUpdate(propertyDefinition[4]) + term = tr.createNewVocabularyTerm() + codeToUse = re.sub(r'\W+','',propertyValue) + labelToUse = propertyValue + if len(codeToUse) is 0: + codeToUse = "None" + str(random.random()) + if len(codeToUse) > 60: + codeToUse = codeToUse[:60] + term.setCode(codeToUse) + term.setLabel(labelToUse) + term.setOrdinal(vocabulary.getTerms().size()) + vocabulary.addTerm(term) + #Uses new vocabulary term + propertyValue = codeToUse + #print "CREATED FOR VOCABULARY " + propertyDefinition[4] + " NEW TERM WITH CODE " + codeToUse + + if propertyDefinition is not None: #Sometimes special fields are added for other purposes, these should not be set + entity.setPropertyValue(propertyCode, propertyValue) + +## +## Generic Pattern ## class EntityAdaptor: entities = None @@ -82,17 +110,36 @@ class OpenBISDTO: ## ## Costumer specific logic ## +experimentCache = {} sampleCache = {} antibodyID2Antibody = {} +def getExperimentForUpdate(experimentIdentifier, experimentType, tr): + if experimentIdentifier not in experimentCache: + #print "Cache failed " + experimentIdentifier + ":" + str(experimentType) + experiment = tr.getExperimentForUpdate(experimentIdentifier) + if experiment is None and experimentType is not None: + #print "Cache Create " + experimentIdentifier + ":" + str(experimentType) + experiment = tr.createNewExperiment(experimentIdentifier, experimentType) + if experiment is not None: + experimentCache[experimentIdentifier] = experiment + else: + pass + #print "Cache hit " + experimentIdentifier + ":" + str(experimentType) + if experimentIdentifier not in experimentCache: + return None + else: + return experimentCache[experimentIdentifier] + def getSampleForUpdate(sampleIdentifier, sampleType, tr): if sampleIdentifier not in sampleCache: print "Cache failed " + sampleIdentifier + ":" + str(sampleType) sample = tr.getSampleForUpdate(sampleIdentifier) if sample is None and sampleType is not None: #print "Cache Create " + sampleIdentifier + ":" + str(sampleType) + experiment = getExperimentForUpdate("/INVENTORY/MATERIALS/" + sampleType, sampleType, tr) sample = tr.createNewSample(sampleIdentifier, sampleType) - + sample.setExperiment(experiment) if sample is not None: sampleCache[sampleIdentifier] = sample else: @@ -139,34 +186,7 @@ class AntibodyAdaptor(FileMakerEntityAdaptor): class AntibodyOpenBISDTO(OpenBISDTO): def write(self, tr): sample = getSampleForUpdate("/INVENTORY/"+self.values["ANTIBODY_ID_NR"],"ANTIBODY", tr) - - for propertyCode, propertyValue in self.values.iteritems(): - propertyDefinition = definitions.getPropertyDefinitionByCode(self.definition, propertyCode) - if propertyValue is not None: - propertyValue = unicode(propertyValue) - - if propertyDefinition[3] == DataType.CONTROLLEDVOCABULARY and propertyValue is not None: - posiblePropertyValue = definitionsVoc.getVocaularyTermCodeForVocabularyAndTermLabel(propertyDefinition[4], propertyValue) - if posiblePropertyValue is not None: - propertyValue = posiblePropertyValue - else: #We rely on the Add Hock Terms if is None - #Create new vocabulary term - vocabulary = tr.getVocabularyForUpdate(propertyDefinition[4]) - term = tr.createNewVocabularyTerm() - codeToUse = re.sub(r'\W+','',propertyValue) - labelToUse = propertyValue - if len(codeToUse) is 0: - codeToUse = "None" + str(random.random()) - if len(codeToUse) > 60: - codeToUse = codeToUse[:60] - term.setCode(codeToUse) - term.setLabel(labelToUse) - term.setOrdinal(vocabulary.getTerms().size()) - vocabulary.addTerm(term) - #Uses new vocabulary term - propertyValue = codeToUse - #print "CREATED FOR VOCABULARY " + propertyDefinition[4] + " NEW TERM WITH CODE " + codeToUse - sample.setPropertyValue(propertyCode, propertyValue) + setEntityProperties(tr, self.definition, sample, self.values); def getIdentifier(self, tr): return self.values["ANTIBODY_ID_NR"] @@ -298,6 +318,57 @@ class AntibodyBoxOpenBISDTO(OpenBISDTO): return False return True +class DocumentsAdaptor(FileMakerEntityAdaptor): + + def init(self): + self.selectQuery = "SELECT * FROM documents" + self.definition = definitions.documentDefinition + FileMakerEntityAdaptor.init(self) + + def addEntity(self, values): + preparedStatement = self.connection.prepareStatement("SELECT GetAs(file, 'FILE') AS fileData FROM documents WHERE serial = ?"); + preparedStatement.setString(1, values["SERIAL"]); + result = preparedStatement.executeQuery(); + + if result.next(): + fileData = result.getBytes("fileData"); + if fileData is not None: + values["*DATA"] = fileData + + self.entities.append(DocumentOpenBISDTO(values, self.definition)) + +class DocumentOpenBISDTO(OpenBISDTO): + def write(self, tr): + sampleIdentifier = "/INVENTORY/"+self.values["ID_NR"]; + dataSetSample = getSampleForUpdate(sampleIdentifier, None, tr) + if dataSetSample is not None: + dataSet = tr.createNewDataSet("DOCUMENT") + dataSet.setSample(dataSetSample) + setEntityProperties(tr, self.definition, dataSet, self.values) + tr.createNewFile(dataSet, "Test") + #incoming = tr.getIncoming() + #tr.moveFile(incoming.getAbsolutePath(), dataSet) + else: + print "Document missing sample: " + sampleIdentifier + + def getIdentifier(self, tr): + return self.values["SERIAL"] + + def getDocumentBySerial(self, tr, serial): + criteria = SearchCriteria() + criteria.setOperator(criteria.SearchOperator.MATCH_ANY_CLAUSES) + criteria.addMatchClause(criteria.MatchClause.createAttributeMatch(criteria.MatchClauseAttribute.TYPE, "DOCUMENT")) + criteria.addMatchClause(criteria.MatchClause.createPropertyMatch("SERIAL", serial)) + datasets = tr.getSearchService().searchForDataSets(criteria) + if datasets: + return datasets[0] + else: + return None + + def isInOpenBIS(self, tr): + dataset = self.getDocumentBySerial(tr, self.values["SERIAL"]) + return dataset is not None + fmConnString = "jdbc:filemaker://127.0.0.1/" fmUser = "designer" fmPass = "seattle" @@ -306,11 +377,12 @@ fmConnStringServer = "jdbc:filemaker://fm.ethz.ch/" fmUserServer= "sistemp" fmPassServer = "ibcimsb2014" -adaptors = [AntibodyAdaptor(fmConnString, fmUser, fmPass, "BOXIT_antibodies_Peter.fmp12"), AntibodyBoxAdaptor(fmConnString, fmUser, fmPass, "BOXIT_antibody_boxes_Peter")] +adaptors = [AntibodyAdaptor(fmConnString, fmUser, fmPass, "BOXIT_antibodies_Peter"), + AntibodyBoxAdaptor(fmConnString, fmUser, fmPass, "BOXIT_antibody_boxes_Peter"), + DocumentsAdaptor(fmConnString, fmUser, fmPass, "BOXIT_documents_Peter")] def createDataHierarchy(tr): inventorySpace = tr.getSpace("INVENTORY") if inventorySpace == None: tr.createNewSpace("INVENTORY", None) - tr.createNewProject("/INVENTORY/MATERIALS") - tr.createNewExperiment("/INVENTORY/MATERIALS/ANTIBODY", "ANTIBODY") \ No newline at end of file + tr.createNewProject("/INVENTORY/MATERIALS") \ No newline at end of file -- GitLab