[VIVO-1415] Add publication claiming from PubMed and CrossRef (#129)

* Claiming interface for DOI and PMID
* Allow http://doi.org urls in the claim process
* Make button i18n compliant
* Check Editor already claimed, error for no citation, PUMCIDs fixed
* Fixed gnarly DOI containing semi-colon (removed semi-colon as separator), match more DOI formats internally, improve AUTH restrictions
* Add Wilma themes
* Add permissions to allow proxy editors
* Update DOI resolver URI for content negotiation
* CSS changes to prevent layout problems in admin pages
* Add selectable list of publication types on import

Resolves to https://jira.duraspace.org/browse/VIVO-1415
This commit is contained in:
Graham Triggs 2019-08-08 15:15:17 +01:00 committed by Andrew Woods
parent 0a08c2890d
commit f597b7ee42
31 changed files with 4197 additions and 9 deletions

View file

@ -810,3 +810,55 @@ role_in_presentation_capitalized=Role in Presentation
advisee_capitalized_first_name=First Name
advisee_capitalized_lastname=Last Name
# Messages for creating and linking resources (publications)
create_and_link_enter=Enter {0}:
create_and_link_claim_for=Claiming works for<br />{0}
create_and_link_confirm_works=Confirm your work(s)
create_and_link_confirm_works_intro=Please check that these are the work(s) that you wish to claim, and indicate your relationship with them.
create_and_link_authors=Authors
create_and_link_authors_desc=If you are an author of a work, please select your name in the author list.<br />Retrieved metadata may be incomplete. If you can not see your name listed, select "Unlisted Author".
create_and_link_editors=Editors
create_and_link_editors_desc=If you edited the work, please select "Editor".
create_and_link_not_mine_desc=If you do not wish to claim a work, select "This is not my work".
create_and_link_already_claimed=You have already claimed this work.
create_and_link_unlisted_author=Unlisted Author
create_and_link_editor=Editor
create_and_link_not_mine=This is not my work
create_and_link_remaining=There are {0} ids remaining
create_and_link_thank_you=Thank you
create_and_link_finished=There are no more works left to claim.<br />You may enter more IDs below, or view your profile.
create_and_link_go_profile=Go to profile
create_and_link_enter_dois_intro=You may enter one or more DOIs to match, and can be entered either as an ID or URL:<br /><br />e.g.
create_and_link_enter_dois_supported=Currently, DOIs issued by Crossref, DataCite and mEDRA are supported.<br />Each DOI should be separated by a comma or new line.
create_and_link_enter_pmid_intro=You may enter one or more PubMed IDs to match. Each ID should be separated by a comma or new line.
create_and_link_enter_pmid_supported=Note that metadata will be retrieved from Crossref, if the PubMed ID can be resolved to a DOI.
create_and_link_unknown_profile=Unknown Profile
create_and_link_unknown_resource=Unknown Resource Type
create_and_link_unauthorized_for_profile=You do not have permissions to claim for this user
create_and_link_submit_ids=Submit IDs
create_and_link_submit_confirm=Confirm
create_and_link_error=Unable to retrieve citation details
create_and_link_type_article=Article
create_and_link_type_article_journal=Journal Article
create_and_link_type_book=Book
create_and_link_type_chapter=Chapter
create_and_link_type_dataset=Dataset
create_and_link_type_figure=Image
create_and_link_type_graphic=Image
create_and_link_type_legal_case=Legal Case
create_and_link_type_legislation=Legislation
create_and_link_type_manuscript=Manuscript
create_and_link_type_map=Map
create_and_link_type_musical_score=Musical Score
create_and_link_type_paper_conference=Conference Paper
create_and_link_type_patent=Patent
create_and_link_type_personal_communication=Letter
create_and_link_type_post_weblog=Blog
create_and_link_type_report=Report
create_and_link_type_review=Review
create_and_link_type_speech=Speech
create_and_link_type_thesis=Thesis
create_and_link_type_webpage=Webpage
claim_publications_by=Claim publications by
claim_publications_by_doi=DOI
claim_publications_by_pmid=PubMed ID

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

View file

@ -0,0 +1,111 @@
<#setting number_format="computer">
<form id="createAndLink" method="post">
<#if personLabel??>
<div class="claim-for">
<h3>${i18n().create_and_link_claim_for(personLabel)}</h3>
<#if personThumbUrl??>
<img src="${urls.base}${personThumbUrl}" />
</#if>
</div>
</#if>
<h2>${i18n().create_and_link_confirm_works}</h2>
${i18n().create_and_link_confirm_works_intro}<br /><br />
<h4>${i18n().create_and_link_authors}</h4>
<div class="description">${i18n().create_and_link_authors_desc}</div><br />
<h4>${i18n().create_and_link_editors}</h4>
<div class="description">${i18n().create_and_link_editors_desc}</div><br /><br />
${i18n().create_and_link_not_mine_desc}<br /><br />
<#list citations as citation>
<div class="entryId">
<#if citation.externalProvider??>
${citation.externalProvider?upper_case}: ${citation.externalId?html}
<#else>
ID: ${citation.externalId?html}
</#if>
</div>
<#if citation.type?has_content>
<select name="type${citation.externalId}">
<#list publicationTypes as publicationType>
<option value="${publicationType.uri}" <#if publicationType.uri == citation.typeUri>selected</#if>>${publicationType.label}</option>
</#list>
</select><br/>
</#if>
<div class="entry">
<#if citation.showError>
<div class="citation_error">
${i18n().create_and_link_error}
</div>
<#else>
<!-- Output Citation -->
<#if citation.alreadyClaimed>
<div class="citation_claimed">
</#if>
<input type="hidden" name="externalId" value="${citation.externalId!}" />
<div class="citation">
<#assign proposedAuthor=false />
<#if citation.title??><span class="citation_title">${citation.title?html}</span><br /></#if>
<#assign formatted_citation>
<#if citation.journal??><span class="citation_journal">${citation.journal?html}</span></#if>
<#if citation.publicationYear??><span class="citation_year">${citation.publicationYear!?html};</span></#if>
<#if citation.volume??><span class="citation_volume">${citation.volume!?html}</#if>
<#if citation.issue??><span class="citation_issue">(${citation.issue!?html})</#if>
<#if citation.pagination??><span class="citation_pages">:${citation.pagination!?html}</#if>
</#assign>
<#if formatted_citation??>
${formatted_citation}<br />
</#if>
<#if citation.authors??>
<#list citation.authors as author>
<#if author??>
<span class="citation_author">
<#if citation.alreadyClaimed>
<span>${author.name!?html}</span>
<#else>
<#if author.name??>
<#if !author.linked>
<input type="radio" id="author${citation.externalId}-${author?counter}" name="contributor${citation.externalId}" value="author${author?counter}" <#if author.proposed>checked</#if> class="radioWithLabel" />
<label for="author${citation.externalId}-${author?counter}" class="labelForRadio">${author.name!?html}</label>
<#if author.proposed><#assign proposedAuthor=true /></#if>
<#else>
<span class="linked">${author.name!?html}</span>
</#if>
</#if>
</#if>
</span>
</#if>
<#sep>; </#sep>
</#list><br />
</#if>
</div>
<#if citation.alreadyClaimed>
<span class="claimed">${i18n().create_and_link_already_claimed}</span>
<#else>
<input type="radio" id="author${citation.externalId}" name="contributor${citation.externalId}" value="author" <#if !proposedAuthor>checked</#if> class="radioWithLabel" /><label for="author${citation.externalId}" class="labelForRadio"> ${i18n().create_and_link_unlisted_author}</label><br />
<input type="radio" id="editor${citation.externalId}" name="contributor${citation.externalId}" value="editor" class="radioWithLabel" /><label for="editor${citation.externalId}" class="labelForRadio"> ${i18n().create_and_link_editor}</label><br />
<input type="radio" id="notmine${citation.externalId}" name="contributor${citation.externalId}" value="notmine" class="radioWithLabel" /><label for="notmine${citation.externalId}" class="labelForRadio"> ${i18n().create_and_link_not_mine}</label><br />
</#if>
<input type="hidden" name="externalResource${citation.externalId}" value="${citation.externalResource!?html}" />
<input type="hidden" name="externalProvider${citation.externalId}" value="${citation.externalProvider!?html}" />
<input type="hidden" name="vivoUri${citation.externalId}" value="${citation.vivoUri!?html}" />
<input type="hidden" name="profileUri" value="${profileUri!}" />
<#if citation.alreadyClaimed>
</div>
</#if>
</#if>
<div style="clear: both;"></div>
</div>
<br/>
<!-- End Citation -->
</#list>
<#if remainderIds??>
<input type="hidden" name="remainderIds" value="${remainderIds}" />
</#if>
<div class="buttons">
<input type="hidden" name="action" value="confirmID" />
<input type="submit" value="${i18n().create_and_link_submit_confirm}" class="submit" />
<#if remainderCount??>
<span class="remainder">${i18n().create_and_link_remaining(remainderCount)}</span>
</#if>
</div>
</form>

View file

@ -0,0 +1,35 @@
<form id="createAndLink" method="post">
<#if personLabel??>
<div class="claim-for">
<h3>${i18n().create_and_link_claim_for(personLabel)}</h3>
<#if personThumbUrl??>
<img src="${urls.base}${personThumbUrl}" />
</#if>
</div>
</#if>
<#if showConfirmation??>
<h2>${i18n().create_and_link_thank_you}</h2>
${i18n().create_and_link_finished}<br /><br />
<#if profileUri??>
<a href="${profileUrl(profileUri)}">${i18n().create_and_link_go_profile}</a><br /><br />
</#if>
</#if>
<h2>${i18n().create_and_link_enter(label)}</h2>
<#switch provider>
<#case "doi">
${i18n().create_and_link_enter_dois_intro}<br />
<i>ID</i>: 10.1038/nature01234<br />
<i>URL</i>: https://doi.org/10.1038/nature01234<br />
<br />
${i18n().create_and_link_enter_dois_supported}<br /><br />
<#break>
<#case "pmid">
${i18n().create_and_link_enter_pmid_intro}<br /><br />
${i18n().create_and_link_enter_pmid_supported}<br /><br />
<#break>
</#switch>
<textarea name="externalIds" rows="15" cols="50"></textarea><br />
<input type="submit" value="${i18n().create_and_link_submit_ids}" class="submit" /><br />
<input type="hidden" name="action" value="findID" />
<input type="hidden" name="profileUri" value="${profileUri!}" />
</form>

View file

@ -0,0 +1 @@
<h2>${i18n().create_and_link_unauthorized_for_profile}</h2>

View file

@ -0,0 +1,2 @@
<h2>${i18n().create_and_link_unknown_profile}</h2>

View file

@ -0,0 +1,2 @@
<h2>${i18n().create_and_link_unknown_resource}</h2>

View file

@ -0,0 +1,82 @@
#createAndLink select {
height: 2.5em;
margin-top: 0px;
margin-bottom: 0px;
padding-bottom: 0px;
padding-top: 0px;
}
#createAndLink .citation_error:before {
content: url('../../../images/createAndLink/error.png');
transform: scale(0.5);
margin-top: 10px;
margin-right: 10px;
float: left;
}
#createAndLink .citation_error {
height: 70px;
}
#createAndLink .citation_claimed:before {
content: url('../../../images/createAndLink/tick.png');
transform: scale(0.75);
margin-top: -17px;
margin-left: 535px;
float: left;
position: absolute;
}
#createAndLink .citation_claimed:hover:before {
opacity: 0.2;
}
#createAndLink .citation_claimed .citation {
opacity: 0.2;
}
#createAndLink .citation_claimed:hover .citation {
opacity: 1.0;
}
#createAndLink .citation_type {
font-style: italic;
padding: 5px;
}
#createAndLink .citation_title {
font-weight: bold;
}
#createAndLink .citation_journal {
font-style: italic;
}
#createAndLink .claimed {
font-weight: bold;
}
#createAndLink .linked {
font-style: italic;
}
#createAndLink .entryId {
background-color: #3e8baa; /* #E0E0E0; */
color: #ffffff;
padding: 5px;
font-weight: bold;
display: inline-block;
}
#createAndLink .entry {
border: 2px solid #3e8baa; /* #E0E0E0; */
padding: 5px;
}
#createAndLink label {
display: inline;
}
#createAndLink .radioWithLabel:checked + .labelForRadio {
font-weight: bold;
}
#createAndLink .description {
padding-left: 22px;
}
#createAndLink .remainder {
font-style: italic;
}
#createAndLink .claim-for {
float: right;
border: 2px solid #3e8baa; /* #E0E0E0; */
padding: 5px;
}
#createAndLink .claim-for h3 {
text-align: center;
}

