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
def _doi(self): return msid2doi(self.manuscript_id)