|
17 | 17 | FOAF, |
18 | 18 | ORCID, |
19 | 19 | OSF, |
| 20 | + PROV, |
20 | 21 | ROR, |
21 | 22 | SKOS, |
22 | 23 | DATACITE, |
@@ -128,23 +129,51 @@ def _visit_identifier(self, parent_el, *, doi_override=None): |
128 | 129 | }) |
129 | 130 |
|
130 | 131 | def _visit_creators(self, parent_el, focus_iri): |
131 | | - creator_iris = set(self.basket[focus_iri:DCTERMS.creator]) |
132 | | - if (not creator_iris) and ((focus_iri, RDF.type, OSF.File) in self.basket): |
133 | | - creator_iris.update(self.basket[focus_iri:OSF.hasFileVersion / DCTERMS.creator]) |
134 | | - if not creator_iris: |
135 | | - creator_iris.update(self.basket[focus_iri:OSF.isContainedBy / DCTERMS.creator]) |
136 | | - if not creator_iris: |
137 | | - creator_iris.update(self.basket[focus_iri:DCTERMS.isPartOf / DCTERMS.creator]) |
138 | | - if not creator_iris: |
139 | | - creator_iris.update(self.basket[focus_iri:DCTERMS.contributor]) |
140 | | - if not creator_iris: |
141 | | - creator_iris.update(self.basket[focus_iri:OSF.isContainedBy / DCTERMS.contributor]) |
| 132 | + creator_iris = [] |
| 133 | + |
| 134 | + ordered_contributors = [] |
| 135 | + attribution_refs = list(self.basket[focus_iri:PROV.qualifiedAttribution]) |
| 136 | + for attribution_ref in attribution_refs: |
| 137 | + try: |
| 138 | + order_val = next(self.basket[attribution_ref:OSF.order]) |
| 139 | + except StopIteration: |
| 140 | + # If there is no explicit order, shove it to the end |
| 141 | + order_index = float('inf') |
| 142 | + else: |
| 143 | + try: |
| 144 | + order_index = order_val.toPython() |
| 145 | + except AttributeError: |
| 146 | + order_index = int(order_val) |
| 147 | + try: |
| 148 | + agent_iri = next(self.basket[attribution_ref:PROV.agent]) |
| 149 | + except StopIteration: |
| 150 | + continue |
| 151 | + ordered_contributors.append((order_index, agent_iri)) |
| 152 | + |
| 153 | + if ordered_contributors: |
| 154 | + ordered_contributors.sort(key=lambda pair: pair[0]) |
| 155 | + creator_iris.extend(agent_iri for _, agent_iri in ordered_contributors) |
| 156 | + |
| 157 | + # Fallbacks when there is no explicit OSF ordering |
142 | 158 | if not creator_iris: |
143 | | - creator_iris.update(self.basket[focus_iri:DCTERMS.isPartOf / DCTERMS.contributor]) |
| 159 | + creator_iris = list(self.basket[focus_iri:DCTERMS.creator]) |
| 160 | + if (not creator_iris) and ((focus_iri, RDF.type, OSF.File) in self.basket): |
| 161 | + creator_iris.extend(self.basket[focus_iri:OSF.hasFileVersion / DCTERMS.creator]) |
| 162 | + if not creator_iris: |
| 163 | + creator_iris.extend(self.basket[focus_iri:OSF.isContainedBy / DCTERMS.creator]) |
| 164 | + if not creator_iris: |
| 165 | + creator_iris.extend(self.basket[focus_iri:DCTERMS.isPartOf / DCTERMS.creator]) |
| 166 | + if not creator_iris: |
| 167 | + creator_iris.extend(self.basket[focus_iri:DCTERMS.contributor]) |
| 168 | + if not creator_iris: |
| 169 | + creator_iris.extend(self.basket[focus_iri:OSF.isContainedBy / DCTERMS.contributor]) |
| 170 | + if not creator_iris: |
| 171 | + creator_iris.extend(self.basket[focus_iri:DCTERMS.isPartOf / DCTERMS.contributor]) |
| 172 | + |
144 | 173 | if not creator_iris: |
145 | 174 | raise ValueError(f'gathered no creators or contributors around {focus_iri}') |
146 | 175 | creators_el = self.visit(parent_el, 'creators', is_list=True) |
147 | | - for creator_iri in creator_iris: # TODO: "priority order" |
| 176 | + for creator_iri in creator_iris: |
148 | 177 | creator_el = self.visit(creators_el, 'creator') |
149 | 178 | for name in self.basket[creator_iri:FOAF.name]: |
150 | 179 | self.visit(creator_el, 'creatorName', text=name, attrib={ |
|
0 commit comments