@@ -210,18 +210,39 @@ def gather_stage(self, harvest_job):
210210 return []
211211
212212 try :
213- source_dataset = model .Package .get (harvest_job .source .id )
214-
215- series_ids , series_mapping = self ._parse_and_collect (
216- parser .dataset_series (),
217- source_dataset ,
218- harvest_job ,
219- guids_in_source ,
220- is_series = True ,
221- collect_series_mapping = True
222- )
223- object_ids += series_ids
224- object_ids += self ._parse_and_collect (parser .datasets (series_mapping ), source_dataset , harvest_job , guids_in_source , is_series = False )
213+
214+ source_dataset = model .Package .get (harvest_job .source .id )
215+
216+ for dataset in parser .datasets ():
217+ if not dataset .get ('name' ):
218+ dataset ['name' ] = self ._gen_new_name (dataset ['title' ])
219+ if dataset ['name' ] in self ._names_taken :
220+ suffix = len ([i for i in self ._names_taken if i .startswith (dataset ['name' ] + '-' )]) + 1
221+ dataset ['name' ] = '{}-{}' .format (dataset ['name' ], suffix )
222+ self ._names_taken .append (dataset ['name' ])
223+
224+ # Unless already set by the parser, get the owner organization (if any)
225+ # from the harvest source dataset
226+ if not dataset .get ('owner_org' ):
227+ if source_dataset .owner_org :
228+ dataset ['owner_org' ] = source_dataset .owner_org
229+
230+ # Try to get a unique identifier for the harvested dataset
231+ guid = self ._get_guid (dataset , source_url = source_dataset .url )
232+
233+ if not guid :
234+ self ._save_gather_error ('Could not get a unique identifier for dataset: {0}' .format (dataset ),
235+ harvest_job )
236+ continue
237+
238+ dataset ['extras' ].append ({'key' : 'guid' , 'value' : guid })
239+ guids_in_source .append (guid )
240+
241+ obj = HarvestObject (guid = guid , job = harvest_job ,
242+ content = json .dumps (dataset ))
243+
244+ obj .save ()
245+ object_ids .append (obj .id )
225246 except Exception as e :
226247 self ._save_gather_error ('Error when processsing dataset: %r / %s' % (e , traceback .format_exc ()),
227248 harvest_job )
@@ -401,70 +422,3 @@ def import_stage(self, harvest_object):
401422 model .Session .commit ()
402423
403424 return True
404-
405- def _parse_and_collect (
406- self ,
407- items ,
408- source_dataset ,
409- harvest_job ,
410- guids_in_source ,
411- is_series = False ,
412- collect_series_mapping = False
413- ):
414- object_ids = []
415- label = "dataset series" if is_series else "dataset"
416- series_mapping = {} if collect_series_mapping else None
417-
418- for item in items :
419- original_title = item .get ("title" , label )
420- if not item .get ("name" ):
421- item ["name" ] = self ._gen_new_name (original_title )
422-
423- if item ["name" ] in self ._names_taken :
424- suffix = len ([i for i in self ._names_taken if i .startswith (item ["name" ] + "-" )]) + 1
425- item ["name" ] = f"{ item ['name' ]} -{ suffix } "
426-
427- self ._names_taken .append (item ["name" ])
428-
429- if not item .get ("owner_org" ) and source_dataset .owner_org :
430- item ["owner_org" ] = source_dataset .owner_org
431-
432- guid = self ._get_guid (item , source_url = source_dataset .url )
433- if not guid :
434- self ._save_gather_error (f"Could not get a unique identifier for { label } : { item } " , harvest_job )
435- continue
436-
437- item .setdefault ("extras" , []).append ({"key" : "guid" , "value" : guid })
438- guids_in_source .append (guid )
439-
440- obj = HarvestObject (guid = guid , job = harvest_job , content = json .dumps (item ))
441- obj .save ()
442- object_ids .append (obj .id )
443-
444- # Store mapping of RDF URI to dataset name if requested
445- if collect_series_mapping :
446- series_uri = item .get ("uri" ) or item .get ("identifier" )
447- if series_uri :
448- # Try to find an existing active dataset series by 'guid' match
449- existing = model .Session .query (model .Package ).\
450- join (model .PackageExtra ).\
451- filter (model .PackageExtra .key == 'guid' ).\
452- filter (model .PackageExtra .value == series_uri ).\
453- filter (model .Package .type == 'dataset_series' ).\
454- filter (model .Package .state == 'active' ).\
455- first ()
456-
457- if existing :
458- item ["name" ] = existing .name
459-
460- series_mapping [str (series_uri )] = {
461- "id" : existing .id if existing else item .get ("id" ),
462- "name" : item ["name" ]
463- }
464-
465-
466- if collect_series_mapping :
467- return object_ids , series_mapping
468-
469- return object_ids
470-
0 commit comments