7
7
from oaipmh .error import IdDoesNotExistError
8
8
from oaipmh .error import BadArgumentError
9
9
10
- from metax_api .models .catalog_record import CatalogRecord
10
+ from metax_api .models .catalog_record import CatalogRecord , DataCatalog
11
11
from metax_api .services import CatalogRecordService as CRS
12
12
13
13
syke_url_prefix_template = 'http://metatieto.ymparisto.fi:8080/geoportal/catalog/search/resource/details.page?uuid=%s'
16
16
class MetaxOAIServer (ResumptionOAIPMH ):
17
17
18
18
def _is_valid_set (self , set ):
19
- if not set or set == 'urnresolver' or set in settings .OAI ['SET_MAPPINGS' ]:
19
+ if not set or set in [ 'urnresolver' , 'datacatalogs' ] or set in settings .OAI ['SET_MAPPINGS' ]:
20
20
return True
21
21
return False
22
22
@@ -32,16 +32,20 @@ def _get_filtered_records(self, set, cursor, batch_size, from_=None, until=None)
32
32
if not self ._is_valid_set (set ):
33
33
raise BadArgumentError ('invalid set value' )
34
34
35
- query_set = CatalogRecord .objects .all ()
35
+ proxy = CatalogRecord
36
+ if set == 'datacatalogs' :
37
+ proxy = DataCatalog
38
+
39
+ query_set = proxy .objects .all ()
36
40
if from_ and until :
37
- query_set = CatalogRecord .objects .filter (date_modified__gte = from_ , date_modified__lte = until )
41
+ query_set = proxy .objects .filter (date_modified__gte = from_ , date_modified__lte = until )
38
42
elif from_ :
39
- query_set = CatalogRecord .objects .filter (date_modified__gte = from_ )
43
+ query_set = proxy .objects .filter (date_modified__gte = from_ )
40
44
elif until :
41
- query_set = CatalogRecord .objects .filter (date_modified__lte = until )
45
+ query_set = proxy .objects .filter (date_modified__lte = until )
42
46
43
47
if set :
44
- if set == 'urnresolver' :
48
+ if set in [ 'urnresolver' , 'datacatalogs' ] :
45
49
pass
46
50
else :
47
51
query_set = query_set .filter (
@@ -98,72 +102,76 @@ def _get_oaic_dc_value(self, value, lang=None):
98
102
valueDict ['lang' ] = lang
99
103
return valueDict
100
104
101
- def _get_oai_dc_metadata (self , record ):
102
- identifier = self ._get_oaic_dc_value (record .research_dataset .get ('preferred_identifier' ))
105
+ def _get_oai_dc_metadata (self , record , json , type ):
106
+ identifier = []
107
+ if 'preferred_identifier' in json :
108
+ identifier .append (self ._get_oaic_dc_value (json .get ('preferred_identifier' )))
109
+ if 'identifier' in json :
110
+ identifier .append (self ._get_oaic_dc_value (json .get ('identifier' )))
103
111
104
112
title = []
105
- title_data = record . research_dataset .get ('title' , {})
113
+ title_data = json .get ('title' , {})
106
114
for key , value in title_data .items ():
107
115
title .append (self ._get_oaic_dc_value (value , key ))
108
116
109
117
creator = []
110
- creator_data = record . research_dataset .get ('creator' , [])
118
+ creator_data = json .get ('creator' , [])
111
119
for value in creator_data :
112
120
if 'name' in value :
113
121
creator .append (self ._get_oaic_dc_value (value .get ('name' )))
114
122
115
123
subject = []
116
- subject_data = record . research_dataset .get ('keyword' , [])
124
+ subject_data = json .get ('keyword' , [])
117
125
for value in subject_data :
118
126
subject .append (self ._get_oaic_dc_value (value ))
119
- subject_data = record . research_dataset .get ('field_of_science' , [])
127
+ subject_data = json .get ('field_of_science' , [])
120
128
for value in subject_data :
121
129
for key , value2 in value .get ('pref_label' , {}).items ():
122
130
subject .append (self ._get_oaic_dc_value (value2 , key ))
123
- subject_data = record . research_dataset .get ('theme' , [])
131
+ subject_data = json .get ('theme' , [])
124
132
for value in subject_data :
125
133
for key , value2 in value .get ('pref_label' , {}).items ():
126
134
subject .append (self ._get_oaic_dc_value (value2 , key ))
127
135
128
136
desc = []
129
- desc_data = record . research_dataset .get ('description' , [])
137
+ desc_data = json .get ('description' , [])
130
138
for value in desc_data :
131
139
for key , value2 in value .items ():
132
140
desc .append (self ._get_oaic_dc_value (value2 , key ))
133
141
134
142
publisher = []
135
- publisher_data = record . research_dataset .get ('publisher' , {})
143
+ publisher_data = json .get ('publisher' , {})
136
144
for key , value in publisher_data .get ('name' , {}).items ():
137
145
publisher .append (self ._get_oaic_dc_value (value ))
138
146
139
147
contributor = []
140
- contributor_data = record . research_dataset .get ('contributor' , [])
148
+ contributor_data = json .get ('contributor' , [])
141
149
for value in contributor_data :
142
150
if 'name' in value :
143
151
contributor .append (self ._get_oaic_dc_value (value .get ('name' )))
144
152
145
153
date = self ._get_oaic_dc_value (str (record .date_created ))
146
154
147
155
language = []
148
- language_data = record . research_dataset .get ('language' , [])
156
+ language_data = json .get ('language' , [])
149
157
for value in language_data :
150
158
for key , value2 in value .items ():
151
159
language .append (self ._get_oaic_dc_value (value2 ))
152
160
153
161
relation = []
154
- relation_data = record . research_dataset .get ('relation' , [])
162
+ relation_data = json .get ('relation' , [])
155
163
for value in relation_data :
156
164
if 'identifier' in value .get ('entity' , {}):
157
165
relation .append (self ._get_oaic_dc_value (value ['entity' ]['identifier' ]))
158
166
159
167
coverage = []
160
- coverage_data = record . research_dataset .get ('spatial' , [])
168
+ coverage_data = json .get ('spatial' , [])
161
169
for value in coverage_data :
162
170
if 'geographic_name' in value :
163
171
coverage .append (self ._get_oaic_dc_value (value ['geographic_name' ]))
164
172
165
173
rights = []
166
- rights_data = record . research_dataset .get ('access_rights' , {})
174
+ rights_data = json .get ('access_rights' , {})
167
175
for value in rights_data .get ('description' , []):
168
176
for key , value2 in value .items ():
169
177
rights .append (self ._get_oaic_dc_value (value2 , key ))
@@ -172,10 +180,10 @@ def _get_oai_dc_metadata(self, record):
172
180
rights .append (self ._get_oaic_dc_value (value ['identifier' ]))
173
181
174
182
types = []
175
- types .append (self ._get_oaic_dc_value ('Dataset' ))
183
+ types .append (self ._get_oaic_dc_value (type ))
176
184
177
185
meta = {
178
- 'identifier' : [ identifier ] ,
186
+ 'identifier' : identifier ,
179
187
'title' : title ,
180
188
'creator' : creator ,
181
189
'subject' : subject ,
@@ -202,16 +210,16 @@ def _get_oai_datacite_metadata(self, record):
202
210
}
203
211
return meta
204
212
205
- def _get_metadata_for_record (self , record , metadata_prefix ):
213
+ def _get_metadata_for_record (self , record , json , type , metadata_prefix ):
206
214
meta = {}
207
215
208
216
# strip sensitive fields from research_dataset. note: the modified research_dataset
209
217
# is placed back into the record's research_dataset -field. meaning, an accidental call
210
218
# of record.save() would overwrite the original data
211
- record .research_dataset = CRS .strip_catalog_record (record . research_dataset )
219
+ record .research_dataset = CRS .strip_catalog_record (json )
212
220
213
221
if metadata_prefix == 'oai_dc' :
214
- meta = self ._get_oai_dc_metadata (record )
222
+ meta = self ._get_oai_dc_metadata (record , json , type )
215
223
elif metadata_prefix == 'oai_datacite' :
216
224
meta = self ._get_oai_datacite_metadata (record )
217
225
elif metadata_prefix == 'oai_dc_urnresolver' :
@@ -226,9 +234,14 @@ def _get_header_timestamp(self, record):
226
234
timestamp = record .date_created
227
235
return timezone .make_naive (timestamp )
228
236
229
- def _get_oai_item (self , record , metadata_prefix ):
230
- identifier = record .identifier
231
- metadata = self ._get_metadata_for_record (record , metadata_prefix )
237
+ def _get_oai_item (self , identifier , record , metadata_prefix ):
238
+ metadata = self ._get_metadata_for_record (record , record .research_dataset , 'Dataset' , metadata_prefix )
239
+ item = (common .Header ('' , identifier , self ._get_header_timestamp (record ), ['metax' ], False ),
240
+ common .Metadata ('' , metadata ), None )
241
+ return item
242
+
243
+ def _get_oai_catalog_item (self , identifier , record , metadata_prefix ):
244
+ metadata = self ._get_metadata_for_record (record , record .catalog_json , 'Datacatalog' , metadata_prefix )
232
245
item = (common .Header ('' , identifier , self ._get_header_timestamp (record ), ['metax' ], False ),
233
246
common .Metadata ('' , metadata ), None )
234
247
return item
@@ -281,18 +294,24 @@ def listMetadataFormats(self, identifier=None):
281
294
282
295
def listSets (self , cursor = None , batch_size = None ):
283
296
"""Implement OAI-PMH verb ListSets."""
284
- data = []
297
+ data = [( 'datacatalogs' , 'datacatalog' , '' ) ]
285
298
for set_key in settings .OAI ['SET_MAPPINGS' ].keys ():
286
299
data .append ((set_key , set_key , '' ))
287
300
return data
288
301
302
+ def _get_record_identifier (self , record , set ):
303
+ if set == 'datacatalogs' :
304
+ return record .catalog_json ['identifier' ]
305
+ else :
306
+ return record .identifier
307
+
289
308
def listIdentifiers (self , metadataPrefix = None , set = None , cursor = None ,
290
309
from_ = None , until = None , batch_size = None ):
291
310
"""Implement OAI-PMH verb listIdentifiers."""
292
311
records = self ._get_filtered_records (set , cursor , batch_size , from_ , until )
293
312
data = []
294
313
for record in records :
295
- identifier = record . research_dataset . get ( 'preferred_identifier' )
314
+ identifier = self . _get_record_identifier ( record , set )
296
315
data .append (common .Header ('' , identifier , self ._get_header_timestamp (record ), ['metax' ], False ))
297
316
return data
298
317
@@ -302,18 +321,30 @@ def listRecords(self, metadataPrefix=None, set=None, cursor=None, from_=None,
302
321
data = []
303
322
records = self ._get_filtered_records (set , cursor , batch_size , from_ , until )
304
323
for record in records :
305
- data .append (self ._get_oai_item (record , metadataPrefix ))
324
+ identifier = self ._get_record_identifier (record , set )
325
+ if set == 'datacatalogs' :
326
+ data .append (self ._get_oai_catalog_item (identifier , record , metadataPrefix ))
327
+ else :
328
+ data .append (self ._get_oai_item (identifier , record , metadataPrefix ))
306
329
return data
307
330
308
331
def getRecord (self , metadataPrefix , identifier ):
309
332
"""Implement OAI-PMH verb GetRecord."""
310
333
try :
311
- record = CatalogRecord .objects .get (
312
- # data_catalog__catalog_json__identifier__in=self._get_default_set_filter(),
313
- identifier__exact = identifier
314
- )
334
+ if CatalogRecord .objects .filter (identifier__exact = identifier ).exists ():
335
+ record = CatalogRecord .objects .get (identifier__exact = identifier )
336
+ json = record .research_dataset
337
+ type = 'Dataset'
338
+ else :
339
+ record = DataCatalog .objects .get (catalog_json__identifier__exact = identifier )
340
+ json = record .catalog_json
341
+ type = 'Datacatalog'
342
+
315
343
except CatalogRecord .DoesNotExist :
316
344
raise IdDoesNotExistError ("No dataset with id %s available through the OAI-PMH interface." % identifier )
317
- metadata = self ._get_metadata_for_record (record , metadataPrefix )
345
+ except DataCatalog .DoesNotExist :
346
+ raise IdDoesNotExistError ("No datacatalog with id %s available through the OAI-PMH interface." % identifier )
347
+
348
+ metadata = self ._get_metadata_for_record (record , json , type , metadataPrefix )
318
349
return (common .Header ('' , identifier , self ._get_header_timestamp (record ), ['metax' ], False ),
319
350
common .Metadata ('' , metadata ), None )
0 commit comments