Beispiel #1
0
def test_elements():
    """Test simple dc."""
    elements = [
        ('contributors', 'contributor'),
        ('coverage', 'coverage'),
        ('creators', 'creator'),
        ('dates', 'date'),
        ('descriptions', 'description'),
        ('formats', 'format'),
        ('identifiers', 'identifier'),
        ('languages', 'language'),
        ('publishers', 'publisher'),
        ('relations', 'relation'),
        ('rights', 'rights'),
        ('sources', 'source'),
        ('subjects', 'subject'),
        ('titles', 'title'),
        ('types', 'type'),
    ]

    # Test each element individually
    for plural, singular in elements:
        # Test multiple values
        tree = simpledc.dump_etree({plural: ['value 1', 'value 2']})
        elems = tree.xpath(
            '/oai_dc:dc/dc:{0}'.format(singular), namespaces=simpledc.ns)
        assert len(elems) == 2, singular
        assert elems[0].text == 'value 1'
        assert elems[1].text == 'value 2'

        # Test empty values
        tree = simpledc.dump_etree({plural: []})
        elem = tree.xpath(
            '//dc:{0}'.format(singular), namespaces=simpledc.ns)
        assert len(elem) == 0, singular

    # Test all elements together
    data = {}
    for plural, singular in elements:
        data[plural] = ['test 1', 'test 2']

    tree = simpledc.dump_etree(data)
    for plural, singular in elements:
        elems = tree.xpath(
            '/oai_dc:dc/dc:{0}'.format(singular), namespaces=simpledc.ns)
        assert len(elems) == 2, singular
        assert elems[0].text == 'test 1'
        assert elems[1].text == 'test 2'

    # Test tostring
    xml = simpledc.tostring(data)
    for plural, singular in elements:
        assert '<dc:{0}>'.format(singular) in xml
Beispiel #2
0
def test_elements():
    """Test simple dc."""
    elements = [
        ('contributors', 'contributor'),
        ('coverage', 'coverage'),
        ('creators', 'creator'),
        ('dates', 'date'),
        ('descriptions', 'description'),
        ('formats', 'format'),
        ('identifiers', 'identifier'),
        ('languages', 'language'),
        ('publishers', 'publisher'),
        ('relations', 'relation'),
        ('rights', 'rights'),
        ('sources', 'source'),
        ('subjects', 'subject'),
        ('titles', 'title'),
        ('types', 'type'),
    ]

    # Test each element individually
    for plural, singular in elements:
        # Test multiple values
        tree = simpledc.dump_etree({plural: ['value 1', 'value 2']})
        elems = tree.xpath('/oai_dc:dc/dc:{0}'.format(singular),
                           namespaces=simpledc.ns)
        assert len(elems) == 2, singular
        assert elems[0].text == 'value 1'
        assert elems[1].text == 'value 2'

        # Test empty values
        tree = simpledc.dump_etree({plural: []})
        elem = tree.xpath('//dc:{0}'.format(singular), namespaces=simpledc.ns)
        assert len(elem) == 0, singular

    # Test all elements together
    data = {}
    for plural, singular in elements:
        data[plural] = ['test 1', 'test 2']

    tree = simpledc.dump_etree(data)
    for plural, singular in elements:
        elems = tree.xpath('/oai_dc:dc/dc:{0}'.format(singular),
                           namespaces=simpledc.ns)
        assert len(elems) == 2, singular
        assert elems[0].text == 'test 1'
        assert elems[1].text == 'test 2'

    # Test tostring
    xml = simpledc.tostring(data)
    for plural, singular in elements:
        assert '<dc:{0}>'.format(singular) in xml
Beispiel #3
0
    def serialize_oaipmh(self, pid, record):
        """Serialize a single record for OAI-PMH."""
        obj = self.transform_record(pid, record['_source']) \
            if isinstance(record['_source'], Record) \
            else self.transform_search_hit(pid, record)

        return simpledc.dump_etree(obj)
Beispiel #4
0
    def serialize_object_xml(self, obj):
        """Serialize a single record and persistent identifier to etree.

        :param obj: Record instance
        """
        json = self._schema_cls().dump(obj)
        return simpledc.dump_etree(json)
Beispiel #5
0
    def serialize_oaipmh(self, pid, record):
        """Serialize a single record for OAI-PMH."""
        obj = self.transform_record(pid, record['_source']) \
            if isinstance(record['_source'], Record) \
            else self.transform_search_hit(pid, record)

        return simpledc.dump_etree(obj)
Beispiel #6
0
    def serialize_search(self,
                         pid_fetcher,
                         search_result,
                         links=None,
                         item_links_factory=None,
                         **kwargs):
        """Serialize a search result.

        :param pid_fetcher: Persistent identifier fetcher.
        :param search_result: Elasticsearch search result.
        :param links: Dictionary of links to add to response.
        """
        total = search_result['hits']['total']['value']
        sru = search_result['hits'].get('sru', {})
        start_record = sru.get('start_record', 0)
        maximum_records = sru.get('maximum_records', 0)
        query = sru.get('query')
        query_es = sru.get('query_es')
        next_record = start_record + maximum_records + 1

        element = ElementMaker()
        xml_root = element.searchRetrieveResponse()
        if sru:
            xml_root.append(element.version('1.1'))
        xml_root.append(element.numberOfRecords(str(total)))
        xml_records = element.records()

        language = request.args.get('ln', DEFAULT_LANGUAGE)
        for hit in search_result['hits']['hits']:
            record = hit['_source']
            pid = record['pid']
            record = self.transform_search_hit(
                pid=pid,
                record=record,
                links_factory=item_links_factory,
                language=language,
                **kwargs)
            element_record = simpledc.dump_etree(
                record,
                container=self.container_element,
                nsmap=self.namespace,
                attribs=self.container_attribs)
            xml_records.append(element_record)
        xml_root.append(xml_records)

        if sru:
            echoed_search_rr = element.echoedSearchRetrieveRequest()
            if query:
                echoed_search_rr.append(element.query(query))
            if query_es:
                echoed_search_rr.append(element.query_es(query_es))
            if start_record:
                echoed_search_rr.append(element.startRecord(str(start_record)))
            if next_record > 1 and next_record < total:
                echoed_search_rr.append(
                    element.nextRecordPosition(str(next_record)))
            if maximum_records:
                echoed_search_rr.append(
                    element.maximumRecords(str(maximum_records)))
            echoed_search_rr.append(element.recordPacking('XML'))
            xml_root.append(echoed_search_rr)
        # Maybe needed if we use this serialiser directly with documents
        # else:
        #     xml_links = element.links()
        #     self_link = links.get('self')
        #     if self_link:
        #         xml_links.append(element.self(f'{self_link}&format=dc'))
        #     next_link = links.get('next')
        #     if next_link:
        #         xml_links.append(element.next(f'{next_link}&format=dc'))
        #     xml_root.append(xml_links)
        return etree.tostring(xml_root,
                              encoding='utf-8',
                              method='xml',
                              pretty_print=True)