aboutsummaryrefslogtreecommitdiffstats
path: root/fatcat/api_client.py
blob: e371b727e0656f46082ce671eaab0b17b93621a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106

import json
import requests


class FatCatApiClient:

    def __init__(self, host_url):
        self.host_url = host_url
        self.session = requests.Session()

    def get(self, path):
        return self.session.get(self.host_url + path)

    def post(self, path, data=None, headers=None):
        hdrs = {"content-type": "application/json"}
        if headers:
            hdrs.update(headers)
        #if type(data) == dict:
        #    data = json.dumps(data, indent=None).encode('utf-8')
        return self.session.post(self.host_url + path, json=data, headers=hdrs)

    def import_crossref_file(self, json_file):
        eg = self.new_editgroup()
        with open(json_file, 'r') as file:
            for line in file:
                obj = json.loads(line)
                self.import_crossref_dict(obj, editgroup=eg)
        self.accept_editgroup(eg)

    def new_editgroup(self):
        rv = self.post('/v0/editgroup', data=dict(
            editor=1))
        assert rv.status_code == 200
        editgroup_id = rv.json()['id']
        return editgroup_id

    def accept_editgroup(self, eg):
        rv = self.post('/v0/editgroup/{}/accept'.format(eg))
        assert rv.status_code == 200
        return rv

    def import_crossref_dict(self, meta, editgroup=None):

        # creators
        creators = []
        for am in meta['author']:
            c = dict(name="{} {}".format(am['given'], am['family']),
                     sortname="{}, {}".format(am['family'], am['given']),
                     orcid=None)
            creators.append(c)

        # container
        container = dict(
            issn=meta['ISSN'][0],
            name=meta['container-title'][0],
            #container_id=None,
            #sortname=meta['short-container-title'][0])
            publisher=meta['publisher'])
        #rv = self.post('/v0/container', data=container)
        #assert rv.status_code == 200
        #container_id = rv.json()['id']

        # references
        refs = []
        for i, rm in enumerate(meta.get('reference', [])):
            ref = dict(
                doi=rm.get("DOI", None),
                index=i+1,
                # TODO: how to generate a proper stub here from k/v metadata?
                stub="| ".join(rm.values()))
            refs.append(ref)

        # work and release
        title = meta['title'][0]
        rv = self.post('/v0/work',
            data=dict(title=title, editgroup=editgroup)) #work_type="book"
        assert rv.status_code == 200
        work_id = rv.json()['id']

        rv = self.post('/v0/release', data=dict(
            title=title,
            work=work_id,
            # XXX: creators=creators,
            # XXX: refs=refs,
            #container=container_id,
            release_type=meta['type'],
            doi=meta['DOI'],
            date=meta['created']['date-time'],
            license=meta.get('license', [dict(URL=None)])[0]['URL'] or None,
            issue=meta.get('issue', None),
            volume=meta.get('volume', None),
            pages=meta.get('page', None),
            editgroup=editgroup,
            extra=dict(crossref={
                'links': meta.get('link', []),
                'subject': meta['subject'],
                'type': meta['type'],
                'alternative-id': meta.get('alternative-id', [])})))
        assert rv.status_code == 200
        release_id = rv.json()['id']

    def health(self):
        rv = self.get("/health")
        assert rv.status_code == 200
        return rv.json()