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