Skip to content
This repository has been archived by the owner on Feb 27, 2021. It is now read-only.

Reactivate zenodo tests #906

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions backend/tests/test_citeproc.py
Original file line number Diff line number Diff line change
Expand Up @@ -730,8 +730,8 @@ def test_save_doi(self, mock_doi, doi):
# Check if paper is created
assert p.pk >= 1
r = OaiRecord.objects.get(about=p)
assert r.journal_title is not ''
assert r.publisher_name is not ''
assert r.journal_title != ''
assert r.publisher_name != ''


@pytest.mark.usefixtures('db')
Expand Down
3 changes: 1 addition & 2 deletions conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,6 @@ def request_callback(request):
requests_mocker.add_passthru('https://doi-cache.dissem.in/zotero/')
requests_mocker.add_passthru('http://localhost') # Our VNU server runs on localhost
requests_mocker.add_passthru('https://pub.orcid.org/')
requests_mocker.add_passthru('https://sandbox.zenodo.org/')

return requests_mocker

Expand Down Expand Up @@ -298,7 +297,6 @@ def request_callback(request):
requests_mocker.add_passthru('http://doi-cache.dissem.in/zotero/')
requests_mocker.add_passthru('http://localhost') # Our VNU server runs on localhost
requests_mocker.add_passthru('https://pub.orcid.org/')
requests_mocker.add_passthru('https://sandbox.zenodo.org/')

return requests_mocker

Expand Down Expand Up @@ -670,6 +668,7 @@ def load_paper(self, f):
with open(f_name, 'r') as json_file:
data = json.load(json_file)
p = Paper.objects.get_or_create(**data)[0]
p.refresh_from_db()
self.objects.append(p)
return p

Expand Down
35 changes: 33 additions & 2 deletions deposit/protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,18 @@
import traceback
import logging

from itertools import chain

from django.conf import settings
from django.utils.functional import cached_property
from django.utils.translation import ugettext as _
from papers.baremodels import BareOaiRecord

from deposit.forms import BaseMetadataForm
from deposit.models import DEPOSIT_STATUS_CHOICES
from deposit.models import LicenseChooser
from deposit.utils import MetadataConverter
from papers.baremodels import BareOaiRecord
from papers.models import OaiRecord

logger = logging.getLogger('dissemin.' + __name__)

Expand Down Expand Up @@ -135,6 +141,32 @@ def init_deposit(self, paper, user):
self._logs = ''
return True

# Metadata helpers

@cached_property
def metadata(self):
"""
Gives access to a dict of the metadata from the paper and its OaiRecords.
"""
prefered_records = self._get_prefered_records()
mc = MetadataConverter(self.paper, prefered_records)
return mc


def _get_prefered_records(self):
"""
Returns the prefered records, that is CrossRef, then BASE
"""
crossref = OaiRecord.objects.filter(
about=self.paper,
source__identifier='crossref',
)
base = OaiRecord.objects.filter(
about=self.paper,
source__identifier='base'
)
return list(chain(crossref, base))


@staticmethod
def _add_embargo_date_to_deposit_result(deposit_result, form):
Expand Down Expand Up @@ -384,4 +416,3 @@ def get_preferences_form(self, user, *args, **kwargs):
prefs = self.get_preferences(user)
kwargs['instance'] = prefs
return self.preferences_form_class(*args, **kwargs)

82 changes: 27 additions & 55 deletions deposit/sword/protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,9 @@

from datetime import datetime
from io import BytesIO
from itertools import chain
from lxml import etree
from zipfile import ZipFile

from django.utils.functional import cached_property
from django.utils.translation import ugettext as _

from deposit.models import DepositRecord
Expand All @@ -18,11 +16,10 @@
from deposit.protocol import RepositoryProtocol
from deposit.registry import protocol_registry
from deposit.sword.forms import SWORDMETSForm
from deposit.utils import MetadataConverter

from deposit.utils import get_email

from papers.models import Institution
from papers.models import OaiRecord
from papers.models import Researcher
from papers.utils import kill_html

Expand Down Expand Up @@ -63,16 +60,6 @@ class SWORDMETSProtocol(RepositoryProtocol):
# The class of the form for the deposit
form_class = SWORDMETSForm

@cached_property
def paper_metadata(self):
"""
Gives access to a dict of the metadata from the paper and its OaiRecords.
"""
prefered_records = self._get_prefered_records()
mc = MetadataConverter(self.paper, prefered_records)
return mc.metadata()