View file

@ -30,5 +30,6 @@ VIVO tenderfoot theme: screen styles
@import url("page-individual.css");
@import url("page-login.css");
@import url("page-menu.css");
@import url("page-createAndLink.css");
@import url("https://fonts.googleapis.com/css?family=Noto+Sans");
@import url("../../../local/css/local.css");

View file

@ -104,11 +104,23 @@
<section itemscope itemtype="http://schema.org/Person" id="individual-intro" class="vcard person" role="region">
<section id="individual-info" ${infoClass!} role="region">
<!-- Overview -->
<!-- #include "individual-overview.ftl" -->
<!-- Geographic Focus -->
<!-- #include "individual-geographicFocus.ftl" -->
<#if editable>
<#if claimSources?size &gt; 0>
${i18n().claim_publications_by}
<#if claimSources?seq_contains("doi")>
<form action="${urls.base}/createAndLink/doi" method="get" style="display: inline-block;">
<input type="hidden" name="profileUri" value="${individual.uri}" />
<input type="submit" class="submit" value="${i18n().claim_publications_by_doi}" />
</form>
</#if>
<#if claimSources?seq_contains("pmid")>
<form action="${urls.base}/createAndLink/pmid" method="get" style="display: inline-block;">
<input type="hidden" name="profileUri" value="${individual.uri}" />
<input type="submit" class="submit" value="${i18n().claim_publications_by_pmid}" />
</form>
</#if>
</#if>
</#if>
</section>
</section>

