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 %}