Coverage for portality / crosswalks / article_ris.py: 100%
26 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-04 09:41 +0100
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-04 09:41 +0100
1from typing import Union
3from portality import models
4from portality.lib.ris import RisEntry
5from portality.models.v1.bibjson import GenericBibJSON
8def extra_author_names(bibjson) -> list:
9 authors = bibjson.author
10 authors = [a.get("name") for a in authors if a.get("name") is not None]
11 return sorted(set(authors))
14RIS_ARTICLE_MAPPING = {
15 'T1': lambda a: a.title,
16 'AU': extra_author_names,
17 'PY': lambda a: a.year,
18 'JF': lambda a: a.journal_title,
19 'PB': lambda a: a.publisher,
20 'VL': lambda a: a.volume,
21 'IS': lambda a: a.number,
22 'SP': lambda a: a.start_page,
23 'EP': lambda a: a.end_page,
24 'UR': lambda a: [x.get("url") for x in a.get_urls()],
25 'AB': lambda a: a.abstract,
26 'KW': lambda a: a.keywords,
27 'DO': lambda a: a.get_one_identifier(GenericBibJSON.DOI),
28 'SN': lambda a: a.issns(),
29 'LA': lambda a: a.journal_language,
30}
32class ArticleRisXWalk:
34 @classmethod
35 def article2ris(cls, article: models.Article) -> RisEntry:
36 entry = {}
37 bj = article.bibjson()
38 for tag, query in RIS_ARTICLE_MAPPING.items():
39 values = query(bj)
40 if not isinstance(values, list):
41 values = [values]
42 values = [v for v in values if v is not None]
43 for v in values:
44 if tag not in entry:
45 entry[tag] = []
46 entry[tag].append(v)
47 ris = RisEntry.from_dict(entry)
48 ris.type='JOUR'
49 return ris