Skip to content
This repository was archived by the owner on Sep 16, 2022. It is now read-only.

Commit 2968d16

Browse files
authored
Merge pull request #253 from CSCfi/CSCMETAX-379
CSCMETAX-379:[ADD] special handling of syke datasets for urnresolver
2 parents 900992d + b82a9cb commit 2968d16

File tree

2 files changed

+93
-10
lines changed

2 files changed

+93
-10
lines changed

src/metax_api/api/oaipmh/base/metax_oai_server.py

+31-10
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
from metax_api.models.catalog_record import CatalogRecord
1111
from metax_api.services import CatalogRecordService as CRS
1212

13+
syke_url_prefix_template = 'http://metatieto.ymparisto.fi:8080/geoportal/catalog/search/resource/details.page?uuid=%s'
14+
1315

1416
class MetaxOAIServer(ResumptionOAIPMH):
1517

@@ -48,22 +50,41 @@ def _get_filtered_records(self, set, cursor, batch_size, from_=None, until=None)
4850
query_set = query_set.filter(data_catalog__catalog_json__identifier__in=self._get_default_set_filter())
4951
return query_set[cursor:batch_size]
5052

53+
def _handle_syke_urnresolver_metadata(self, record):
54+
identifiers = []
55+
preferred_identifier = record.research_dataset.get('preferred_identifier')
56+
identifiers.append(preferred_identifier)
57+
for id_obj in record.research_dataset.get('other_identifier', []):
58+
if id_obj.get('notation', '').startswith('{'):
59+
uuid = id_obj['notation']
60+
identifiers.append(syke_url_prefix_template % uuid)
61+
return identifiers
62+
5163
def _get_oai_dc_urnresolver_metadata(self, record):
5264
"""
5365
Preferred identifier is added only for ida and att catalog records
5466
other identifiers are added for all.
67+
68+
Special handling for SYKE catalog.
5569
"""
70+
5671
identifiers = []
57-
identifiers.append(settings.OAI['ETSIN_URL_TEMPLATE'] % record.identifier)
5872

59-
# assuming ida and att catalogs are not harvested
60-
if not record.catalog_is_harvested():
61-
preferred_identifier = record.research_dataset.get('preferred_identifier')
62-
identifiers.append(preferred_identifier)
63-
for id_obj in record.research_dataset.get('other_identifier', []):
64-
if id_obj.get('notation', '').startswith('urn:nbn:fi:csc-kata'):
65-
other_urn = id_obj['notation']
66-
identifiers.append(other_urn)
73+
data_catalog = record.data_catalog.catalog_json.get('identifier')
74+
if data_catalog == 'urn:nbn:fi:att:data-catalog-harvest-syke':
75+
identifiers = self._handle_syke_urnresolver_metadata(record)
76+
77+
else:
78+
identifiers.append(settings.OAI['ETSIN_URL_TEMPLATE'] % record.identifier)
79+
80+
# assuming ida and att catalogs are not harvested
81+
if not record.catalog_is_harvested():
82+
preferred_identifier = record.research_dataset.get('preferred_identifier')
83+
identifiers.append(preferred_identifier)
84+
for id_obj in record.research_dataset.get('other_identifier', []):
85+
if id_obj.get('notation', '').startswith('urn:nbn:fi:csc-kata'):
86+
other_urn = id_obj['notation']
87+
identifiers.append(other_urn)
6788

6889
meta = {
6990
'identifier': identifiers
@@ -189,7 +210,7 @@ def getRecord(self, metadataPrefix, identifier):
189210
"""Implement OAI-PMH verb GetRecord."""
190211
try:
191212
record = CatalogRecord.objects.get(
192-
data_catalog__catalog_json__identifier__in=self._get_default_set_filter(),
213+
# data_catalog__catalog_json__identifier__in=self._get_default_set_filter(),
193214
identifier__exact=identifier
194215
)
195216
except CatalogRecord.DoesNotExist:
+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
from django.core.management import call_command
2+
import lxml.etree
3+
from rest_framework import status
4+
from rest_framework.test import APITestCase
5+
from metax_api.models import CatalogRecord
6+
from metax_api.api.oaipmh.base.metax_oai_server import syke_url_prefix_template
7+
8+
from metax_api.tests.utils import test_data_file_path, TestClassUtils
9+
10+
11+
class SYKEOAIPMHReadTests(APITestCase, TestClassUtils):
12+
13+
_namespaces = {'o': 'http://www.openarchives.org/OAI/2.0/',
14+
'oai_dc': "http://www.openarchives.org/OAI/2.0/oai_dc/",
15+
'dc': "http://purl.org/dc/elements/1.1/",
16+
'dct': "http://purl.org/dc/terms/",
17+
'datacite': 'http://schema.datacite.org/oai/oai-1.0/'}
18+
19+
@classmethod
20+
def setUpClass(cls):
21+
"""
22+
Loaded only once for test cases inside this class.
23+
"""
24+
call_command('loaddata', test_data_file_path, verbosity=0)
25+
super(SYKEOAIPMHReadTests, cls).setUpClass()
26+
27+
def setUp(self):
28+
cr = CatalogRecord.objects.get(pk=1)
29+
cr.data_catalog.catalog_json["identifier"] = "urn:nbn:fi:att:data-catalog-harvest-syke"
30+
cr.data_catalog.force_save()
31+
cr.research_dataset.update({
32+
"preferred_identifier": "urn:nbn:fi:csc-kata20170613100856741858",
33+
"other_identifier": [
34+
{
35+
"notation": "{55AB842F-9CED-4E80-A7E5-07A54F0AE4A4}"
36+
}
37+
]
38+
})
39+
cr.force_save()
40+
self.identifier = cr.identifier
41+
self.pref_identifier = cr.research_dataset['preferred_identifier']
42+
self.dc = cr.data_catalog.catalog_json["identifier"]
43+
self._use_http_authorization()
44+
45+
def _get_results(self, data, xpath):
46+
root = data
47+
if isinstance(data, bytes):
48+
root = lxml.etree.fromstring(data)
49+
return root.xpath(xpath, namespaces=self._namespaces)
50+
51+
def test_get_urn_resolver_record(self):
52+
response = self.client.get(
53+
'/oai/?verb=GetRecord&identifier=%s&metadataPrefix=oai_dc_urnresolver' % self.identifier)
54+
self.assertEqual(response.status_code, status.HTTP_200_OK)
55+
identifiers = self._get_results(response.content,
56+
'//o:record/o:metadata/oai_dc:dc/dc:identifier[text()="%s"]' % self.pref_identifier)
57+
self.assertTrue(len(identifiers) == 1, response.content)
58+
59+
syke_url = syke_url_prefix_template % '{55AB842F-9CED-4E80-A7E5-07A54F0AE4A4}'
60+
identifiers = self._get_results(response.content,
61+
'//o:record/o:metadata/oai_dc:dc/dc:identifier[text()="%s"]' % syke_url)
62+
self.assertTrue(len(identifiers) == 1, response.content)

0 commit comments

Comments
 (0)