diff --git a/scipost/migrations/0065_authorshipclaim_publication.py b/scipost/migrations/0065_authorshipclaim_publication.py new file mode 100644 index 0000000000000000000000000000000000000000..086e6116addd08a9916f7e3dda269cd5866808c0 --- /dev/null +++ b/scipost/migrations/0065_authorshipclaim_publication.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2017-09-10 13:46 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('journals', '0044_publication_doideposit_needs_updating'), + ('scipost', '0064_auto_20170909_1649'), + ] + + operations = [ + migrations.AddField( + model_name='authorshipclaim', + name='publication', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='journals.Publication'), + ), + ] diff --git a/scipost/models.py b/scipost/models.py index d6cac15fd9be45affe5c0bfbe9e9ba47ace74861..464042a55dba7407b8fdd9fa1048be4979eaac01 100644 --- a/scipost/models.py +++ b/scipost/models.py @@ -248,6 +248,9 @@ class AuthorshipClaim(models.Model): claimant = models.ForeignKey(Contributor, on_delete=models.CASCADE, related_name='claimant') + publication = models.ForeignKey('journals.Publication', + on_delete=models.CASCADE, + blank=True, null=True) submission = models.ForeignKey('submissions.Submission', on_delete=models.CASCADE, blank=True, null=True) diff --git a/scipost/templates/scipost/claim_authorships.html b/scipost/templates/scipost/claim_authorships.html index 2630c6844582f8b7e476ad2063d3884044977a44..00f7afdfcaf171b0578e5fadeac8a55eca09cf19 100644 --- a/scipost/templates/scipost/claim_authorships.html +++ b/scipost/templates/scipost/claim_authorships.html @@ -14,6 +14,34 @@ </div> </div> +{% if publication_authorships_to_claim %} + <div class="row"> + <div class="col-12"> + <h2 class="highlight">SciPost Publications</h2> + <h3>Potential authorships to claim (auto-detected)</h3> + </div> + </div> + <div class="row"> + <div class="col-12"> + {% for pub in publication_authorships_to_claim %} + <div class="card"> + {% include 'journals/_publication_card_content.html' with publication=pub %} + <div class="card-footer"> + <form class="d-inline-block" action="{% url 'scipost:claim_pub_authorship' publication_id=pub.id claim=1 %}" method="post"> + {% csrf_token %} + <input class="btn btn-secondary" type="submit" value="I am an author" /> + </form> + <form class="d-inline-block ml-1" action="{% url 'scipost:claim_pub_authorship' publication_id=pub.id claim=0 %}" method="post"> + {% csrf_token %} + <input class="btn btn-danger" type="submit" value="I am not an author" /> + </form> + </div> + </div> + {% endfor %} + </div> + </div> +{% endif %} + {% if submission_authorships_to_claim %} <div class="row"> <div class="col-12"> @@ -42,6 +70,7 @@ </div> {% endif %} + {% if commentary_authorships_to_claim %} <div class="row"> <div class="col-12"> diff --git a/scipost/templates/scipost/personal_page.html b/scipost/templates/scipost/personal_page.html index b75cd60e232620161adbf8608c10400fdadfca47..7e23f9373652f455074b5ea463f54daefa98253e 100644 --- a/scipost/templates/scipost/personal_page.html +++ b/scipost/templates/scipost/personal_page.html @@ -48,6 +48,9 @@ <a class="nav-link" data-toggle="tab" href="#refereeing">Refereeing {% if refereeing_tab_total_count %}({{refereeing_tab_total_count}}){% endif %}</a> </li> {% endif %} + <li class="nav-item btn btn-secondary"> + <a class="nav-link" data-toggle="tab" href="#publications">Publications</a> + </li> <li class="nav-item btn btn-secondary"> <a class="nav-link" data-toggle="tab" href="#submissions">Submissions</a> </li> @@ -372,7 +375,47 @@ </div> {% endif %} - {% if perms.scipost.can_referee %} + <!-- Tab: Publications --> + <div class="tab-pane" id="publications" role="tabpanel"> + <div class="row"> + <div class="col-12"> + <div class="card card-grey"> + <div class="card-body"> + <h2 class="card-title">Publications</h2> + <ul class="mb-0"> + {% if nr_publication_authorships_to_claim > 0 %} + <li><a href="{% url 'scipost:claim_authorships' %}">Potential authorships to claim (auto-detected: {{ nr_publication_authorships_to_claim}})</a></li> + {% endif %} + </ul> + </div> + </div> + </div> + </div> + + {# {% if own_publications %}#} + <div class="row" id="mypublicationslist"> + <div class="col-12"> + <h3>Publications for which you are identified as an author:</h3> + </div> + <div class="col-12"> + <ul class="list-group list-group-flush"> + {% for pub in own_publications %} + <li class="list-group-item"> + {% include 'journals/_publication_card_content.html' with publication=pub current_user=request.user %} + </li> + {% empty %} + <li class="list-group-item"> + <em>No Publications found</em> + </li> + {% endfor %} + </ul> + </div> + </div> + {# {% endif %}#} + </div><!-- End tab --> + + + {% if perms.scipost.can_referee %} <!-- Tab: Refereeing --> <div class="tab-pane" id="refereeing" role="tabpanel"> <div class="row"> diff --git a/scipost/templates/scipost/vet_authorship_claims.html b/scipost/templates/scipost/vet_authorship_claims.html index b43041b92c80bee7be604c8ae23bed3128da8205..7d09ae462f9b3c38a20b0ac0a1bd88a8a7f444a2 100644 --- a/scipost/templates/scipost/vet_authorship_claims.html +++ b/scipost/templates/scipost/vet_authorship_claims.html @@ -1,5 +1,7 @@ {% extends 'scipost/_personal_page_base.html' %} +{% load bootstrap %} + {% block breadcrumb_items %} {{block.super}} <span class="breadcrumb-item">Vet authorship claims</span> @@ -34,7 +36,12 @@ {% for claim in claims_to_vet %} <li class="list-group-item"> <div class="card w-100"> - {% if claim.submission %} + {% if claim.publication %} + <div class="card-header"> + <h4>Contributor {{ claim.claimant.user.first_name }} {{ claim.claimant.user.last_name }} claims to be an author of Publication:</h4> + </div> + {% include 'journals/_publication_card_content.html' with publication=claim.publication %} + {% elif claim.submission %} <div class="card-header"> <h4>Contributor {{ claim.claimant.user.first_name }} {{ claim.claimant.user.last_name }} claims to be an author of Submission:</h4> </div> diff --git a/scipost/urls.py b/scipost/urls.py index e67452102c333fe77542e5a64e4fc24cf28e22dd..f3af0c4a67bc30f8a0c836d7f4692467359db08a 100644 --- a/scipost/urls.py +++ b/scipost/urls.py @@ -145,6 +145,8 @@ urlpatterns = [ # Authorship claims url(r'^claim_authorships$', views.claim_authorships, name="claim_authorships"), + url(r'^claim_pub_authorship/(?P<publication_id>[0-9]+)/(?P<claim>[0-1])$', + views.claim_pub_authorship, name='claim_pub_authorship'), url(r'^claim_sub_authorship/(?P<submission_id>[0-9]+)/(?P<claim>[0-1])$', views.claim_sub_authorship, name='claim_sub_authorship'), url(r'^claim_com_authorship/(?P<commentary_id>[0-9]+)/(?P<claim>[0-1])$', diff --git a/scipost/views.py b/scipost/views.py index 30d8031d02e0457ad6bd781490dc0aa8009e4ec6..5c09fe3e60b3b05544df1ba5244b9039ef2286a0 100644 --- a/scipost/views.py +++ b/scipost/views.py @@ -752,11 +752,20 @@ def personal_page(request): # Verify if there exist objects authored by this contributor, # whose authorship hasn't been claimed yet + own_publications = (Publication.objects + .filter(authors__in=[contributor]) + .order_by('-publication_date')) own_submissions = (Submission.objects .filter(authors__in=[contributor], is_current=True) .order_by('-submission_date')) own_commentaries = Commentary.objects.filter(authors=contributor).order_by('-latest_activity') own_thesislinks = ThesisLink.objects.filter(author_as_cont__in=[contributor]) + nr_publication_authorships_to_claim = (Publication.objects.filter( + author_list__contains=contributor.user.last_name) + .exclude(authors__in=[contributor]) + .exclude(authors_claims__in=[contributor]) + .exclude(authors_false_claims__in=[contributor]) + .count()) nr_submission_authorships_to_claim = (Submission.objects.filter( author_list__contains=contributor.user.last_name) .exclude(authors__in=[contributor]) @@ -799,12 +808,14 @@ def personal_page(request): 'nr_recommendations_to_prepare_for_voting': nr_recommendations_to_prepare_for_voting, 'nr_assignments_to_consider': nr_assignments_to_consider, 'active_assignments': active_assignments, + 'nr_publication_authorships_to_claim': nr_publication_authorships_to_claim, 'nr_submission_authorships_to_claim': nr_submission_authorships_to_claim, 'nr_commentary_authorships_to_claim': nr_commentary_authorships_to_claim, 'nr_thesis_authorships_to_claim': nr_thesis_authorships_to_claim, 'nr_ref_inv_to_consider': nr_ref_inv_to_consider, 'pending_ref_tasks': pending_ref_tasks, 'refereeing_tab_total_count': refereeing_tab_total_count, + 'own_publications': own_publications, 'own_submissions': own_submissions, 'own_commentaries': own_commentaries, 'own_thesislinks': own_thesislinks, @@ -900,6 +911,12 @@ def claim_authorships(request): """ contributor = Contributor.objects.get(user=request.user) + publication_authorships_to_claim = (Publication.objects + .filter(author_list__contains=contributor.user.last_name) + .exclude(authors__in=[contributor]) + .exclude(authors_claims__in=[contributor]) + .exclude(authors_false_claims__in=[contributor])) + pub_auth_claim_form = AuthorshipClaimForm() submission_authorships_to_claim = (Submission.objects .filter(author_list__contains=contributor.user.last_name) .exclude(authors__in=[contributor]) @@ -919,16 +936,35 @@ def claim_authorships(request): .exclude(author_false_claims__in=[contributor])) thesis_auth_claim_form = AuthorshipClaimForm() - context = {'submission_authorships_to_claim': submission_authorships_to_claim, - 'sub_auth_claim_form': sub_auth_claim_form, - 'commentary_authorships_to_claim': commentary_authorships_to_claim, - 'com_auth_claim_form': com_auth_claim_form, - 'thesis_authorships_to_claim': thesis_authorships_to_claim, - 'thesis_auth_claim_form': thesis_auth_claim_form, - } + context = { + 'publication_authorships_to_claim': publication_authorships_to_claim, + 'pub_auth_claim_form': pub_auth_claim_form, + 'submission_authorships_to_claim': submission_authorships_to_claim, + 'sub_auth_claim_form': sub_auth_claim_form, + 'commentary_authorships_to_claim': commentary_authorships_to_claim, + 'com_auth_claim_form': com_auth_claim_form, + 'thesis_authorships_to_claim': thesis_authorships_to_claim, + 'thesis_auth_claim_form': thesis_auth_claim_form, + } return render(request, 'scipost/claim_authorships.html', context) +@login_required +@user_passes_test(has_contributor) +def claim_pub_authorship(request, publication_id, claim): + if request.method == 'POST': + contributor = Contributor.objects.get(user=request.user) + publication = get_object_or_404(Publication, pk=publication_id) + if claim == '1': + publication.authors_claims.add(contributor) + newclaim = AuthorshipClaim(claimant=contributor, publication=publication) + newclaim.save() + elif claim == '0': + publication.authors_false_claims.add(contributor) + publication.save() + return redirect('scipost:claim_authorships') + + @login_required @user_passes_test(has_contributor) def claim_sub_authorship(request, submission_id, claim): @@ -990,6 +1026,15 @@ def vet_authorship_claim(request, claim_id, claim): vetting_contributor = Contributor.objects.get(user=request.user) claim_to_vet = AuthorshipClaim.objects.get(pk=claim_id) + if claim_to_vet.publication is not None: + claim_to_vet.publication.authors_claims.remove(claim_to_vet.claimant) + if claim == '1': + claim_to_vet.publication.authors.add(claim_to_vet.claimant) + claim_to_vet.status = '1' + elif claim == '0': + claim_to_vet.publication.authors_false_claims.add(claim_to_vet.claimant) + claim_to_vet.status = '-1' + claim_to_vet.publication.save() if claim_to_vet.submission is not None: claim_to_vet.submission.authors_claims.remove(claim_to_vet.claimant) if claim == '1': @@ -998,7 +1043,7 @@ def vet_authorship_claim(request, claim_id, claim): elif claim == '0': claim_to_vet.submission.authors_false_claims.add(claim_to_vet.claimant) claim_to_vet.status = '-1' - claim_to_vet.submission.save() + claim_to_vet.submission.save() if claim_to_vet.commentary is not None: claim_to_vet.commentary.authors_claims.remove(claim_to_vet.claimant) if claim == '1': @@ -1007,7 +1052,7 @@ def vet_authorship_claim(request, claim_id, claim): elif claim == '0': claim_to_vet.commentary.authors_false_claims.add(claim_to_vet.claimant) claim_to_vet.status = '-1' - claim_to_vet.commentary.save() + claim_to_vet.commentary.save() if claim_to_vet.thesislink is not None: claim_to_vet.thesislink.author_claims.remove(claim_to_vet.claimant) if claim == '1': @@ -1016,7 +1061,7 @@ def vet_authorship_claim(request, claim_id, claim): elif claim == '0': claim_to_vet.thesislink.author_false_claims.add(claim_to_vet.claimant) claim_to_vet.status = '-1' - claim_to_vet.thesislink.save() + claim_to_vet.thesislink.save() claim_to_vet.vetted_by = vetting_contributor claim_to_vet.save()