def __call__(self): """We have to override this because ECAS datasets come in with unpredictable RDF types. """ context = aq_inner(self.context) catalog = getToolByName(context, "portal_catalog") wfTool = getToolByName(context, "portal_workflow") rdfDataSource, dsSumDataSource = context.rdfDataSource, context.dsSumDataSource if dsSumDataSource: context.dataSummary = self.getSummaryData(dsSumDataSource) if not rdfDataSource: raise RDFIngestException(_(u"This folder has no RDF data source URL.")) normalizerFunction = queryUtility(IIDNormalizer).normalize graph = ConjunctiveGraph() graph.parse(URLInputSource(rdfDataSource)) statements = self._parseRDF(graph) createdObjects = [] for uri, predicates in statements.items(): objectID = self._generateID(uri, predicates, normalizerFunction) title = self._generateTitle(uri, predicates) if objectID in context.objectIds(): dataset = context[objectID] else: dataset = context[context.invokeFactory("Dataset", objectID)] dataset.setTitle(title) updateObject(dataset, uri, predicates, context) createdObjects.append(CreatedObject(dataset)) if _collaborativeGroupURI in predicates: self.updateCollaborativeGroup(dataset, unicode(predicates[_collaborativeGroupURI][0]), catalog) if _protocolPredicateURI in predicates: for proto in [ i.getObject() for i in catalog(identifier=[unicode(i) for i in predicates[_protocolPredicateURI]]) ]: uid = dataset.UID() current = [i.UID() for i in proto.datasets] if uid not in current: current.append(uid) proto.setDatasets(current) proto.datasetNames = proto._computeDatasetNames() proto.reindexObject() if _accessPredicateURI in predicates: groupIDs = [unicode(i) for i in predicates[_accessPredicateURI]] dataset.accessGroups = groupIDs settings = [dict(type="group", roles=[u"Reader"], id=i) for i in groupIDs] sharing = getMultiAdapter((dataset, TestRequest()), name=u"sharing") sharing.update_role_settings(settings) if _organPredicateURI in predicates: bodySystemName = predicates[_organPredicateURI][0].rsplit("/", 1)[-1] organs = self.getBodySysteObj(catalog, bodySystemName) if len(organs) > 0: dataset.setBodySystem(organs[0]) self.publishDataset(wfTool, dataset, predicates) dataset.reindexObject() self.objects = createdObjects return self.render and self.template() or len(self.objects)
from Products.Archetypes import atapi from Products.ATContentTypes.content.schemata import finalizeATCTSchema from Products.CMFCore.utils import getToolByName from eke.ecas.utils import setFacetedNavigation from zope.interface import implements, directlyProvides from eke.knowledge.content import knowledgefolder from zope.schema.interfaces import IVocabularyFactory from zope.schema.vocabulary import SimpleVocabulary DatasetFolderSchema = knowledgefolder.KnowledgeFolderSchema.copy() + atapi.Schema(( atapi.StringField( 'dsSumDataSource', required=False, storage=atapi.AnnotationStorage(), widget=atapi.StringWidget( label=_(u'ECAS Data Summary Statistics Data Source'), description=_(u'URL to a source of summary statistics json that describes biomarker data.'), size=60, ), ), atapi.StringField( 'dataSummary', required=False, storage=atapi.AnnotationStorage(), widget=atapi.StringWidget( label=_(u'ECAS Data Summary Statistics Data'), description=_(u'Summary statistics json that describes biomarker data.'), size=10000, ), ), ))