示例#1
0
文件: rdf.py 项目: EDRN/eke.ecas
    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)
示例#2
0
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,
        ),
    ),
))