diff --git a/src/identifiers/logic.py b/src/identifiers/logic.py index 3e68502e69..e92bc7653b 100755 --- a/src/identifiers/logic.py +++ b/src/identifiers/logic.py @@ -163,34 +163,6 @@ def create_crossref_doi_batch_context(journal, identifiers): 'crossref_date_suffix', ) - if is_conference: - pass - else: - - crossref_issues = [] - - # First pull out and handle any articles with ISSN overrides - # Also any with custom publication titles - for identifier in identifiers: - if identifier.article.ISSN_override: - print("Oh no") - if identifier.article.publication_title: - print("Oh no") - - for issue in set([identifier.article.issue for identifier in identifiers]): - crossref_issue = {} - crossref_issue['journal'] = create_crossref_journal_context(journal) - crossref_issue['issue'] = issue - - crossref_issue['articles'] = [] - for identifier in identifiers: - article = identifier.article - if article.issue == issue: - article_context = create_crossref_article_context(article, identifier) - crossref_issue['articles'].append(article_context) - - crossref_issues.append(crossref_issue) - template_context = { 'batch_id': uuid4(), 'now': timezone.now(), @@ -203,19 +175,85 @@ def create_crossref_doi_batch_context(journal, identifiers): 'registrant': setting_handler.get_setting('Identifiers', 'crossref_registrant', journal).processed_value, 'is_conference': journal.is_conference, - 'crossref_issues': crossref_issues, } + # Conference + if journal.is_conference: + return + + + # Not a conference, a journal + template_context['crossref_issues'] = create_crossref_issues_context(journal, identifiers) return template_context -def create_crossref_journal_context(journal): +def create_crossref_issues_context(journal, identifiers): + crossref_issues = [] + + # First pull out and handle individually any articles with + # ISSN overrides or custom publication_titles + identifiers_covered = set() + for identifier in identifiers: + article = identifier.article + if article.ISSN_override or article.publication_title: + special_identifier_set = set([identifier]) + identifiers_covered.add(identifier) + issue = article.issue + crossref_issue = create_crossref_issue_context( + journal, + special_identifier_set, + issue, + ISSN_override=article.ISSN_override, + publication_title=article.publication_title, + ) + crossref_issues.append(crossref_issue) + identifiers -= identifiers_covered + + # Then handle the rest + for issue in set([identifier.article.issue for identifier in identifiers]): + crossref_issue = create_crossref_issue_context( + journal, + identifiers, + issue, + ) + crossref_issues.append(crossref_issue) + + return crossref_issues + + +def create_crossref_issue_context( + journal, + identifiers, + issue, + ISSN_override=None, + publication_title=None, +): + crossref_issue = {} + crossref_issue['journal'] = create_crossref_journal_context( + journal, + ISSN_override, + publication_title, + ) + crossref_issue['issue'] = issue + + crossref_issue['articles'] = [] + for identifier in identifiers: + article = identifier.article + if article.issue == issue: + article_context = create_crossref_article_context(article, identifier) + crossref_issue['articles'].append(article_context) + + return crossref_issue + + +def create_crossref_journal_context( + journal, + ISSN_override=None, + publication_title=None +): return { - 'journal_title': ( - article.publication_title - or article.journal.name - ), - 'journal_issn': journal.issn, + 'journal_title': publication_title or journal.name, + 'journal_issn': ISSN_override or journal.issn, 'print_issn': journal.print_issn or '', } @@ -301,11 +339,8 @@ def send_crossref_deposit(test_mode, identifiers, journal=None): error = False + template = 'common/identifiers/crossref_doi_batch_context.xml' template_context = create_crossref_doi_batch_context(journal, identifiers) - - for identifier in identifiers: - article = identifier.article - template_context = create_crossref_context(article, identifier) rendered = render_to_string(template, template_context) logger.debug(rendered) @@ -441,7 +476,7 @@ def preview_registration_information(article): doi = identifier_models.Identifier.objects.get(id_type='doi', article=article) except identifier_models.Identifier.DoesNotExist: doi = None - crossref_context = create_crossref_context(article, doi) + crossref_context = create_crossref_article_context(article, doi) exclude = ['batch_id', 'timestamp', 'depositor_email', 'registrant', 'now', 'timestamp_suffix', 'print_issn', 'citation_list'] diff --git a/src/identifiers/tests/__init__.py b/src/identifiers/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/identifiers/tests/test_logic.py b/src/identifiers/tests/test_logic.py index a3c65c983a..609af27a7e 100644 --- a/src/identifiers/tests/test_logic.py +++ b/src/identifiers/tests/test_logic.py @@ -9,75 +9,185 @@ class TestLogic(TestCase): - def setUp(self): - self.press = helpers.create_press() - self.press.save() - self.journal_one, self.journal_two = helpers.create_journals() - self.request = helpers.Request() - self.request.press = self.press - self.request.journal = self.journal_one - self.article_one = helpers.create_article(self.journal_one) - - def test_create_crossref_context(self): + + @classmethod + def setUpTestData(cls): + + cls.press = helpers.create_press() + cls.press.save() + cls.journal_one, cls.journal_two = helpers.create_journals() + save_setting('general', 'journal_issn', cls.journal_one, '1234-5678') + save_setting('general', 'print_issn', cls.journal_one, '8765-4321') + save_setting('Identifiers', 'use_crossref', cls.journal_one, True) + save_setting('Identifiers', 'crossref_prefix', cls.journal_one, '10.0000') + cls.request = helpers.Request() + cls.request.press = cls.press + cls.request.journal = cls.journal_one + + # Issue 5.3 has one article + cls.issue_five_three = helpers.create_issue(cls.journal_one, volume=5, issue_number=3) + + cls.article_one = helpers.create_article(cls.journal_one) + cls.doi_one = logic.generate_crossref_doi_with_pattern(cls.article_one) + cls.issue_five_three.articles.add(cls.article_one) + cls.article_one.primary_issue = cls.issue_five_three + cls.article_one.abstract = 'Test abstract.' + cls.article_one.snapshot_authors() + cls.article_one.license = submission_models.Licence.objects.filter( + journal=cls.journal_one, + ).first() + cls.article_one.page_numbers = '1-72' + cls.article_one.save() + + cls.issue_five_three.save() + + # Issue 6.1 has two articles that should be registered together + # in a single Crossref journal issue block + cls.issue_six_one = helpers.create_issue(cls.journal_one, volume=6, issue_number=1) + + cls.article_two = helpers.create_article(cls.journal_one) + cls.doi_two = logic.generate_crossref_doi_with_pattern(cls.article_two) + cls.issue_six_one.articles.add(cls.article_two) + cls.article_two.primary_issue = cls.issue_six_one + cls.article_two.save() + + cls.article_three = helpers.create_article(cls.journal_one) + cls.doi_three = logic.generate_crossref_doi_with_pattern(cls.article_three) + cls.issue_six_one.articles.add(cls.article_three) + cls.article_three.primary_issue = cls.issue_six_one + cls.article_three.save() + + # But issue 6.1 also has another couple articles that should be registered individually + # because they have special attributes + cls.article_four = helpers.create_article(cls.journal_one) + cls.article_four.ISSN_override = '5555-5555' + cls.doi_four = logic.generate_crossref_doi_with_pattern(cls.article_four) + cls.issue_six_one.articles.add(cls.article_four) + cls.article_four.primary_issue = cls.issue_six_one + cls.article_four.save() + + cls.article_five = helpers.create_article(cls.journal_one) + cls.article_five.publication_title = 'A Very Special Old Publication' + cls.doi_five = logic.generate_crossref_doi_with_pattern(cls.article_five) + cls.issue_six_one.articles.add(cls.article_five) + cls.article_five.primary_issue = cls.issue_six_one + cls.article_five.save() + + cls.issue_six_one.save() + + def test_create_crossref_doi_batch_context(self): self.maxDiff = None expected_data = {} - self.article_one.abstract = 'Test abstract.' - expected_data['abstract'] = self.article_one.abstract - - expected_data['article_title'] = 'Test Article from Utils Testing Helpers' + expected_data['depositor_email'] = 'sample_email@example.com' + save_setting('Identifiers', 'crossref_email', + self.journal_one, 'sample_email@example.com') - expected_data['article_url'] = self.article_one.url + expected_data['depositor_name'] = 'Journal One' + save_setting('Identifiers', 'crossref_name', + self.journal_one, 'Journal One') - self.article_one.snapshot_authors() - expected_data['authors'] = [author.email for author in self.article_one.frozenauthor_set.all()] + expected_data['registrant'] = 'registrant' + save_setting('Identifiers', 'crossref_registrant', + self.journal_one, 'registrant') - save_setting( - 'Identifiers', 'crossref_prefix', self.journal_one, '10.0000') + expected_data['is_conference'] = self.journal_one.is_conference - expected_data['citation_list'] = None - expected_data['date_accepted'] = None - expected_data['date_published'] = None + context = logic.create_crossref_doi_batch_context( + self.journal_one, + set([self.doi_one]) + ) - save_setting( - 'Identifiers', 'crossref_email', self.journal_one, 'sample_email@example.com') - expected_data['depositor_email'] = 'sample_email@example.com' + # A couple things need to be adjusted with context for test to work + for key in ['batch_id', 'now', 'timestamp', 'timestamp_suffix']: + context.pop(key) - save_setting( - 'Identifiers', 'crossref_name', self.journal_one, 'Journal One') - expected_data['depositor_name'] = 'Journal One' + # Don't test lower levels of nested context in this test + expected_data['crossref_issues'] = [] + if 'crossref_issues' in context: + context['crossref_issues'] = [] - expected_data['doi'] = self.article_one.render_sample_doi() + self.assertEqual(expected_data, context) - self.issue_five_three = helpers.create_issue(self.journal_one) - self.issue_five_three.articles.add(self.article_one) - expected_data['issue'] = self.issue_five_three - expected_data['journal_issn'] = '0000-0000' - expected_data['journal_title'] = 'Journal One' - self.article_one.license = submission_models.Licence.objects.filter( - journal=self.journal_one, - ).first() - expected_data['license'] = submission_models.Licence.objects.filter( - journal=self.journal_one, - ).first().url + def test_create_crossef_issues_context(self): + # Just expect the right number of crossref_issues + # each with the right keys + expected_data = [ + {'journal':None,'issue':None,'articles':None} for x in range(4) + ] + + identifiers = set() + identifiers.add(self.doi_one) # Should be on its own in 5.3 + identifiers.add(self.doi_two) # Should go together with below in 6.1 + identifiers.add(self.doi_three) # Should go together with above in 6.1 + identifiers.add(self.doi_four) # Should be on its own due to Article.ISSN_override + identifiers.add(self.doi_five) # Should be on its own due to Article.publication_title + context = logic.create_crossref_issues_context( + self.journal_one, + identifiers, + ) + + # Knock out the lower levels of data + for i, crossref_issue in enumerate(context): + for key in context[i].keys(): + context[i][key] = None - self.article_one.page_numbers = '1-72' - expected_data['pages'] = self.article_one.page_numbers + self.assertEqual(expected_data, context) - expected_data['print_issn'] = '' - save_setting( - 'Identifiers', 'crossref_registrant', self.journal_one, 'registrant') - expected_data['registrant'] = 'registrant' + def test_create_crossref_issue_context(self): + expected_issue = self.issue_five_three + expected_number_of_articles = 1 + context = logic.create_crossref_issue_context( + self.journal_one, + set([self.doi_one]), + self.issue_five_three, + ) + self.assertEqual(expected_issue, context['issue']) + self.assertEqual(expected_number_of_articles, len(context['articles'])) + + expected_issue = self.issue_six_one + expected_number_of_articles = 2 + context = logic.create_crossref_issue_context( + self.journal_one, + set([self.doi_two, self.doi_three]), + self.issue_six_one, + ) + self.assertEqual(expected_issue, context['issue']) + self.assertEqual(expected_number_of_articles, len(context['articles'])) + + + def test_create_crossref_journal_context(self): + expected_data = { + 'journal_title': 'Journal One', + 'journal_issn': '1234-5678', + 'print_issn': '8765-4321', + } + context = logic.create_crossref_journal_context(self.journal_one) + self.assertEqual(expected_data, context) - context = logic.create_crossref_context(self.article_one) + def test_create_crossref_article_context(self): + expected_data = { + 'article_title': self.article_one.title, + 'abstract': self.article_one.abstract, + 'article_url': self.article_one.url, + 'authors': [ + author.email for author in self.article_one.frozenauthor_set.all() + ], + 'citation_list': None, + 'date_accepted': None, + 'date_published': None, + 'doi': self.doi_one.identifier, + 'license': submission_models.Licence.objects.filter( + journal=self.journal_one, + ).first().url, + 'pages': self.article_one.page_numbers + } - # A couple things need to be adjusted with context for test to work + context = logic.create_crossref_article_context(self.article_one) context['authors'] = [author.email for author in context['authors']] - for k in ['batch_id', 'now', 'timestamp', 'timestamp_suffix']: - context.pop(k) self.assertEqual(expected_data, context) diff --git a/src/templates/common/identifiers/crossref_article.xml b/src/templates/common/identifiers/crossref_article.xml index 3bda5240ad..8a6301a37a 100755 --- a/src/templates/common/identifiers/crossref_article.xml +++ b/src/templates/common/identifiers/crossref_article.xml @@ -2,11 +2,11 @@ - {{ article_title }} + {{ article.article_title }} - {% if authors %} + {% if article.authors %} - {% for author in authors %} + {% for author in article.authors %} {% if author.is_corporate %} {{ author.corporate_name }} @@ -26,40 +26,46 @@ {% endfor %} {% endif %} - {% if abstract %} - {{ abstract }} + {% if article.abstract %} + {{ article.abstract }} {% endif %} - {% if date_published %}{{ date_published.month }}{% else %}{{ now.month }}{% endif %} - {% if date_published %}{{ date_published.day }}{% else %}{{ now.day }}{% endif %} - {% if date_published %}{{ date_published.year }}{% else %}{{ now.year }}{% endif %} + {% if article.date_published %} + {{ article.date_published.month }} + {{ article.date_published.day }} + {{ article.date_published.year }} + {% else %} + {{ article.now.month }} + {{ article.now.day }} + {{ article.now.year }} + {% endif %} - {% if date_accepted %} + {% if article.date_accepted %} - {{ date_accepted.month }} - {{ date_accepted.day }} - {{ date_accepted.year }} + {{ article.date_accepted.month }} + {{ article.date_accepted.day }} + {{ article.date_accepted.year }} {% endif %} - {% if license %} + {% if article.license %} - {{ license }} + {{ article.license }} {% endif %} - {{ doi }} - {{ article_url }} + {{ article.doi }} + {{ article.article_url }} - {% if pdf_url %} - {{ pdf_url }} + {% if article.pdf_url %} + {{ article.pdf_url }} {% else %} - {{ article_url }} + {{ article.article_url }} {% endif %} - {% if citation_list %} - {{ citation_list|safe }} + {% if article.citation_list %} + {{ article.citation_list|safe }} {% endif %} diff --git a/src/templates/common/identifiers/crossref_journal_issue.xml b/src/templates/common/identifiers/crossref_journal_issue.xml index 08929e0d20..c010a0d715 100644 --- a/src/templates/common/identifiers/crossref_journal_issue.xml +++ b/src/templates/common/identifiers/crossref_journal_issue.xml @@ -1,34 +1,32 @@ {% extends "common/identifiers/crossref_doi_batch.xml" %} - {{ journal_title }} - {% if print_issn and print_issn != '0000-0000' %} - {{ print_issn }} + {{ crossref_issue.journal_title }} + {% if crossref_issue.print_issn and crossref_issue.print_issn != '0000-0000' %} + {{ crossref_issue.print_issn }} {% endif %} - {% if article.ISSN_override %} - {{ article.ISSN_override }} - {% elif journal_issn and journal_issn != '0000-0000' %} - {{ journal_issn }} + {% if crossref_issue.journal_issn and crossref_issue.journal_issn != '0000-0000' %} + {{ crossref_issue.journal_issn }} {% endif %} -{% if issue and issue.date %} +{% if crossref_issue.issue and crossref_issue.issue.date %} - {% if issue.issue_title %} + {% if crossref_issue.issue.issue_title %} - {{ issue.issue_title }} + {{ crossref_issue.issue.issue_title }} {% endif %} - {{ issue.date.month }} - {{ issue.date.day }} - {{ issue.date.year }} + {{ crossref_issue.issue.date.month }} + {{ crossref_issue.issue.date.day }} + {{ crossref_issue.issue.date.year }} - {{ issue.volume }} + {{ crossref_issue.issue.volume }} - {{ issue.issue }} + {{ crossref_issue.issue.issue }} {% endif %}