Skip to content

Commit

Permalink
#2734 More work on testing and revising template context generation
Browse files Browse the repository at this point in the history
  • Loading branch information
joemull committed Apr 27, 2022
1 parent 322bf9b commit 1cae818
Show file tree
Hide file tree
Showing 5 changed files with 275 additions and 126 deletions.
115 changes: 75 additions & 40 deletions src/identifiers/logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand All @@ -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 '',
}

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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']
Expand Down
Empty file.
210 changes: 160 additions & 50 deletions src/identifiers/tests/test_logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'] = '[email protected]'
save_setting('Identifiers', 'crossref_email',
self.journal_one, '[email protected]')

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, '[email protected]')
expected_data['depositor_email'] = '[email protected]'
# 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)

Expand Down
Loading

0 comments on commit 1cae818

Please sign in to comment.