コード例 #1
0
ファイル: eif_ingestor.py プロジェクト: elifesciences/lax
def import_article(journal, article_data, create=True, update=False):
    if not article_data or not isinstance(article_data, dict):
        raise ValueError("given data to import is empty/invalid")
    expected_keys = ['doi', 'volume', 'path', 'article-type', 'manuscript_id']

    # data wrangling
    try:
        kwargs = subdict(article_data, expected_keys)

        # JATS XML doesn't contain the manuscript ID. derive it from doi
        if 'manuscript_id' not in kwargs and 'doi' in kwargs:
            kwargs['manuscript_id'] = doi2msid(kwargs['doi'])

        elif 'doi' not in kwargs and 'manuscript_id' in kwargs:
            kwargs['doi'] = msid2doi(kwargs['manuscript_id'])

        context = {'article': kwargs['doi']}

        LOG.info("importing Article", extra=context)

        # post process data
        kwargs.update({
            'journal': journal,
            'volume': int(kwargs['volume']),
            'type': kwargs['article-type'],
        })
        delall(kwargs, ['path', 'article-type'])
    except KeyError:
        raise ValueError("expected keys invalid/not present: %s" % ", ".join(expected_keys))

    # attempt to insert
    article_key = subdict(kwargs, ['doi', 'version'])
    try:
        article_obj = models.Article.objects.get(**article_key)
        avobj = import_article_version(article_obj, article_data, create, update)
        LOG.info("Article exists, updating", extra=context)
        for key, val in kwargs.items():
            setattr(article_obj, key, val)
        article_obj.save()
        return article_obj, avobj

    except models.Article.DoesNotExist:
        # we've been told not to create new articles.
        # this is now a legitimate exception
        if not create:
            raise
    article_obj = models.Article(**kwargs)
    article_obj.save()
    avobj = import_article_version(article_obj, article_data, create, update)
    LOG.info("created new Article %s" % article_obj)
    return article_obj, avobj
コード例 #2
0
ファイル: models.py プロジェクト: elifesciences/lax
 def _doi(self):
     return msid2doi(self.manuscript_id)