def _get_deposit_result(self, response):
"""
Processes the deposit result as presented by sword.
Expand Down Expand Up @@ -260,9 +247,9 @@ def _get_xml_dissemin_metadata(self, form):
ds_embargo = etree.SubElement(ds_publication, DS + 'embargoDate')
ds_embargo.text = embargo.isoformat()

if self.paper_metadata.get('romeo_id') is not None:
if self.metadata.romeo_id:
ds_romeo = etree.SubElement(ds_publication, DS + 'romeoId')
ds_romeo.text = self.paper_metadata.get('romeo_id')
ds_romeo.text = self.metadata.romeo_id

return ds

Expand Down Expand Up @@ -291,21 +278,6 @@ def get_form_initial_data(self, **kwargs):
return data


def _get_prefered_records(self):
"""
Returns the prefered records, that is CrossRef, then BASE
"""
crossref = OaiRecord.objects.filter(
about=self.paper,
source__identifier='crossref',
)
base = OaiRecord.objects.filter(
about=self.paper,
source__identifier='base'
)
return list(chain(crossref, base))


def refresh_deposit_status(self):
"""
We refresh all DepositRecords that have the status 'pending'
Expand Down Expand Up @@ -472,18 +444,18 @@ def _get_xml_metadata(self, form):
mods_origin_info = etree.SubElement(mods_xml, MODS + 'originInfo')
mods_date_issued = etree.SubElement(mods_origin_info, MODS + 'dateIssued')
mods_date_issued.set('encoding', 'w3cdtf')
mods_date_issued.text = str(self.paper.pubdate)
mods_date_issued.text = str(self.metadata.pubdate)

# DOI
if self.paper_metadata.get('doi'):
if self.metadata.doi:
mods_doi = etree.SubElement(mods_xml, MODS + 'identifier')
mods_doi.set('type', 'doi')
mods_doi.text = self.paper_metadata.get('doi')
mods_doi.text = self.metadata.doi

# Publisher
if self.paper_metadata.get('publisher'):
if self.metadata.publisher:
mods_publisher = etree.SubElement(mods_origin_info, MODS + 'publisher')
mods_publisher.text = self.paper_metadata.get('publisher')
mods_publisher.text = self.metadata.publisher

# relatedItem
related_item = self._get_xml_metadata_relatedItem()
Expand All @@ -510,28 +482,28 @@ def _get_xml_metadata(self, form):


# Name / Authors list
for author in self.paper.authors:
for author in self.metadata.authors:
mods_name = etree.SubElement(mods_xml, MODS + 'name')
mods_name.set('type', 'personal')
mods_last_name = etree.SubElement(mods_name, MODS + 'namePart')
mods_last_name.set('type', 'family')
mods_last_name.text = author.name.last
mods_last_name.text = author.get('last')
mods_first_name = etree.SubElement(mods_name, MODS + 'namePart')
mods_first_name.set('type', 'given')
mods_first_name.text = author.name.first
if author.orcid is not None:
mods_first_name.text = author.get('first')
if author.get('orcid'):
mods_orcid = etree.SubElement(mods_name, MODS + 'nameIdentifier')
mods_orcid.set('type', 'orcid')
mods_orcid.text = author.orcid
mods_orcid.text = author.get('orcid')

# Title
mods_title_info = etree.SubElement(mods_xml, MODS + 'titleInfo')
mods_title = etree.SubElement(mods_title_info, MODS + 'title')
mods_title.text = self.paper.title
mods_title.text = self.metadata.title

# Document type
mods_type = etree.SubElement(mods_xml, MODS + 'genre')
mods_type.text = self.paper.doctype
mods_type.text = self.metadata.doctype

return mods_xml

Expand All @@ -545,32 +517,32 @@ def _get_xml_metadata_relatedItem(self):
related_item_data = dict()

# Set the journal title
if self.paper_metadata.get('journal'):
if self.metadata.journal:
related_item_title_info = etree.Element(MODS + 'titleInfo')
related_item_title = etree.SubElement(related_item_title_info, MODS + 'title')
related_item_title.text = self.paper_metadata.get('journal')
related_item_title.text = self.metadata.journal
related_item_data['title'] = related_item_title_info

# Set issn
if self.paper_metadata.get('issn'):
if self.metadata.issn:
related_item_issn = etree.Element(MODS + 'identifier')
related_item_issn.set('type', 'issn')
related_item_issn.text = self.paper_metadata.get('issn')
related_item_issn.text = self.metadata.issn
related_item_data['issn'] = related_item_issn

