|
3 | 3 | import logging |
4 | 4 |
|
5 | 5 | import rdflib |
6 | | -from django.core.exceptions import ObjectDoesNotExist |
| 6 | +from django.core.exceptions import ObjectDoesNotExist, ValidationError |
7 | 7 | from django_orghierarchy.models import Organization |
8 | 8 | from rdflib import RDF |
9 | 9 | from rdflib.namespace import DCTERMS, OWL, SKOS |
|
44 | 44 |
|
45 | 45 |
|
46 | 46 | def get_yso_id(subject): |
47 | | - return ':'.join(subject.split('/')[-2:]) |
| 47 | + # we must validate the id, yso API might contain invalid data |
| 48 | + try: |
| 49 | + data_source, origin_id = subject.split('/')[-2:] |
| 50 | + except ValueError: |
| 51 | + raise ValidationError('Subject ' + subject + ' has invalid YSO id') |
| 52 | + if data_source != 'yso': |
| 53 | + raise ValidationError('Subject ' + subject + ' has invalid YSO id') |
| 54 | + return ':'.join((data_source, origin_id)) |
48 | 55 |
|
49 | 56 |
|
50 | 57 | def get_subject(yso_id): |
@@ -137,19 +144,22 @@ def save_keywords(self, graph): |
137 | 144 | labels_to_create = set() |
138 | 145 | for subject, label in graph.subject_objects(SKOS.altLabel): |
139 | 146 | if (subject, RDF.type, SKOS.Concept) in graph: |
140 | | - yid = get_yso_id(subject) |
141 | | - if bulk_mode: |
142 | | - if label.language is not None: |
143 | | - language = label.language |
144 | | - if label.language == 'se': |
145 | | - # YSO doesn't contain se, assume an error. |
146 | | - language = 'sv' |
147 | | - labels_to_create.add((str(label), language)) |
148 | | - keyword_labels.setdefault(yid, []).append(label) |
149 | | - else: |
150 | | - label = self.save_alt_label(label_syncher, graph, label) |
151 | | - if label: |
152 | | - keyword_labels.setdefault(yid, []).append(label) |
| 147 | + try: |
| 148 | + yid = get_yso_id(subject) |
| 149 | + if bulk_mode: |
| 150 | + if label.language is not None: |
| 151 | + language = label.language |
| 152 | + if label.language == 'se': |
| 153 | + # YSO doesn't contain se, assume an error. |
| 154 | + language = 'sv' |
| 155 | + labels_to_create.add((str(label), language)) |
| 156 | + keyword_labels.setdefault(yid, []).append(label) |
| 157 | + else: |
| 158 | + label = self.save_alt_label(label_syncher, graph, label) |
| 159 | + if label: |
| 160 | + keyword_labels.setdefault(yid, []).append(label) |
| 161 | + except ValidationError as e: |
| 162 | + logger.error(e) |
153 | 163 |
|
154 | 164 | if bulk_mode: |
155 | 165 | KeywordLabel.objects.bulk_create([ |
@@ -183,7 +193,10 @@ def save_keywords(self, graph): |
183 | 193 | check_deleted_func=lambda obj: obj.deprecated) |
184 | 194 | save_set = set() |
185 | 195 | for subject in graph.subjects(RDF.type, SKOS.Concept): |
186 | | - self.save_keyword(syncher, graph, subject, keyword_labels, save_set) |
| 196 | + try: |
| 197 | + self.save_keyword(syncher, graph, subject, keyword_labels, save_set) |
| 198 | + except ValidationError as e: |
| 199 | + logger.error(e) |
187 | 200 | syncher.finish(force=self.options['force']) |
188 | 201 |
|
189 | 202 | def save_keyword_label_relationships_in_bulk(self, keyword_labels): |
|
0 commit comments