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

1from typing import Union 

2 

3from portality import models 

4from portality.lib.ris import RisEntry 

5from portality.models.v1.bibjson import GenericBibJSON 

6 

7 

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)) 

12 

13 

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} 

31 

32class ArticleRisXWalk: 

33 

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