1111 SKOS ,
1212 LOCN ,
1313 RDFS ,
14+ SCHEMA ,
15+ TIME ,
1416)
1517
1618
@@ -30,6 +32,47 @@ def graph_from_dataset(self, dataset_dict, dataset_ref):
3032
3133 self ._graph_from_dataset_v2_scheming (dataset_dict , dataset_ref )
3234
35+ def _temporal_interval_details (self , interval_ref ):
36+ details = {}
37+
38+ start = self ._object_value (interval_ref , DCAT .startDate )
39+ end = self ._object_value (interval_ref , DCAT .endDate )
40+
41+ if not (start or end ):
42+ start_nodes = [t for t in self .g .objects (interval_ref , TIME .hasBeginning )]
43+ end_nodes = [t for t in self .g .objects (interval_ref , TIME .hasEnd )]
44+ if start_nodes :
45+ start = self ._object_value_multiple_predicate (
46+ start_nodes [0 ],
47+ [TIME .inXSDDateTimeStamp , TIME .inXSDDateTime , TIME .inXSDDate ],
48+ )
49+ if end_nodes :
50+ end = self ._object_value_multiple_predicate (
51+ end_nodes [0 ],
52+ [TIME .inXSDDateTimeStamp , TIME .inXSDDateTime , TIME .inXSDDate ],
53+ )
54+
55+ if not (start or end ):
56+ start = self ._object_value (interval_ref , SCHEMA .startDate )
57+ end = self ._object_value (interval_ref , SCHEMA .endDate )
58+
59+ if start :
60+ details ["start" ] = start
61+ if end :
62+ details ["end" ] = end
63+
64+ return details
65+
66+ def _temporal_coverage_details (self , dataset_ref ):
67+ temporal_coverage = []
68+
69+ for interval_ref in self .g .objects (dataset_ref , DCT .temporal ):
70+ details = self ._temporal_interval_details (interval_ref )
71+ if details :
72+ temporal_coverage .append (details )
73+
74+ return temporal_coverage
75+
3376 def _parse_dataset_v2_scheming (self , dataset_dict , dataset_ref ):
3477 """
3578 Modify the dataset_dict generated by the euro_dcat_ap and euro_dcat_ap_2
@@ -112,12 +155,14 @@ def _prune_agent_translations(agent_list):
112155 new_extras = []
113156 new_dict = {}
114157 check_name = new_fields_mapping .get (field_name , field_name )
158+ subfield_names = [
159+ subfield ["field_name" ]
160+ for subfield in schema_field ["repeating_subfields" ]
161+ ]
115162 for extra in dataset_dict .get ("extras" , []):
116163 if extra ["key" ].startswith (f"{ check_name } _" ):
117164 subfield = extra ["key" ][extra ["key" ].index ("_" ) + 1 :]
118- if subfield in [
119- f ["field_name" ] for f in schema_field ["repeating_subfields" ]
120- ]:
165+ if subfield in subfield_names :
121166 new_dict [subfield ] = extra ["value" ]
122167 else :
123168 new_extras .append (extra )
@@ -126,8 +171,22 @@ def _prune_agent_translations(agent_list):
126171 new_dict ["geom" ] = extra ["value" ]
127172 else :
128173 new_extras .append (extra )
174+ # Legacy profiles may have already promoted namespaced extras such as
175+ # `temporal_start` to first-level schema fields before we get here.
176+ # Rebuild the repeating structure from those root fields as well.
177+ for subfield in subfield_names :
178+ legacy_field_name = f"{ check_name } _{ subfield } "
179+ value = dataset_dict .get (legacy_field_name )
180+ if value not in (None , "" , [], {}):
181+ new_dict .setdefault (subfield , value )
182+ if field_name == "temporal_coverage" :
183+ temporal_coverage = self ._temporal_coverage_details (dataset_ref )
184+ if temporal_coverage :
185+ dataset_dict [field_name ] = temporal_coverage
186+ dataset_dict ["extras" ] = new_extras
187+ continue
129188 if new_dict :
130- dataset_dict [ field_name ] = [new_dict ]
189+ dataset_dict . setdefault ( field_name , [new_dict ])
131190 dataset_dict ["extras" ] = new_extras
132191
133192 # Contact details
0 commit comments