From 7befb27d98592a6a6632275c5da136b6a3187aa4 Mon Sep 17 00:00:00 2001 From: Jorran de Wit <jorrandewit@outlook.com> Date: Mon, 25 Sep 2017 21:24:06 +0200 Subject: [PATCH] Untangle Contributor from personal page --- commentaries/models.py | 9 +- journals/models.py | 22 +- scipost/constants.py | 2 +- scipost/managers.py | 10 +- scipost/models.py | 7 +- scipost/templates/scipost/personal_page.html | 669 ++++++++++--------- scipost/views.py | 252 +++---- submissions/managers.py | 9 + submissions/models.py | 26 +- theses/managers.py | 3 + theses/models.py | 10 +- 11 files changed, 533 insertions(+), 486 deletions(-) diff --git a/commentaries/models.py b/commentaries/models.py index aa5df1de3..add1f6b8c 100644 --- a/commentaries/models.py +++ b/commentaries/models.py @@ -16,7 +16,8 @@ class Commentary(TimeStampedModel): A Commentary contains all the contents of a SciPost Commentary page for a given publication. """ requested_by = models.ForeignKey('scipost.Contributor', blank=True, null=True, - on_delete=models.CASCADE, related_name='requested_by') + on_delete=models.CASCADE, + related_name='requested_commentaries') vetted = models.BooleanField(default=False) vetted_by = models.ForeignKey('scipost.Contributor', blank=True, null=True, on_delete=models.CASCADE) @@ -44,11 +45,11 @@ class Commentary(TimeStampedModel): # Authors which have been mapped to contributors: authors = models.ManyToManyField('scipost.Contributor', blank=True, - related_name='authors_com') + related_name='commentaries') authors_claims = models.ManyToManyField('scipost.Contributor', blank=True, - related_name='authors_com_claims') + related_name='claimed_commentaries') authors_false_claims = models.ManyToManyField('scipost.Contributor', blank=True, - related_name='authors_com_false_claims') + related_name='false_claimed_commentaries') journal = models.CharField(max_length=300, blank=True) volume = models.CharField(max_length=50, blank=True) pages = models.CharField(max_length=50, blank=True) diff --git a/journals/models.py b/journals/models.py index 4dc87d398..613acad1f 100644 --- a/journals/models.py +++ b/journals/models.py @@ -131,23 +131,27 @@ class Publication(models.Model): blank=True, null=True) title = models.CharField(max_length=300) author_list = models.CharField(max_length=1000, verbose_name="author list") + # Authors which have been mapped to contributors: - authors = models.ManyToManyField(Contributor, blank=True, related_name='authors_pub') + authors = models.ManyToManyField('scipost.Contributor', blank=True, + related_name='publications') authors_unregistered = models.ManyToManyField(UnregisteredAuthor, blank=True, - related_name='authors_unregistered') - first_author = models.ForeignKey(Contributor, blank=True, null=True, on_delete=models.CASCADE) + related_name='publications') + first_author = models.ForeignKey('scipost.Contributor', blank=True, null=True, + on_delete=models.CASCADE, + related_name='first_author_publications') first_author_unregistered = models.ForeignKey(UnregisteredAuthor, blank=True, null=True, on_delete=models.CASCADE, - related_name='first_author_unregistered') - authors_claims = models.ManyToManyField(Contributor, blank=True, - related_name='authors_pub_claims') - authors_false_claims = models.ManyToManyField(Contributor, blank=True, - related_name='authors_pub_false_claims') + related_name='first_author_publications') + authors_claims = models.ManyToManyField('scipost.Contributor', blank=True, + related_name='claimed_publications') + authors_false_claims = models.ManyToManyField('scipost.Contributor', blank=True, + related_name='false_claimed_publications') abstract = models.TextField() pdf_file = models.FileField(upload_to='UPLOADS/PUBLICATIONS/%Y/%m/', max_length=200) cc_license = models.CharField(max_length=32, choices=CC_LICENSES, default=CCBY4) grants = models.ManyToManyField('funders.Grant', blank=True) - funders_generic = models.ManyToManyField('funders.Funder', blank=True) # not linked to a grant + funders_generic = models.ManyToManyField('funders.Funder', blank=True) # not linked to a grant metadata = JSONField(default={}, blank=True, null=True) metadata_xml = models.TextField(blank=True, null=True) # for Crossref deposit latest_metadata_update = models.DateTimeField(blank=True, null=True) diff --git a/scipost/constants.py b/scipost/constants.py index e3166d2f4..07c873c85 100644 --- a/scipost/constants.py +++ b/scipost/constants.py @@ -136,7 +136,7 @@ CONTRIBUTOR_STATUS = ( # -4: disabled account (deceased) (CONTRIBUTOR_NEWLY_REGISTERED, 'newly registered'), (CONTRIBUTOR_NORMAL, 'normal user'), - (-1, 'not a professional scientist'), + (-1, 'not a professional scientist'), # Soon to be deprecated (-2, 'other account already exists'), (-3, 'barred from SciPost'), (-4, 'account disabled'), diff --git a/scipost/managers.py b/scipost/managers.py index 11af2c2ed..788aecb9a 100644 --- a/scipost/managers.py +++ b/scipost/managers.py @@ -4,7 +4,7 @@ from django.db import models from django.db.models import Q from .constants import CONTRIBUTOR_NORMAL, INVITATION_EDITORIAL_FELLOW,\ - CONTRIBUTOR_NEWLY_REGISTERED + CONTRIBUTOR_NEWLY_REGISTERED, AUTHORSHIP_CLAIM_PENDING class FellowManager(models.Manager): @@ -25,6 +25,9 @@ class ContributorManager(models.Manager): def awaiting_validation(self): return self.filter(user__is_active=False, status=CONTRIBUTOR_NEWLY_REGISTERED) + def awaiting_vetting(self): + return self.filter(user__is_active=True, status=CONTRIBUTOR_NEWLY_REGISTERED) + def fellows(self): return self.filter(user__groups__name='Editorial College') @@ -46,3 +49,8 @@ class UnavailabilityPeriodManager(models.Manager): def today(self): today = datetime.date.today() return self.filter(start__lte=today, end__gte=today) + + +class AuthorshipClaimQuerySet(models.QuerySet): + def awaiting_vetting(self): + return self.filter(status=AUTHORSHIP_CLAIM_PENDING) diff --git a/scipost/models.py b/scipost/models.py index fe7afc37b..88a69d14e 100644 --- a/scipost/models.py +++ b/scipost/models.py @@ -19,7 +19,7 @@ from .constants import SCIPOST_DISCIPLINES, SCIPOST_SUBJECT_AREAS,\ AUTHORSHIP_CLAIM_PENDING, AUTHORSHIP_CLAIM_STATUS from .fields import ChoiceArrayField from .managers import FellowManager, ContributorManager, RegistrationInvitationManager,\ - UnavailabilityPeriodManager + UnavailabilityPeriodManager, AuthorshipClaimQuerySet def get_sentinel_user(): @@ -34,8 +34,7 @@ def get_sentinel_user(): class Contributor(models.Model): """ - All users of SciPost are Contributors. - Permissions determine the sub-types. + All *science* users of SciPost are Contributors. username, password, email, first_name and last_name are inherited from User. """ user = models.OneToOneField(User, on_delete=models.PROTECT, unique=True) @@ -265,6 +264,8 @@ class AuthorshipClaim(models.Model): status = models.SmallIntegerField(choices=AUTHORSHIP_CLAIM_STATUS, default=AUTHORSHIP_CLAIM_PENDING) + objects = AuthorshipClaimQuerySet.as_manager() + class PrecookedEmail(models.Model): """ diff --git a/scipost/templates/scipost/personal_page.html b/scipost/templates/scipost/personal_page.html index abdbe2986..9ab35d267 100644 --- a/scipost/templates/scipost/personal_page.html +++ b/scipost/templates/scipost/personal_page.html @@ -6,7 +6,7 @@ {% block content %} -{% if 'Registered Contributors' not in user_groups %} +{% if needs_validation %} <div class="row"> <div class="col-12"> @@ -43,28 +43,32 @@ <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> - <li class="nav-item btn btn-secondary"> - <a class="nav-link" data-toggle="tab" href="#commentaries">Commentaries</a> - </li> - <li class="nav-item btn btn-secondary"> - <a class="nav-link" data-toggle="tab" href="#theses">Theses</a> - </li> - <li class="nav-item btn btn-secondary"> - {% with request.user.contributor.comments.regular_comments.awaiting_vetting.count as count %} - <a class="nav-link" data-toggle="tab" href="#comments">Comments{% if count %} ({{count}} unvetted){% endif %}</a> - {% endwith %} - </li> - <li class="nav-item btn btn-secondary"> - {% with request.user.contributor.comments.author_replies.awaiting_vetting.count as count %} - <a class="nav-link" data-toggle="tab" href="#author-replies">Author Replies{% if count %} ({{count}} unvetted){% endif %}</a> - {% endwith %} - </li> + {% if contributor %} + {# If user is contributor #} + <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> + <li class="nav-item btn btn-secondary"> + <a class="nav-link" data-toggle="tab" href="#commentaries">Commentaries</a> + </li> + <li class="nav-item btn btn-secondary"> + <a class="nav-link" data-toggle="tab" href="#theses">Theses</a> + </li> + <li class="nav-item btn btn-secondary"> + {% with contributor.comments.regular_comments.awaiting_vetting.count as count %} + <a class="nav-link" data-toggle="tab" href="#comments">Comments{% if count %} ({{count}} unvetted){% endif %}</a> + {% endwith %} + </li> + <li class="nav-item btn btn-secondary"> + {% with contributor.comments.author_replies.awaiting_vetting.count as count %} + <a class="nav-link" data-toggle="tab" href="#author-replies">Author Replies{% if count %} ({{count}} unvetted){% endif %}</a> + {% endwith %} + </li> + {# END: If user is contributor #} + {% endif %} </ul> </div> </div> @@ -88,24 +92,32 @@ <h3>Your personal details:</h3> {% include "scipost/_private_info_as_table.html" with contributor=contributor %} - <h3 class="mt-3">Your main discipline:</h3> - <ul><li>{{ contributor.get_discipline_display }}</li></ul> - - <h3 class="mt-3">Your expertises:</h3> - {% if contributor.expertises %} - {% include "scipost/_expertises_as_ul.html" with contributor=contributor %} - {% else %} - <p>You haven't listed your expertise(s).<br/> - Do so by <a href="{% url 'scipost:update_personal_data' %}">updating your personal data</a> - </p> + {% if contributor %} + {# Scientist fields #} + <h3 class="mt-3">Your main discipline:</h3> + <ul><li>{{ contributor.get_discipline_display }}</li></ul> + + <h3 class="mt-3">Your expertises:</h3> + {% if contributor.expertises %} + {% include "scipost/_expertises_as_ul.html" with contributor=contributor %} + {% else %} + <p>You haven't listed your expertise(s).<br/> + Do so by <a href="{% url 'scipost:update_personal_data' %}">updating your personal data</a> + </p> + {% endif %} + {# END: Scientist fields #} {% endif %} </div> <div class="col-md-6"> - {% if not request.user.contributor.is_currently_available %} - <h3 class="text-warning">You are currently unavailable</h3> - <p>Check your availability underneath if this should not be the case.</p> - <hr> - {% endif %} + {% if contributor %} + {# Scientist fields #} + {% if not contributor.is_currently_available %} + <h3 class="text-warning">You are currently unavailable</h3> + <p>Check your availability underneath if this should not be the case.</p> + <hr> + {% endif %} + {# END: Scientist fields #} + {% endif %} {% if 'SciPost Administrators' in user_groups %} <h3>You are a SciPost Administrator.</h3> @@ -147,49 +159,51 @@ </div> </div> - <hr> - <div class="row"> - <div class="col"> - <h2 class="highlight">Your Availability</h2> - </div> - </div> - <div class="row justify-content-center"> - <div class="col-md-4 mr-md-5"> - <p>To help with the editorial workflow, you can inform us of any periods during which you are unavailable. We will do our best to respect these.</p> - <h3 class="mb-3">Mark a period as unavailable:</h3> - <form action="{% url 'scipost:mark_unavailable_period' %}" method="post"> - {% csrf_token %} - {{ unavailability_form|bootstrap }} - <input class="btn btn-secondary" type="submit" value="Submit" /> - </form> + {% if unavailability_form %} + <hr> + <div class="row"> + <div class="col"> + <h2 class="highlight">Your Availability</h2> + </div> </div> - <div class="col-md-4 ml-md-5"> - {% if unavailabilities %} - <h3>Your unavailability periods in our records</h3> - <p class="text-muted">(YYYY-MM-DD)</p> - <table class="table"> - <tr> - <th>Start</th> - <th colspan="2">End</th> - </tr> - {% for unav in unavailabilities %} - <tr> - <td>{{ unav.start }}</td> - <td>{{ unav.end }}</td> - <td> - <form action="{% url 'scipost:delete_unavailable_period' unav.id %}" method="post"> - {% csrf_token %} - <input class="btn btn-danger" type="submit" value="Delete" /> - </form> - </td> - </tr> - {% endfor %} - </table> - {% else %} - <p>You don't have any upcoming unavailability periods on record.</p> - {% endif %} + <div class="row justify-content-center"> + <div class="col-md-4 mr-md-5"> + <p>To help with the editorial workflow, you can inform us of any periods during which you are unavailable. We will do our best to respect these.</p> + <h3 class="mb-3">Mark a period as unavailable:</h3> + <form action="{% url 'scipost:mark_unavailable_period' %}" method="post"> + {% csrf_token %} + {{ unavailability_form|bootstrap }} + <input class="btn btn-secondary" type="submit" value="Submit" /> + </form> + </div> + <div class="col-md-4 ml-md-5"> + {% if unavailabilities %} + <h3>Your unavailability periods in our records</h3> + <p class="text-muted">(YYYY-MM-DD)</p> + <table class="table"> + <tr> + <th>Start</th> + <th colspan="2">End</th> + </tr> + {% for unav in unavailabilities %} + <tr> + <td>{{ unav.start }}</td> + <td>{{ unav.end }}</td> + <td> + <form action="{% url 'scipost:delete_unavailable_period' unav.id %}" method="post"> + {% csrf_token %} + <input class="btn btn-danger" type="submit" value="Delete" /> + </form> + </td> + </tr> + {% endfor %} + </table> + {% else %} + <p>You don't have any upcoming unavailability periods on record.</p> + {% endif %} + </div> </div> - </div> + {% endif %} </div><!-- End tab --> {% if 'SciPost Administrators' in user_groups or 'Editorial Administrators' in user_groups or 'Editorial College' in user_groups or 'Advisory Board' in user_groups or 'Vetting Editors' in user_groups or 'Ambassadors' in user_groups or 'Junior Ambassadors' in user_groups %} @@ -329,322 +343,327 @@ </div> {% if active_assignments %} - <div class="row"> - <div class="col-12"> - <h3 class="highlight">Submissions for which you are Editor-in-charge</h3> - </div> - <div class="col-12"> - <ul class="list-group list-group-flush"> - {% for assignment in active_assignments %} - <li class="list-group-item"> - {% include 'submissions/_submission_card_eic_content.html' with submission=assignment.submission %} - </li> - {% endfor %} - </ul> + <div class="row"> + <div class="col-12"> + <h3 class="highlight">Submissions for which you are Editor-in-charge</h3> + </div> + <div class="col-12"> + <ul class="list-group list-group-flush"> + {% for assignment in active_assignments %} + <li class="list-group-item"> + {% include 'submissions/_submission_card_eic_content.html' with submission=assignment.submission %} + </li> + {% endfor %} + </ul> + </div> </div> - </div> {% endif %} </div><!-- End tab --> {% endif %} - <!-- 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 class="mb-3">Publications for which you are identified as an author:</h3> - </div> - <div class="col-12"> - <ul class="list-unstyled"> - {% for pub in own_publications %} - <li> - <div class="card card-grey card-publication" id="{{pub.doi_label}}"> - {% include 'journals/_publication_card_content.html' with publication=pub current_user=request.user %} - </div> - </li> - {% empty %} - <li> - <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"> + {% if contributor %} + {# If user is contributor #} + <!-- 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">Refereeing Tasks</h2> + <h2 class="card-title">Publications</h2> <ul class="mb-0"> - <li><a href="{% url 'submissions:accept_or_decline_ref_invitations' %}">Accept/decline refereeing invitations</a> ({{ nr_ref_inv_to_consider }})</li> + {% 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> - <div class="row"> + {# {% if own_publications %}#} + <div class="row" id="mypublicationslist"> <div class="col-12"> - <h3>Pending Refereeing Tasks:</h3> + <h3 class="mb-3">Publications for which you are identified as an author:</h3> </div> <div class="col-12"> - <ul class="list-group list-group-flush"> - {% for task in pending_ref_tasks %} - <li class="list-group-item"> - {% include 'submissions/_refereeing_invitation_card_content.html' with invitation=task %} - </li> - {% empty %} - <li class="list-group-item"><em>You do not have any pending refereeing task</em></li> - {% endfor %} + <ul class="list-unstyled"> + {% for pub in own_publications %} + <li> + <div class="card card-grey card-publication" id="{{pub.doi_label}}"> + {% include 'journals/_publication_card_content.html' with publication=pub current_user=request.user %} + </div> + </li> + {% empty %} + <li> + <em>No Publications found</em> + </li> + {% endfor %} </ul> </div> </div> + {# {% endif %}#} + </div><!-- End tab --> + - {% if contributor.reports.in_draft.exists %} + {% if perms.scipost.can_referee %} + <!-- Tab: Refereeing --> + <div class="tab-pane" id="refereeing" role="tabpanel"> <div class="row"> <div class="col-12"> - <h3>Unfinished reports:</h3> - </div> - <div class="col-12"> - <ul class="list-group list-group-flush"> - {% for report in contributor.reports.in_draft.all %} - <li class="list-group-item"> - <div class="w-100">{% include 'submissions/_submission_card_content.html' with submission=report.submission %}</div> - <div class="px-2 mb-2"><a class="px-1" href="{% url 'submissions:submit_report' report.submission.arxiv_identifier_w_vn_nr %}">Finish report</a></div> - </li> - {% endfor %} - </ul> + <div class="card card-grey"> + <div class="card-body"> + <h2 class="card-title">Refereeing Tasks</h2> + <ul class="mb-0"> + <li><a href="{% url 'submissions:accept_or_decline_ref_invitations' %}">Accept/decline refereeing invitations</a> ({{ nr_ref_inv_to_consider }})</li> + </ul> + </div> + </div> </div> </div> - {% endif %} - {% if contributor.reports.non_draft.exists %} <div class="row"> <div class="col-12"> - <h3>Finished reports:</h3> + <h3>Pending Refereeing Tasks:</h3> </div> <div class="col-12"> <ul class="list-group list-group-flush"> - {% for report in contributor.reports.non_draft.all %} + {% for task in pending_ref_tasks %} <li class="list-group-item"> - {% comment %} - Temporary: There is already a template for a "Report summary" in a parallel (unmerged) branch. Awaiting merge to use that template. - {% endcomment %} - <div class="card-body {% block cardblock_class_block %}{% endblock %}"> - <h3>Report on Submission <a href="{{report.submission.get_absolute_url}}">{{report.submission.title}}</a></h3> - <table> - <tr> - <th style='min-width: 100px;'>Received:</th><td>{{ report.date_submitted|date:'Y-n-j' }}<td> - </tr> - <tr> - <th>Status:</th><td {% if report.status == 'vetted' %}class="text-success"{% elif report.status == 'unvetted' %}class="text-danger"{% endif %}>{{report.get_status_display}}</td> - </tr> - {% if report.doi_label %} - <tr> - <th>DOI:</th><td>{{ report.doi_string }}</td></th> -{% endif %} - <tr> - <th>Anonymous:</th><td>{{report.anonymous|yesno:'Yes,No'}}</td>{% if report.anonymous %}<td>You can <a href="{% url 'journals:sign_existing_report' report_id=report.id %}">click here to sign this Report</a> (leads to confirmation page){% endif %}</td> - </tr> - </table> - </div> + {% include 'submissions/_refereeing_invitation_card_content.html' with invitation=task %} </li> + {% empty %} + <li class="list-group-item"><em>You do not have any pending refereeing task</em></li> {% endfor %} </ul> </div> </div> - {% endif %} - </div><!-- End tab --> - {% endif %} - <!-- Tab: Submissions --> - <div class="tab-pane" id="submissions" role="tabpanel"> - <div class="row"> - <div class="col-12"> - <div class="card card-grey"> - <div class="card-body"> - <h2 class="card-title">Submissions</h2> - <ul class="mb-0"> - {% if nr_submission_authorships_to_claim > 0 %} - <li><a href="{% url 'scipost:claim_authorships' %}">Potential authorships to claim (auto-detected: {{ nr_submission_authorships_to_claim}})</a></li> - {% endif %} - <li><a href="{% url 'submissions:submit_manuscript' %}">Submit an arXiv preprint to a SciPost Journal</a></li> - </ul> + {% if contributor.reports.in_draft.exists %} + <div class="row"> + <div class="col-12"> + <h3>Unfinished reports:</h3> + </div> + <div class="col-12"> + <ul class="list-group list-group-flush"> + {% for report in contributor.reports.in_draft.all %} + <li class="list-group-item"> + <div class="w-100">{% include 'submissions/_submission_card_content.html' with submission=report.submission %}</div> + <div class="px-2 mb-2"><a class="px-1" href="{% url 'submissions:submit_report' report.submission.arxiv_identifier_w_vn_nr %}">Finish report</a></div> + </li> + {% endfor %} + </ul> + </div> + </div> + {% endif %} + + {% if contributor.reports.non_draft.exists %} + <div class="row"> + <div class="col-12"> + <h3>Finished reports:</h3> + </div> + <div class="col-12"> + <ul class="list-group list-group-flush"> + {% for report in contributor.reports.non_draft.all %} + <li class="list-group-item"> + {% comment %} + Temporary: There is already a template for a "Report summary" in a parallel (unmerged) branch. Awaiting merge to use that template. + {% endcomment %} + <div class="card-body {% block cardblock_class_block %}{% endblock %}"> + <h3>Report on Submission <a href="{{report.submission.get_absolute_url}}">{{report.submission.title}}</a></h3> + <table> + <tr> + <th style='min-width: 100px;'>Received:</th><td>{{ report.date_submitted|date:'Y-n-j' }}<td> + </tr> + <tr> + <th>Status:</th><td {% if report.status == 'vetted' %}class="text-success"{% elif report.status == 'unvetted' %}class="text-danger"{% endif %}>{{report.get_status_display}}</td> + </tr> + {% if report.doi_label %} + <tr> + <th>DOI:</th><td>{{ report.doi_string }}</td></th> + {% endif %} + <tr> + <th>Anonymous:</th><td>{{report.anonymous|yesno:'Yes,No'}}</td>{% if report.anonymous %}<td>You can <a href="{% url 'journals:sign_existing_report' report_id=report.id %}">click here to sign this Report</a> (leads to confirmation page){% endif %}</td> + </tr> + </table> + </div> + </li> + {% endfor %} + </ul> + </div> + </div> + {% endif %} + </div><!-- End tab --> + {% endif %} + + <!-- Tab: Submissions --> + <div class="tab-pane" id="submissions" role="tabpanel"> + <div class="row"> + <div class="col-12"> + <div class="card card-grey"> + <div class="card-body"> + <h2 class="card-title">Submissions</h2> + <ul class="mb-0"> + {% if nr_submission_authorships_to_claim > 0 %} + <li><a href="{% url 'scipost:claim_authorships' %}">Potential authorships to claim (auto-detected: {{ nr_submission_authorships_to_claim}})</a></li> + {% endif %} + <li><a href="{% url 'submissions:submit_manuscript' %}">Submit an arXiv preprint to a SciPost Journal</a></li> + </ul> + </div> </div> </div> </div> - </div> - {# {% if own_submissions %}#} - <div class="row" id="mysubmissionslist"> - <div class="col-12"> - <h3>Submissions for which you are identified as an author:</h3> - </div> - <div class="col-12"> - <ul class="list-group list-group-flush"> - {% for sub in own_submissions %} - <li class="list-group-item"> - {% include 'submissions/_submission_card_author_content.html' with submission=sub current_user=request.user %} - </li> - {% empty %} - <li class="list-group-item"> - <em>No Submissions found</em> - </li> - {% endfor %} - </ul> + {# {% if own_submissions %}#} + <div class="row" id="mysubmissionslist"> + <div class="col-12"> + <h3>Submissions for which you are identified as an author:</h3> + </div> + <div class="col-12"> + <ul class="list-group list-group-flush"> + {% for sub in own_submissions %} + <li class="list-group-item"> + {% include 'submissions/_submission_card_author_content.html' with submission=sub current_user=request.user %} + </li> + {% empty %} + <li class="list-group-item"> + <em>No Submissions found</em> + </li> + {% endfor %} + </ul> + </div> </div> - </div> - {# {% endif %}#} - </div><!-- End tab --> + {# {% endif %}#} + </div><!-- End tab --> - <!-- Tab: Commentaries --> - <div class="tab-pane" id="commentaries" role="tabpanel"> - <div class="row"> - <div class="col-12"> - <div class="card card-grey"> - <div class="card-body"> - <h2 class="card-title">Commentaries</h2> - <ul class="mb-0"> - {% if nr_commentary_authorships_to_claim > 0 %} - <li><a href="{% url 'scipost:claim_authorships' %}">Potential authorships to claim (auto-detected: {{ nr_commentary_authorships_to_claim}})</a></li> - {% endif %} - <li><a href="{% url 'commentaries:request_commentary' %}">Request opening a SciPost Commentary Page</a></li> - </ul> + <!-- Tab: Commentaries --> + <div class="tab-pane" id="commentaries" role="tabpanel"> + <div class="row"> + <div class="col-12"> + <div class="card card-grey"> + <div class="card-body"> + <h2 class="card-title">Commentaries</h2> + <ul class="mb-0"> + {% if nr_commentary_authorships_to_claim > 0 %} + <li><a href="{% url 'scipost:claim_authorships' %}">Potential authorships to claim (auto-detected: {{ nr_commentary_authorships_to_claim}})</a></li> + {% endif %} + <li><a href="{% url 'commentaries:request_commentary' %}">Request opening a SciPost Commentary Page</a></li> + </ul> + </div> </div> </div> </div> - </div> - <div class="row" id="mycommentarieslist"> - <div class="col-12"> - <h3>Commentaries for which you are identified as an author:</h3> - </div> - <div class="col-12"> - <ul class="list-group list-group-flush"> - {% for com in own_commentaries %} - <li class="list-group-item"> - {% include 'commentaries/_commentary_card_content.html' with commentary=com %} - </li> - {% empty %} - <li class="list-group-item"><em>No Commentaries found</em></li> - {% endfor %} - </ul> + <div class="row" id="mycommentarieslist"> + <div class="col-12"> + <h3>Commentaries for which you are identified as an author:</h3> + </div> + <div class="col-12"> + <ul class="list-group list-group-flush"> + {% for com in own_commentaries %} + <li class="list-group-item"> + {% include 'commentaries/_commentary_card_content.html' with commentary=com %} + </li> + {% empty %} + <li class="list-group-item"><em>No Commentaries found</em></li> + {% endfor %} + </ul> + </div> </div> - </div> - </div><!-- End tab --> + </div><!-- End tab --> - <!-- Tab: Theses --> - <div class="tab-pane" id="theses" role="tabpanel"> - <div class="row"> - <div class="col-12"> - <div class="card card-grey"> - <div class="card-body"> - <h2 class="card-title">Theses</h2> - <ul class="mb-0"> - {% if nr_thesis_authorships_to_claim > 0 %} - <li><a href="{% url 'scipost:claim_authorships' %}">Potential authorships to claim (auto-detected: {{ nr_thesis_authorships_to_claim}})</a></li> - {% endif %} - <li><a href="{% url 'theses:request_thesislink' %}">Request a SciPost ThesisLink</a></li> - </ul> + <!-- Tab: Theses --> + <div class="tab-pane" id="theses" role="tabpanel"> + <div class="row"> + <div class="col-12"> + <div class="card card-grey"> + <div class="card-body"> + <h2 class="card-title">Theses</h2> + <ul class="mb-0"> + {% if nr_thesis_authorships_to_claim > 0 %} + <li><a href="{% url 'scipost:claim_authorships' %}">Potential authorships to claim (auto-detected: {{ nr_thesis_authorships_to_claim}})</a></li> + {% endif %} + <li><a href="{% url 'theses:request_thesislink' %}">Request a SciPost ThesisLink</a></li> + </ul> + </div> </div> </div> </div> - </div> - <div class="row" id="mytheseslist"> - <div class="col-12"> - <h3>Theses for which you are identified as an author:</h3> - </div> - <div class="col-12"> - <ul class="list-group list-group-flush"> - {% for thesis in own_thesislinks %} - <li class="list-group-item"> - {% include 'theses/_thesislink_card_content.html' with thesislink=thesis %} - </li> - {% empty %} - <li class="list-group-item"><em>No Theses found</em></li> - {% endfor %} - </ul> + <div class="row" id="mytheseslist"> + <div class="col-12"> + <h3>Theses for which you are identified as an author:</h3> + </div> + <div class="col-12"> + <ul class="list-group list-group-flush"> + {% for thesis in own_thesislinks %} + <li class="list-group-item"> + {% include 'theses/_thesislink_card_content.html' with thesislink=thesis %} + </li> + {% empty %} + <li class="list-group-item"><em>No Theses found</em></li> + {% endfor %} + </ul> + </div> </div> - </div> - </div><!-- End tab --> + </div><!-- End tab --> - <!-- Tab: Comments --> - <div class="tab-pane" id="comments" role="tabpanel"> - <div class="row"> - <div class="col-12"> - <div class="card card-grey"> - <div class="card-body"> - <h2 class="card-title mb-0">Your Comments</h2> + <!-- Tab: Comments --> + <div class="tab-pane" id="comments" role="tabpanel"> + <div class="row"> + <div class="col-12"> + <div class="card card-grey"> + <div class="card-body"> + <h2 class="card-title mb-0">Your Comments</h2> + </div> </div> </div> </div> - </div> - <div class="row" id="mycommentslist"> - <div class="col-12"> - <ul class="list-group list-group-flush"> - {% for own_comment in own_comments %} - <li class="list-group-item"> - {% include 'comments/_comment_card_extended_for_author.html' with comment=own_comment %} - </li> - {% empty %} - <li class="list-group-item"><em>You have not commented yet.</em></li> - {% endfor %} - </ul> + <div class="row" id="mycommentslist"> + <div class="col-12"> + <ul class="list-group list-group-flush"> + {% for own_comment in own_comments %} + <li class="list-group-item"> + {% include 'comments/_comment_card_extended_for_author.html' with comment=own_comment %} + </li> + {% empty %} + <li class="list-group-item"><em>You have not commented yet.</em></li> + {% endfor %} + </ul> + </div> </div> - </div> - </div><!-- End tab --> + </div><!-- End tab --> - <!-- Tab: Author Replies --> - <div class="tab-pane" id="author-replies" role="tabpanel"> - <div class="row"> - <div class="col-12"> - <div class="card card-grey"> - <div class="card-body"> - <h2 class="card-title mb-0">Your Author Replies</h2> + <!-- Tab: Author Replies --> + <div class="tab-pane" id="author-replies" role="tabpanel"> + <div class="row"> + <div class="col-12"> + <div class="card card-grey"> + <div class="card-body"> + <h2 class="card-title mb-0">Your Author Replies</h2> + </div> </div> </div> </div> - </div> - <div class="row" id="myauthorreplieslist"> - <div class="col-12"> - <ul class="list-group list-group-flush"> - {% for own_reply in own_authorreplies %} - <li class="list-group-item"> - {% include 'comments/_comment_card_extended_for_author.html' with comment=own_reply %} - </li> - {% empty %} - <li class="list-group-item"><em>You do not have Author Replies yet.</em></li> - {% endfor %} - </ul> + <div class="row" id="myauthorreplieslist"> + <div class="col-12"> + <ul class="list-group list-group-flush"> + {% for own_reply in own_authorreplies %} + <li class="list-group-item"> + {% include 'comments/_comment_card_extended_for_author.html' with comment=own_reply %} + </li> + {% empty %} + <li class="list-group-item"><em>You do not have Author Replies yet.</em></li> + {% endfor %} + </ul> + </div> </div> - </div> - </div><!-- End tab --> + </div><!-- End tab --> + + {# END: If user is contributor #} + {% endif %} </div> {% endif %} diff --git a/scipost/views.py b/scipost/views.py index 5c09fe3e6..58b871563 100644 --- a/scipost/views.py +++ b/scipost/views.py @@ -19,7 +19,8 @@ from guardian.decorators import permission_required from guardian.shortcuts import assign_perm, get_objects_for_user from haystack.generic_views import SearchView -from .constants import SCIPOST_SUBJECT_AREAS, subject_areas_raw_dict, SciPost_from_addresses_dict +from .constants import SCIPOST_SUBJECT_AREAS, subject_areas_raw_dict, SciPost_from_addresses_dict,\ + CONTRIBUTOR_NORMAL from .decorators import has_contributor from .models import Contributor, CitationNotification, UnavailabilityPeriod,\ DraftInvitation, RegistrationInvitation,\ @@ -691,137 +692,136 @@ def delete_unavailable_period(request, period_id): @login_required -@user_passes_test(has_contributor) def personal_page(request): """ The Personal Page is the main view for accessing user functions. """ - contributor = Contributor.objects.select_related('user').get(user=request.user) - user_groups = contributor.user.groups.values_list('name', flat=True) - - # Compile the unavailability periods: - now = timezone.now() - unavailabilities = UnavailabilityPeriod.objects.filter( - contributor=contributor).exclude(end__lt=now).order_by('start') - unavailability_form = UnavailabilityPeriodForm() - - # if an editor, count the number of actions required: - nr_reg_to_vet = 0 - nr_reg_awaiting_validation = 0 - nr_submissions_to_assign = 0 - nr_recommendations_to_prepare_for_voting = 0 - if contributor.is_SP_Admin(): - # count the number of pending registration requests - nr_reg_to_vet = Contributor.objects.filter(user__is_active=True, status=0).count() - nr_reg_awaiting_validation = (Contributor.objects.awaiting_validation() - # .filter(key_expires__gte=now, key_expires__lte=intwodays) - .count()) - nr_submissions_to_assign = Submission.objects.filter(status__in=['unassigned']).count() - nr_recommendations_to_prepare_for_voting = EICRecommendation.objects.filter( - submission__status__in=['voting_in_preparation']).count() - - nr_assignments_to_consider = 0 - active_assignments = None - nr_reports_to_vet = 0 - if contributor.is_MEC(): - nr_assignments_to_consider = (EditorialAssignment.objects - .filter(to=contributor, accepted=None, deprecated=False) - .count()) - active_assignments = EditorialAssignment.objects.filter( - to=contributor, accepted=True, completed=False) - nr_reports_to_vet = (Report.objects.awaiting_vetting() - .filter(submission__editor_in_charge=contributor).count()) - nr_commentary_page_requests_to_vet = 0 - nr_comments_to_vet = 0 - nr_thesislink_requests_to_vet = 0 - nr_authorship_claims_to_vet = 0 - if contributor.is_VE(): - nr_commentary_page_requests_to_vet = (Commentary.objects.awaiting_vetting() - .exclude(requested_by=contributor).count()) - nr_comments_to_vet = Comment.objects.awaiting_vetting().count() - nr_thesislink_requests_to_vet = ThesisLink.objects.filter(vetted=False).count() - nr_authorship_claims_to_vet = AuthorshipClaim.objects.filter(status='0').count() - - # Refereeing - nr_ref_inv_to_consider = RefereeInvitation.objects.filter( - referee=contributor, accepted=None, cancelled=False).count() - pending_ref_tasks = RefereeInvitation.objects.filter( - referee=contributor, accepted=True, fulfilled=False) - refereeing_tab_total_count = nr_ref_inv_to_consider + len(pending_ref_tasks) - refereeing_tab_total_count += Report.objects.in_draft().filter(author=contributor).count() - - # 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]) - .exclude(authors_claims__in=[contributor]) - .exclude(authors_false_claims__in=[contributor]) - .count()) - nr_commentary_authorships_to_claim = (Commentary.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_thesis_authorships_to_claim = (ThesisLink.objects.filter( - author__contains=contributor.user.last_name) - .exclude(author_as_cont__in=[contributor]) - .exclude(author_claims__in=[contributor]) - .exclude(author_false_claims__in=[contributor]) - .count()) - own_comments = (Comment.objects.filter(author=contributor, is_author_reply=False) - .select_related('author', 'submission') - .order_by('-date_submitted')) - own_authorreplies = (Comment.objects.filter(author=contributor, is_author_reply=True) - .order_by('-date_submitted')) - - appellation = contributor.get_title_display() + ' ' + contributor.user.last_name context = { - 'contributor': contributor, - 'user_groups': user_groups, - 'appellation': appellation, - 'unavailabilities': unavailabilities, - 'unavailability_form': unavailability_form, - 'nr_reg_to_vet': nr_reg_to_vet, - 'nr_reg_awaiting_validation': nr_reg_awaiting_validation, - 'nr_commentary_page_requests_to_vet': nr_commentary_page_requests_to_vet, - 'nr_comments_to_vet': nr_comments_to_vet, - 'nr_thesislink_requests_to_vet': nr_thesislink_requests_to_vet, - 'nr_authorship_claims_to_vet': nr_authorship_claims_to_vet, - 'nr_reports_to_vet': nr_reports_to_vet, - 'nr_submissions_to_assign': nr_submissions_to_assign, - '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, - 'own_comments': own_comments, - 'own_authorreplies': own_authorreplies, + 'appellation': str(request.user), + 'needs_validation': False, } + try: + contributor = Contributor.objects.select_related('user').get(user=request.user) + context['needs_validation'] = contributor.status != CONTRIBUTOR_NORMAL + except Contributor.DoesNotExist: + contributor = None + context['user_groups'] = request.user.groups.values_list('name', flat=True) + + if contributor: + # Compile the unavailability periods: + now = timezone.now() + unavailabilities = contributor.unavailability_periods.exclude(end__lt=now).order_by('start') + unavailability_form = UnavailabilityPeriodForm() + + # if an editor, count the number of actions required: + nr_reg_to_vet = 0 + nr_reg_awaiting_validation = 0 + nr_submissions_to_assign = 0 + nr_recommendations_to_prepare_for_voting = 0 + if contributor.is_SP_Admin(): + # count the number of pending registration requests + nr_reg_to_vet = Contributor.objects.awaiting_vetting().count() + nr_reg_awaiting_validation = (Contributor.objects.awaiting_validation() + .count()) + nr_submissions_to_assign = Submission.objects.prescreening().count() + nr_recommendations_to_prepare_for_voting = EICRecommendation.objects.filter( + submission__status='voting_in_preparation').count() + + nr_assignments_to_consider = 0 + active_assignments = None + nr_reports_to_vet = 0 + if contributor.is_MEC(): + nr_assignments_to_consider = (contributor.editorial_assignments + .in_consideration().count()) + active_assignments = contributor.editorial_assignments.ongoing() + nr_reports_to_vet = (Report.objects.awaiting_vetting() + .filter(submission__editor_in_charge=contributor).count()) + + nr_commentary_page_requests_to_vet = 0 + nr_comments_to_vet = 0 + nr_thesislink_requests_to_vet = 0 + nr_authorship_claims_to_vet = 0 + if contributor.is_VE(): + nr_commentary_page_requests_to_vet = (Commentary.objects.awaiting_vetting() + .exclude(requested_by=contributor).count()) + nr_comments_to_vet = Comment.objects.awaiting_vetting().count() + nr_thesislink_requests_to_vet = ThesisLink.objects.awaiting_vetting().count() + nr_authorship_claims_to_vet = AuthorshipClaim.objects.awaiting_vetting().count() + + # Refereeing + nr_ref_inv_to_consider = contributor.referee_invitations.in_consideration().count() + pending_ref_tasks = contributor.referee_invitations.in_process() + refereeing_tab_total_count = nr_ref_inv_to_consider + len(pending_ref_tasks) + refereeing_tab_total_count += contributor.reports.in_draft().count() + + # Verify if there exist objects authored by this contributor, + # whose authorship hasn't been claimed yet + own_publications = contributor.publications.order_by('-publication_date') + own_submissions = contributor.submissions.filter(is_current=True).order_by('-submission_date') + own_commentaries = contributor.commentaries.order_by('-latest_activity') + own_thesislinks = contributor.theses.all() + nr_publication_authorships_to_claim = (Publication.objects.filter( + author_list__contains=contributor.user.last_name) + .exclude(authors=contributor) + .exclude(authors_claims=contributor) + .exclude(authors_false_claims=contributor) + .count()) + nr_submission_authorships_to_claim = (Submission.objects.filter( + author_list__contains=contributor.user.last_name) + .exclude(authors=contributor) + .exclude(authors_claims=contributor) + .exclude(authors_false_claims=contributor) + .count()) + nr_commentary_authorships_to_claim = (Commentary.objects.filter( + author_list__contains=contributor.user.last_name) + .exclude(authors=contributor) + .exclude(authors_claims=contributor) + .exclude(authors_false_claims=contributor) + .count()) + nr_thesis_authorships_to_claim = (ThesisLink.objects.filter( + author__contains=contributor.user.last_name) + .exclude(author_as_cont=contributor) + .exclude(author_claims=contributor) + .exclude(author_false_claims=contributor) + .count()) + own_comments = (contributor.comments.regular_comments() + .select_related('author', 'submission') + .order_by('-date_submitted')) + own_authorreplies = (contributor.comments.author_replies() + .order_by('-date_submitted')) + + appellation = contributor.get_title_display() + ' ' + contributor.user.last_name + + context.update({ + 'contributor': contributor, + 'appellation': appellation, + 'unavailabilities': unavailabilities, + 'unavailability_form': unavailability_form, + 'nr_reg_to_vet': nr_reg_to_vet, + 'nr_reg_awaiting_validation': nr_reg_awaiting_validation, + 'nr_commentary_page_requests_to_vet': nr_commentary_page_requests_to_vet, + 'nr_comments_to_vet': nr_comments_to_vet, + 'nr_thesislink_requests_to_vet': nr_thesislink_requests_to_vet, + 'nr_authorship_claims_to_vet': nr_authorship_claims_to_vet, + 'nr_reports_to_vet': nr_reports_to_vet, + 'nr_submissions_to_assign': nr_submissions_to_assign, + '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, + 'own_comments': own_comments, + 'own_authorreplies': own_authorreplies, + }) # Only add variables if user has right permission if request.user.has_perm('scipost.can_manage_reports'): diff --git a/submissions/managers.py b/submissions/managers.py index ca6bf98c7..d9094c7e4 100644 --- a/submissions/managers.py +++ b/submissions/managers.py @@ -199,6 +199,9 @@ class EditorialAssignmentQuerySet(models.QuerySet): def ongoing(self): return self.filter(completed=False).accepted() + def in_consideration(self): + return self.filter(deprecated=False).ignored() + class EICRecommendationManager(models.Manager): def get_for_user_in_pool(self, user): @@ -260,3 +263,9 @@ class RefereeInvitationQuerySet(models.QuerySet): def declined(self): return self.filter(accepted=False) + + def in_consideration(self): + return self.pending().filter(cancelled=False) + + def in_process(self): + return self.accepted().filter(fulfilled=False) diff --git a/submissions/models.py b/submissions/models.py index 65896271e..488e934f9 100644 --- a/submissions/models.py +++ b/submissions/models.py @@ -35,7 +35,7 @@ from journals.models import Publication ############### class Submission(models.Model): # Main submission fields - author_comments = models.TextField(blank=True, null=True) + author_comments = models.TextField(blank=True) author_list = models.CharField(max_length=1000, verbose_name="author list") discipline = models.CharField(max_length=20, choices=SCIPOST_DISCIPLINES, default='physics') domain = models.CharField(max_length=3, choices=SCIPOST_JOURNALS_DOMAINS) @@ -43,12 +43,12 @@ class Submission(models.Model): null=True, on_delete=models.CASCADE) is_current = models.BooleanField(default=True) is_resubmission = models.BooleanField(default=False) - list_of_changes = models.TextField(blank=True, null=True) + list_of_changes = models.TextField(blank=True) open_for_commenting = models.BooleanField(default=False) open_for_reporting = models.BooleanField(default=False) - referees_flagged = models.TextField(blank=True, null=True) - referees_suggested = models.TextField(blank=True, null=True) - remarks_for_editors = models.TextField(blank=True, null=True) + referees_flagged = models.TextField(blank=True) + referees_suggested = models.TextField(blank=True) + remarks_for_editors = models.TextField(blank=True) reporting_deadline = models.DateTimeField(default=timezone.now) secondary_areas = ChoiceArrayField( models.CharField(max_length=10, choices=SCIPOST_SUBJECT_AREAS), @@ -62,7 +62,8 @@ class Submission(models.Model): verbose_name='Primary subject area', default='Phys:QP') submission_type = models.CharField(max_length=10, choices=SUBMISSION_TYPE, blank=True, null=True, default=None) - submitted_by = models.ForeignKey('scipost.Contributor', on_delete=models.CASCADE) + submitted_by = models.ForeignKey('scipost.Contributor', on_delete=models.CASCADE, + related_name='submitted_submissions') # Replace this by foreignkey? submitted_to_journal = models.CharField(max_length=30, choices=SCIPOST_JOURNALS_SUBMIT, @@ -70,11 +71,11 @@ class Submission(models.Model): title = models.CharField(max_length=300) # Authors which have been mapped to contributors: - authors = models.ManyToManyField('scipost.Contributor', blank=True, related_name='authors_sub') + authors = models.ManyToManyField('scipost.Contributor', blank=True, related_name='submissions') authors_claims = models.ManyToManyField('scipost.Contributor', blank=True, - related_name='authors_sub_claims') + related_name='claimed_submissions') authors_false_claims = models.ManyToManyField('scipost.Contributor', blank=True, - related_name='authors_sub_false_claims') + related_name='false_claimed_submissions') abstract = models.TextField() # Comments can be added to a Submission @@ -279,8 +280,8 @@ class EditorialAssignment(SubmissionRelatedObjectMixin, models.Model): class RefereeInvitation(SubmissionRelatedObjectMixin, models.Model): submission = models.ForeignKey('submissions.Submission', on_delete=models.CASCADE, related_name='referee_invitations') - referee = models.ForeignKey('scipost.Contributor', related_name='referee', blank=True, - null=True, on_delete=models.CASCADE) # Why is this blank/null=True + referee = models.ForeignKey('scipost.Contributor', related_name='referee_invitations', + blank=True, null=True, on_delete=models.CASCADE) title = models.CharField(max_length=4, choices=TITLE_CHOICES) first_name = models.CharField(max_length=30, default='') last_name = models.CharField(max_length=30, default='') @@ -353,7 +354,8 @@ class Report(SubmissionRelatedObjectMixin, models.Model): # `flagged' if author of report has been flagged by submission authors (surname check only) flagged = models.BooleanField(default=False) date_submitted = models.DateTimeField('date submitted') - author = models.ForeignKey('scipost.Contributor', on_delete=models.CASCADE) + author = models.ForeignKey('scipost.Contributor', on_delete=models.CASCADE, + related_name='reports') qualification = models.PositiveSmallIntegerField( choices=REFEREE_QUALIFICATION, verbose_name="Qualification to referee this: I am") diff --git a/theses/managers.py b/theses/managers.py index 4d2b06986..532868fe9 100644 --- a/theses/managers.py +++ b/theses/managers.py @@ -16,5 +16,8 @@ class ThesisLinkManager(models.Manager): def vetted(self): return self.filter(vetted=True) + def awaiting_vetting(self): + return self.filter(vetted=False) + def open_for_commenting(self): return self.filter(open_for_commenting=True) diff --git a/theses/models.py b/theses/models.py index ad143b5a7..a6c05936e 100644 --- a/theses/models.py +++ b/theses/models.py @@ -14,7 +14,7 @@ class ThesisLink(models.Model): """ An URL pointing to a thesis """ requested_by = models.ForeignKey( 'scipost.Contributor', blank=True, null=True, - related_name='thesislink_requested_by', + related_name='requested_theses', on_delete=models.CASCADE) vetted = models.BooleanField(default=False) vetted_by = models.ForeignKey( @@ -37,18 +37,18 @@ class ThesisLink(models.Model): author = models.CharField(max_length=1000) author_as_cont = models.ManyToManyField( 'scipost.Contributor', blank=True, - related_name='author_cont') + related_name='theses') author_claims = models.ManyToManyField( 'scipost.Contributor', blank=True, - related_name='authors_thesis_claims') + related_name='claimed_theses') author_false_claims = models.ManyToManyField( 'scipost.Contributor', blank=True, - related_name='authors_thesis_false_claims') + related_name='false_claimed_theses') supervisor = models.CharField(max_length=1000) supervisor_as_cont = models.ManyToManyField( 'scipost.Contributor', blank=True, verbose_name='supervisor(s)', - related_name='supervisor_cont') + related_name='supervised_theses') institution = models.CharField( max_length=300, verbose_name='degree granting institution') -- GitLab