View file

@ -0,0 +1,82 @@
#createAndLink select {
height: 2.5em;
margin-top: 0px;
margin-bottom: 0px;
padding-bottom: 0px;
padding-top: 0px;
}
#createAndLink .citation_error:before {
content: url('../../../images/createAndLink/error.png');
transform: scale(0.5);
margin-top: 10px;
margin-right: 10px;
float: left;
}
#createAndLink .citation_error {
height: 70px;
}
#createAndLink .citation_claimed:before {
content: url('../../../images/createAndLink/tick.png');
transform: scale(0.75);
margin-top: -17px;
margin-left: 535px;
float: left;
position: absolute;
}
#createAndLink .citation_claimed:hover:before {
opacity: 0.2;
}
#createAndLink .citation_claimed .citation {
opacity: 0.2;
}
#createAndLink .citation_claimed:hover .citation {
opacity: 1.0;
}
#createAndLink .citation_type {
font-style: italic;
padding: 5px;
}
#createAndLink .citation_title {
font-weight: bold;
}
#createAndLink .citation_journal {
font-style: italic;
}
#createAndLink .claimed {
font-weight: bold;
}
#createAndLink .linked {
font-style: italic;
}
#createAndLink .entryId {
background-color: #3e8baa; /* #E0E0E0; */
color: #ffffff;
padding: 5px;
font-weight: bold;
display: inline-block;
}
#createAndLink .entry {
border: 2px solid #3e8baa; /* #E0E0E0; */
padding: 5px;
}
#createAndLink label {
display: inline;
}
#createAndLink .radioWithLabel:checked + .labelForRadio {
font-weight: bold;
}
#createAndLink .description {
padding-left: 22px;
}
#createAndLink .remainder {
font-style: italic;
}
#createAndLink .claim-for {
float: right;
border: 2px solid #3e8baa; /* #E0E0E0; */
padding: 5px;
}
#createAndLink .claim-for h3 {
text-align: center;
}

View file

@ -24,4 +24,5 @@ VIVO wilma theme: screen styles
@import url("reset.css");
@import url("wilma.css");
@import url("page-createAndLink.css");
@import url("../../../local/css/local.css");

View file

@ -62,6 +62,23 @@
<section id="individual-info" ${infoClass!} role="region">
<section id="right-hand-column" role="region">
<#include "individual-visualizationFoafPerson.ftl">
<#if editable>
<#if claimSources?size &gt; 0>
<br />${i18n().claim_publications_by}<br />
<#if claimSources?seq_contains("doi")>
<form action="${urls.base}/createAndLink/doi" method="get" style="float: left;">
<input type="hidden" name="profileUri" value="${individual.uri}" />
<input type="submit" class="submit" value="${i18n().claim_publications_by_doi}" />
</form>
</#if>
<#if claimSources?seq_contains("pmid")>
<form action="${urls.base}/createAndLink/pmid" method="get" style="float: right;">
<input type="hidden" name="profileUri" value="${individual.uri}" />
<input type="submit" class="submit" value="${i18n().claim_publications_by_pmid}" />
</form>
</#if>
</#if>
</#if>
</section>
<#include "individual-adminPanel.ftl">