# Set essn
if self.paper_metadata.get('essn'):
if self.metadata.essn:
related_item_eissn = etree.Element(MODS + 'identifier')
related_item_eissn.set('type', 'eissn')
related_item_eissn.text = self.paper_metadata.get('essn')
related_item_eissn.text = self.metadata.essn
related_item_data['eissn'] = related_item_eissn

# relatedItem - part
part = dict()

# Set pages
if self.paper_metadata.get('pages'):
pages = self.paper_metadata.get('pages').split('-', 1)
if self.metadata.pages:
pages = self.metadata.pages.split('-', 1)
related_item_pages = etree.Element(MODS + 'extent')
related_item_pages.set('unit', 'pages')
if len(pages) == 1:
Expand All @@ -587,19 +559,19 @@ def _get_xml_metadata_relatedItem(self):
part['pages'] = related_item_pages

# Set issue
if self.paper_metadata.get('issue'):
if self.metadata.issue:
related_item_issue = etree.Element(MODS + 'detail')
related_item_issue.set('type', 'issue')
related_item_issue_number = etree.SubElement(related_item_issue, MODS + 'number')
related_item_issue_number.text = self.paper_metadata.get('issue')
related_item_issue_number.text = self.metadata.issue
part['issue'] = related_item_issue

# Set volume
if self.paper_metadata.get('volume'):
if self.metadata.volume:
related_item_volume = etree.Element(MODS + 'detail')
related_item_volume.set('type', 'volume')
related_item_volume_number = etree.SubElement(related_item_volume, MODS + 'number')
related_item_volume_number.text = self.paper_metadata.get('volume')
related_item_volume_number.text = self.metadata.volume
part['volume'] = related_item_volume

# Make parts if existing
Expand Down
25 changes: 0 additions & 25 deletions deposit/sword/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@
from deposit.sword.protocol import SWORDMETSProtocol
from deposit.tests.test_protocol import MetaTestProtocol
from dissemin.settings import BASE_DIR
from papers.models import OaiRecord
from papers.models import OaiSource
from papers.models import Researcher
from upload.models import UploadedPDF

Expand Down Expand Up @@ -332,29 +330,6 @@ def test_get_xml_dissemin_metadata(self, db, monkeypatch_paper_is_owned, dissemi
dissemin_xsd_1_0.assertValid(xml)


def test_get_prefered_records(self, dummy_paper):
"""
Tests that only records from CrossRef and BASE are in the list
"""
self.protocol.paper = dummy_paper
crossref = OaiSource.objects.get(identifier='crossref')
base = OaiSource.objects.get(identifier='base')
zenodo = OaiSource.objects.get(identifier='zenodo')
for i in range(3):
for source in [crossref, base, zenodo]:
OaiRecord.objects.create(
about=dummy_paper,
identifier=source.identifier + str(i),
source=source
)
prefered_records = self.protocol._get_prefered_records()
assert len(prefered_records) == 6
for i in range(3):
assert prefered_records[i].source == crossref
for i in range(3,6):
assert prefered_records[i].source == base


@responses.activate
def test_refresh_deposit_status(self, pending_deposit_record, update_status_url):
"""
Expand Down
25 changes: 24 additions & 1 deletion deposit/tests/test_protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ def test_get_bound_form(self, book_god_of_the_labyrinth, abstract_required, ddc,
if embargo == 'required':
data['embargo'] = '2019-10-10'

form = self.protocol.get_bound_form()
form = self.protocol.get_bound_form(data)
if not form.is_valid():
print(form.errors)
raise AssertionError("Form not valid")
Expand All @@ -138,6 +138,29 @@ def test_get_form_return_type(self, book_god_of_the_labyrinth, user_isaac_newton
assert isinstance(form, Form)


def test_get_prefered_records(self, dummy_paper):
"""
Tests that only records from CrossRef and BASE are in the list
"""
self.protocol.paper = dummy_paper
crossref = OaiSource.objects.get(identifier='crossref')
base = OaiSource.objects.get(identifier='base')
zenodo = OaiSource.objects.get(identifier='zenodo')
for i in range(3):
for source in [crossref, base, zenodo]:
OaiRecord.objects.create(
about=dummy_paper,
identifier=source.identifier + str(i),
source=source
)
prefered_records = self.protocol._get_prefered_records()
assert len(prefered_records) == 6
for i in range(3):
assert prefered_records[i].source == crossref
for i in range(3,6):
assert prefered_records[i].source == base


def test_init_deposit(self, user_isaac_newton, book_god_of_the_labyrinth):
"""
init_deposit shall return a bool
Expand Down
Loading