diff --git a/SciPost_v1/settings/base.py b/SciPost_v1/settings/base.py index 6bbf98dffecc06f1664e6a5ee1cc0fcfc0ccc8be..7758de6ee883377b474cd745ca936f0a56bade95 100644 --- a/SciPost_v1/settings/base.py +++ b/SciPost_v1/settings/base.py @@ -156,7 +156,6 @@ TEMPLATES = [ 'django.template.context_processors.media', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', - 'scipost.context_processors.searchform', ], }, }, diff --git a/SciPost_v1/settings/local_jorran.py b/SciPost_v1/settings/local_jorran.py index 1eef068e824bdaaa5e51f1b16a15cf80cee2b724..12dcdcfa68b6054fae82ccda1936723bab419563 100644 --- a/SciPost_v1/settings/local_jorran.py +++ b/SciPost_v1/settings/local_jorran.py @@ -3,6 +3,15 @@ from .base import * # THE MAIN THING HERE DEBUG = True +# Debug toolbar settings +INSTALLED_APPS += ( + 'debug_toolbar', +) +MIDDLEWARE_CLASSES += ( + 'debug_toolbar.middleware.DebugToolbarMiddleware', +) +INTERNAL_IPS = ['127.0.0.1', '::1'] + # Static and media STATIC_ROOT = '/Users/jorranwit/Develop/SciPost/scipost_v1/local_files/static/' MEDIA_ROOT = '/Users/jorranwit/Develop/SciPost/scipost_v1/local_files/media/' diff --git a/SciPost_v1/urls.py b/SciPost_v1/urls.py index 9391da29315f2d285bc84dc132c7e7dafa617cb8..11c640116c6bffe41466958b01638c47d83103c9 100644 --- a/SciPost_v1/urls.py +++ b/SciPost_v1/urls.py @@ -33,3 +33,9 @@ urlpatterns = [ url(r'^thesis/', include('theses.urls', namespace="theses")), url(r'^news/', include('news.urls', namespace="news")), ] + +if settings.DEBUG: + import debug_toolbar + urlpatterns += [ + url(r'^__debug__/', include(debug_toolbar.urls)), + ] diff --git a/commentaries/views.py b/commentaries/views.py index 640100a7c22436864ce3aab1e7b49e76f10a0c67..e103063d5ff6074d4a37aa0137a51efb166697cd 100644 --- a/commentaries/views.py +++ b/commentaries/views.py @@ -282,7 +282,9 @@ class CommentaryListView(ListView): context = super().get_context_data(**kwargs) # Get newest comments - context['comment_list'] = Comment.objects.vetted().order_by('-date_submitted')[:10] + context['comment_list'] = Comment.objects.vetted().select_related( + 'author__user', 'submission', 'commentary').order_by( + '-date_submitted')[:10] # Form into the context! context['form'] = self.form diff --git a/requirements.txt b/requirements.txt index 4e1cfb752935824e29985016edb1fd1bbd4c30e8..a5406b89e2df28e0fe9829ed55487fbc1455a010 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,7 @@ Babel==2.3.4 Django==1.10.3 django-countries==4.0 django-crispy-forms==1.6.1 +django-debug-toolbar==1.7 django-extensions==1.7.6 django-filter==1.0.0 django-guardian==1.4.6 diff --git a/scipost/context_processors.py b/scipost/context_processors.py deleted file mode 100644 index 19c0fbf686bb62fb3d3908d1f0a370bc9f23165b..0000000000000000000000000000000000000000 --- a/scipost/context_processors.py +++ /dev/null @@ -1,5 +0,0 @@ -from .forms import SearchForm - - -def searchform(request): - return {'search_form': SearchForm()} diff --git a/scipost/forms.py b/scipost/forms.py index 04f36192dbf87b171561b533c64707c7afffa624..b1fb349c3b77db8289ca530b3eb26ea3b02409e3 100644 --- a/scipost/forms.py +++ b/scipost/forms.py @@ -210,9 +210,7 @@ class RemarkForm(forms.Form): class SearchForm(forms.Form): - query = forms.CharField(max_length=100, label='', - widget=forms.TextInput(attrs={ - 'class': 'form-control mr-0 mb-2 mr-lg-2 mb-lg-0'})) + q = forms.CharField(max_length=100) class EmailGroupMembersForm(forms.Form): diff --git a/scipost/models.py b/scipost/models.py index 4bde7f7afa12b3095ad0c2aff68273a00ba6db5a..119cd4ca97bba8bcb05694673499dc7ba9965a07 100644 --- a/scipost/models.py +++ b/scipost/models.py @@ -428,220 +428,6 @@ class PrecookedEmail(models.Model): return self.email_subject -##################################### -# Virtual General Meetings, Motions # -##################################### - -# class VGM(models.Model): -# """ -# Each year, a Virtual General Meeting is held during which operations at -# SciPost are discussed. A VGM can be attended by Administrators, -# Advisory Board members and Editorial Fellows. -# """ -# start_date = models.DateField() -# end_date = models.DateField() -# information = models.TextField(default='') -# -# def __str__(self): -# return 'From %s to %s' % (self.start_date.strftime('%Y-%m-%d'), -# self.end_date.strftime('%Y-%m-%d')) -# -# -# class Feedback(models.Model): -# """ -# Feedback, suggestion or criticism on any aspect of SciPost. -# """ -# VGM = models.ForeignKey(VGM, blank=True, null=True) -# by = models.ForeignKey(Contributor) -# date = models.DateField() -# feedback = models.TextField() -# -# def __str__(self): -# return '%s: %s' % (self.by, self.feedback[:50]) -# -# def as_li(self): -# html = ('<div class="Feedback">' -# '<h3><em>by {{ by }}</em></h3>' -# '<p>{{ feedback|linebreaks }}</p>' -# '</div>') -# context = Context({ -# 'feedback': self.feedback, -# 'by': '%s %s' % (self.by.user.first_name, -# self.by.user.last_name)}) -# template = Template(html) -# return template.render(context) -# -# -# class Nomination(models.Model): -# """ -# Nomination to an Editorial Fellowship. -# """ -# VGM = models.ForeignKey(VGM, blank=True, null=True) -# by = models.ForeignKey(Contributor) -# date = models.DateField() -# first_name = models.CharField(max_length=30, default='') -# last_name = models.CharField(max_length=30, default='') -# discipline = models.CharField(max_length=20, choices=SCIPOST_DISCIPLINES, -# default='physics', verbose_name='Main discipline') -# expertises = ChoiceArrayField( -# models.CharField(max_length=10, choices=SCIPOST_SUBJECT_AREAS), -# blank=True, null=True) -# webpage = models.URLField(default='') -# nr_A = models.PositiveIntegerField(default=0) -# in_agreement = models.ManyToManyField(Contributor, -# related_name='in_agreement_with_nomination', blank=True) -# nr_N = models.PositiveIntegerField(default=0) -# in_notsure = models.ManyToManyField(Contributor, -# related_name='in_notsure_with_nomination', blank=True) -# nr_D = models.PositiveIntegerField(default=0) -# in_disagreement = models.ManyToManyField(Contributor, -# related_name='in_disagreement_with_nomination', -# blank=True) -# voting_deadline = models.DateTimeField('voting deadline', default=timezone.now) -# accepted = models.NullBooleanField() -# -# def __str__(self): -# return '%s %s (nominated by %s)' % (self.first_name, -# self.last_name, -# self.by) -# -# def as_li(self): -# html = ('<div class="Nomination" id="nomination_id{{ nomination_id }}" ' -# 'style="background-color: #eeeeee;">' -# '<div class="row">' -# '<div class="col-4">' -# '<h3><em> {{ name }}</em></h3>' -# '<p>Nominated by {{ proposer }}</p>' -# '</div>' -# '<div class="col-4">' -# '<p><a href="{{ webpage }}">Webpage</a></p>' -# '<p>Discipline: {{ discipline }}</p></div>' -# '<div class="col-4"><p>expertise:<ul>') -# for exp in self.expertises: -# html += '<li>%s</li>' % subject_areas_dict[exp] -# html += '</ul></div></div></div>' -# context = Context({ -# 'nomination_id': self.id, -# 'proposer': '%s %s' % (self.by.user.first_name, -# self.by.user.last_name), -# 'name': self.first_name + ' ' + self.last_name, -# 'discipline': disciplines_dict[self.discipline], -# 'webpage': self.webpage, -# }) -# template = Template(html) -# return template.render(context) -# -# def votes_as_ul(self): -# template = Template(''' -# <ul class="opinionsDisplay"> -# <li style="background-color: #000099">Agree {{ nr_A }}</li> -# <li style="background-color: #555555">Abstain {{ nr_N }}</li> -# <li style="background-color: #990000">Disagree {{ nr_D }}</li> -# </ul> -# ''') -# context = Context({'nr_A': self.nr_A, 'nr_N': self.nr_N, 'nr_D': self.nr_D}) -# return template.render(context) -# -# def update_votes(self, contributor_id, vote): -# contributor = get_object_or_404(Contributor, pk=contributor_id) -# self.in_agreement.remove(contributor) -# self.in_notsure.remove(contributor) -# self.in_disagreement.remove(contributor) -# if vote == 'A': -# self.in_agreement.add(contributor) -# elif vote == 'N': -# self.in_notsure.add(contributor) -# elif vote == 'D': -# self.in_disagreement.add(contributor) -# self.nr_A = self.in_agreement.count() -# self.nr_N = self.in_notsure.count() -# self.nr_D = self.in_disagreement.count() -# self.save() -# -# -# MOTION_CATEGORIES = ( -# ('ByLawAmend', 'Amendments to by-laws'), -# ('Workflow', 'Editorial workflow improvements'), -# ('General', 'General'), -# ) -# motion_categories_dict = dict(MOTION_CATEGORIES) -# -# -# class Motion(models.Model): -# """ -# Motion instances are put forward to the Advisory Board and Editorial College -# and detail suggested changes to rules, procedures etc. -# They are meant to be voted on at the annual VGM. -# """ -# category = models.CharField(max_length=10, choices=MOTION_CATEGORIES, -# default='General') -# VGM = models.ForeignKey(VGM, blank=True, null=True) -# background = models.TextField() -# motion = models.TextField() -# put_forward_by = models.ForeignKey(Contributor) -# date = models.DateField() -# nr_A = models.PositiveIntegerField(default=0) -# in_agreement = models.ManyToManyField(Contributor, -# related_name='in_agreement_with_motion', blank=True) -# nr_N = models.PositiveIntegerField(default=0) -# in_notsure = models.ManyToManyField(Contributor, -# related_name='in_notsure_with_motion', blank=True) -# nr_D = models.PositiveIntegerField(default=0) -# in_disagreement = models.ManyToManyField(Contributor, -# related_name='in_disagreement_with_motion', -# blank=True) -# voting_deadline = models.DateTimeField('voting deadline', default=timezone.now) -# accepted = models.NullBooleanField() -# -# def __str__(self): -# return self.motion[:32] -# -# def as_li(self): -# html = ('<div class="Motion" id="motion_id{{ motion_id }}">' -# '<h3><em>Motion {{ motion_id }}, put forward by {{ proposer }}</em></h3>' -# '<h3>Background:</h3><p>{{ background|linebreaks }}</p>' -# '<h3>Motion:</h3>' -# '<div class="flex-container"><div class="flex-greybox">' -# '<p style="background-color: #eeeeee;">{{ motion|linebreaks }}</p>' -# '</div></div>' -# '</div>') -# context = Context({ -# 'motion_id': self.id, -# 'proposer': '%s %s' % (self.put_forward_by.user.first_name, -# self.put_forward_by.user.last_name), -# 'background': self.background, -# 'motion': self.motion, }) -# template = Template(html) -# return template.render(context) -# -# def votes_as_ul(self): -# template = Template(''' -# <ul class="opinionsDisplay"> -# <li style="background-color: #000099">Agree {{ nr_A }}</li> -# <li style="background-color: #555555">Abstain {{ nr_N }}</li> -# <li style="background-color: #990000">Disagree {{ nr_D }}</li> -# </ul> -# ''') -# context = Context({'nr_A': self.nr_A, 'nr_N': self.nr_N, 'nr_D': self.nr_D}) -# return template.render(context) -# -# def update_votes(self, contributor_id, vote): -# contributor = get_object_or_404(Contributor, pk=contributor_id) -# self.in_agreement.remove(contributor) -# self.in_notsure.remove(contributor) -# self.in_disagreement.remove(contributor) -# if vote == 'A': -# self.in_agreement.add(contributor) -# elif vote == 'N': -# self.in_notsure.add(contributor) -# elif vote == 'D': -# self.in_disagreement.add(contributor) -# self.nr_A = self.in_agreement.count() -# self.nr_N = self.in_notsure.count() -# self.nr_D = self.in_disagreement.count() -# self.save() - - ######### # Lists # ######### diff --git a/scipost/templates/scipost/navbar.html b/scipost/templates/scipost/navbar.html index 04cce9fedff90383eb8df8bf20fd99d4fdc1d979..29161549ed69fbbefbb3dd886868c413b44f1f65 100644 --- a/scipost/templates/scipost/navbar.html +++ b/scipost/templates/scipost/navbar.html @@ -38,9 +38,8 @@ {% endif %} </ul> - <form action="{% url 'scipost:search' %}" method="post" class="form-inline"> - {% csrf_token %} - {{ search_form }} + <form action="{% url 'scipost:search' %}" method="get" class="form-inline"> + <input class="form-control mr-0 mb-2 mr-lg-2 mb-lg-0" id="id_q" maxlength="100" name="q" type="text" required=""> <button class="btn btn-primary" type="submit">Search</button> </form> </div> diff --git a/scipost/templates/scipost/personal_page.html b/scipost/templates/scipost/personal_page.html index 151c11eb9e901a98ddaf2ab62aa65d523e5e31aa..2506e6f5f49f8fddd69695fc4e08fee6b2a39079 100644 --- a/scipost/templates/scipost/personal_page.html +++ b/scipost/templates/scipost/personal_page.html @@ -87,7 +87,7 @@ {% block content %} -{% if not request.user|is_in_group:'Registered Contributors' %} +{% if 'Registered Contributors' not in user_groups %} <div class="row"> <div class="col-12"> <hr class="hr12"> @@ -110,7 +110,7 @@ <div class="col-12"> <ul class="personalTabMenu"> <li><a class="TabItem" id="AccountTab">Account</a></li> - {% if request.user|is_in_group:'Editorial Administrators' or request.user|is_in_group:'Advisory Board' or request.user|is_in_group:'Editorial College' or request.user|is_in_group:'Vetting Editors' or request.user|is_in_group:'Ambassadors' or request.user|is_in_group:'Junior Ambassadors' %} + {% if 'Editorial Administrators' not in user_groups or 'Advisory Board' not in user_groups or 'Editorial College' not in user_groups or 'Vetting Editors' not in user_groups or 'Ambassadors' not in user_groups or 'Junior Ambassadors' not in user_groups %} <li><a class="TabItem" id="EdActionTab">Editorial Actions</a></li> {% endif %} <li><a class="TabItem" id="RefereeingTab">Refereeing</a></li> @@ -119,13 +119,13 @@ <li><a class="TabItem" id="ThesesTab">Theses</a></li> <li><a class="TabItem" id="CommentsTab">Comments</a></li> <li><a class="TabItem" id="AuthorRepliesTab">Author Replies</a></li> - {% if request.user|is_in_group:'Testers' %} + {% if 'Testers' in user_groups %} <li><a class="TabItem" id="ListsTab">Lists</a></li> {% endif %} - {% if request.user|is_in_group:'Testers' %} + {% if 'Testers' in user_groups %} <li><a class="TabItem" id="TeamsTab">Teams</a></li> {% endif %} - {% if request.user|is_in_group:'Testers' %} + {% if 'Testers' in user_groups %} <li><a class="TabItem" id="GraphsTab">Graphs</a></li> {% endif %} </ul> @@ -160,31 +160,31 @@ {% endif %} </div> <div class="col-md-6"> - {% if request.user|is_in_group:'SciPost Administrators' %} + {% if 'SciPost Administrators' in user_groups %} <h3>You are a SciPost Administrator.</h3> {% endif %} - {% if request.user|is_in_group:'Editorial Administrators' %} + {% if 'Editorial Administrators' in user_groups %} <h3>You are a SciPost Editorial Administrator.</h3> {% endif %} - {% if request.user|is_in_group:'Advisory Board' %} + {% if 'Advisory Board' in user_groups %} <h3>You are a member of the Advisory Board.</h3> {% endif %} - {% if request.user|is_in_group:'Editorial College' %} + {% if 'Editorial College' in user_groups %} <h3>You are a member of the Editorial College.</h3> {% endif %} - {% if request.user|is_in_group:'Vetting Editors' %} + {% if 'Vetting Editors' in user_groups %} <h3>You are a SciPost Vetting Editor.</h3> {% endif %} - {% if request.user|is_in_group:'Registered Contributors' %} + {% if 'Registered Contributors' in user_groups %} <h3>You are a Registered Contributor.</h3> {% endif %} - {% if request.user|is_in_group:'Testers' %} + {% if 'Testers' in user_groups %} <h3>You are a SciPost Tester.</h3> {% endif %} - {% if request.user|is_in_group:'Ambassadors' %} + {% if 'Ambassadors' in user_groups %} <h3>You are a SciPost Ambassador.</h3> {% endif %} - {% if request.user|is_in_group:'Junior Ambassadors' %} + {% if 'Junior Ambassadors' in user_groups %} <h3>You are a SciPost Junior Ambassador.</h3> {% endif %} @@ -239,7 +239,7 @@ </div> -{% if request.user|is_in_group:'SciPost Administrators' or request.user|is_in_group:'Editorial Administrators' or request.user|is_in_group:'Editorial College' or request.user|is_in_group:'Vetting Editors' or request.user|is_in_group:'Ambassadors' or request.user|is_in_group:'Junior Ambassadors' %} +{% if 'SciPost Administrators' in user_groups or 'Editorial Administrators' in user_groups or 'Editorial College' in user_groups or 'Vetting Editors' in user_groups or 'Ambassadors' in user_groups or 'Junior Ambassadors' in user_groups %} <div class="TabSection" id="EdActions"> <div class="row"> @@ -251,7 +251,7 @@ </div> <div class="row"> - {% if request.user|is_in_group:'SciPost Administrators' or request.user|is_in_group:'Advisory Board' or request.user|is_in_group:'Ambassadors' or request.user|is_in_group:'Junior Ambassadors' %} + {% if 'SciPost Administrators' in user_groups or 'Advisory Board' in user_groups or 'Ambassadors' in user_groups or 'Junior Ambassadors' in user_groups %} <div class="col-md-4"> <h3>Registration actions</h3> <ul> @@ -315,7 +315,7 @@ {% endif %} </div> - {% if request.user|is_in_group:'Editorial Administrators' or request.user|is_in_group:'Editorial College' %} + {% if 'Editorial Administrators' in user_groups or 'Editorial College' in user_groups %} <div class="col-md-4"> <h3>Info</h3> <ul> @@ -380,7 +380,7 @@ {% for task in pending_ref_tasks %} <li>{{ task.submission }}, due {{ task.submission.reporting_deadline }}. <a href="{% url 'submissions:submit_report' arxiv_identifier_w_vn_nr=task.submission.arxiv_identifier_w_vn_nr %}">Submit your Report</a> - <a href="{% url 'submissions:communication' arxiv_identifier_w_vn_nr=task.submission.arxiv_identifier_w_vn_nr comtype='RtoE' referee_id=request.user.contributor.id %}">Write to the Editor-in-charge</a>. + <a href="{% url 'submissions:communication' arxiv_identifier_w_vn_nr=task.submission.arxiv_identifier_w_vn_nr comtype='RtoE' referee_id=contributor.user.contributor.id %}">Write to the Editor-in-charge</a>. </li> {% endfor %} </ul> @@ -411,7 +411,7 @@ <ul class="mt-3"> {% for sub in own_submissions %} {{ sub.header_as_li_for_authors }} - {% if request.user.contributor == sub.submitted_by %} + {% if contributor.user.contributor == sub.submitted_by %} <p><a href="{% url 'submissions:communication' arxiv_identifier_w_vn_nr=sub.arxiv_identifier_w_vn_nr comtype='AtoE' %}">Write to the Editor-in-charge</a>.</p> {% endif %} {% endfor %} diff --git a/scipost/templates/scipost/search.html b/scipost/templates/scipost/search.html index 050dbafd542fae2959975c7f27117d6c7cece837..911e4686ed965a1f8a4ebb054ac3e25b8a0adcaa 100644 --- a/scipost/templates/scipost/search.html +++ b/scipost/templates/scipost/search.html @@ -2,125 +2,171 @@ {% block pagetitle %}: list{% endblock pagetitle %} -{% block headsup %} - -{% endblock headsup %} - -{% block bodysup %} - - -<section> - <h1>Search results</h1> - - {% if publication_search_list or commentary_search_list or submission_search_list or thesislink_search_list or comment_search_link %} - {% else %} - <p>Your search query did not return any result.</p> - {% endif %} - - {% if publication_search_list %} - <br /> - <hr class="hr12"> - <h3>Publications:</h3> - - <ul> - {% for publication in publication_search_list %} - {{ publication.header_as_li }} - {% endfor %} - </ul> - - <div class="pagination"> - <span class="step-links"> - {% if publication_search_list.has_previous %} - <a href="?publication_search_list_page={{ publication_search_list.previous_page_number }}">previous</a> - {% endif %} - <span class="current"> - Page {{ publication_search_list.number }} of {{ publication_search_list.paginator.num_pages }}. - </span> - {% if publication_search_list.has_next %} - <a href="?publication_search_list_page={{ publication_search_list.next_page_number }}">next</a> - {% endif %} - </span> - </div> - - {% endif %} - - - {% if commentary_search_list %} - <br /> - <hr class="hr12"> - <h3>Commentaries:</h3> - - <ul> - {% for commentary in commentary_search_list %} - {{ commentary.header_as_li }} - {% endfor %} - </ul> - - <div class="pagination"> - <span class="step-links"> - {% if commentary_search_list.has_previous %} - <a href="?commentary_search_list_page={{ commentary_search_list.previous_page_number }}">previous</a> - {% endif %} - <span class="current"> - Page {{ commentary_search_list.number }} of {{ commentary_search_list.paginator.num_pages }}. - </span> - {% if commentary_search_list.has_next %} - <a href="?commentary_search_list_page={{ commentary_search_list.next_page_number }}">next</a> - {% endif %} - </span> - </div> - - {% endif %} - - - {% if submission_search_list %} - <br /> - <hr class="hr12"> - <h3>Submissions:</h3> - <ul> - {% for submission in submission_search_list %} - {{ submission.header_as_li }} - {% endfor %} - </ul> - - <div class="pagination"> - <span class="step-links"> - {% if submission_search_list.has_previous %} - <a href="?submission_search_list_page={{ submission_search_list.previous_page_number }}">previous</a> - {% endif %} - <span class="current"> - Page {{ submission_search_list.number }} of {{ submission_search_list.paginator.num_pages }} - </span> - {% if submission_search_list.has_next %} - <a href="?submission_search_list_page={{ submission_search_list.next_page_number }}">next</a> - {% endif %} - </span> - </div> - - {% endif %} - - {% if thesislink_search_list %} - <br /> - <hr class="hr12"> - <h3>Theses:</h3> - <ul> - {% for thesislink in thesislink_search_list %} - {% include 'theses/_thesislink_header_as_li.html' with thesislink=thesislink %} - {% endfor %} - </ul> - {% endif %} - - {% if comment_search_list %} - <br /> - <hr class="hr12"> - <h3>Comments:</h3> - <ul> - {% for comment in comment_search_list %} - {{ comment.header_as_li }} - {% endfor %} - </ul> - {% endif %} - -</section> - -{% endblock bodysup %} +{% block content %} + +<div class="row"> + <div class="col-12"> + <h1>Search results{% if search_term %}: <small><i>{{ search_term }}</i></small>{% endif %}</h1> + {% if not publication_search_list and not commentary_search_list and not submission_search_list and not thesislink_search_list and not comment_search_link and not comment_search_list %} + <p>Your search query did not return any result.</p> + {% endif %} + </div> +</div> + +{% if publication_search_list %} +<hr> +<div class="row"> + <div class="col-12"> + <div class="panel"> + <h2>Publications</h2> + </div> + </div> +</div> + +<div class="row"> + <div class="col-12"> + {% for publication in publication_search_list %} + {{ publication.header_as_li }} + {% endfor %} + </div> +</div> + +<div class="row"> + <div class="col-12"> + <div class="pagination"> + <span class="step-links"> + {% if publication_search_list.has_previous %} + <a href="?publication_search_list_page={{ publication_search_list.previous_page_number }}">previous</a> + {% endif %} + <span class="current"> + Page {{ publication_search_list.number }} of {{ publication_search_list.paginator.num_pages }}. + </span> + {% if publication_search_list.has_next %} + <a href="?publication_search_list_page={{ publication_search_list.next_page_number }}">next</a> + {% endif %} + </span> + </div> + + </div> +</div> +{% endif %} + + +{% if commentary_search_list %} +<hr> +<div class="row"> + <div class="col-12"> + <div class="panel"> + <h2>Commentaries</h2> + </div> + </div> +</div> +<div class="row"> + <div class="col-12"> + <ul> + {% for commentary in commentary_search_list %} + {{ commentary.header_as_li }} + {% endfor %} + </ul> + </div> +</div> + +<div class="row"> + <div class="col-12"> + <div class="pagination"> + <span class="step-links"> + {% if commentary_search_list.has_previous %} + <a href="?commentary_search_list_page={{ commentary_search_list.previous_page_number }}">previous</a> + {% endif %} + <span class="current"> + Page {{ commentary_search_list.number }} of {{ commentary_search_list.paginator.num_pages }}. + </span> + {% if commentary_search_list.has_next %} + <a href="?commentary_search_list_page={{ commentary_search_list.next_page_number }}">next</a> + {% endif %} + </span> + </div> + + </div> +</div> +{% endif %} + + +{% if submission_search_list %} +<hr> +<div class="row"> + <div class="col-12"> + <div class="panel"> + <h2>Submissions</h2> + </div> + </div> +</div> +<div class="row"> + <div class="col-12"> + <ul> + {% for submission in submission_search_list %} + {{ submission.header_as_li }} + {% endfor %} + </ul> + </div> +</div> + +<div class="row"> + <div class="col-12"> + <div class="pagination"> + <span class="step-links"> + {% if submission_search_list.has_previous %} + <a href="?submission_search_list_page={{ submission_search_list.previous_page_number }}">previous</a> + {% endif %} + <span class="current"> + Page {{ submission_search_list.number }} of {{ submission_search_list.paginator.num_pages }} + </span> + {% if submission_search_list.has_next %} + <a href="?submission_search_list_page={{ submission_search_list.next_page_number }}">next</a> + {% endif %} + </span> + </div> + </div> +</div> +{% endif %} + +{% if thesislink_search_list %} +<hr> +<div class="row"> + <div class="col-12"> + <div class="panel"> + <h2>Theses</h2> + </div> + </div> +</div> +<div class="row"> + <div class="col-12"> + <ul> + {% for thesislink in thesislink_search_list %} + {% include 'theses/_thesislink_header_as_li.html' with thesislink=thesislink %} + {% endfor %} + </ul> + {% endif %} + + {% if comment_search_list %} + <div class="row"> + <div class="col-12"> + <div class="panel"> + <h2>Comments</h2> + </div> + </div> + </div> + <div class="row"> + <div class="col-12"> + <ul> + {% for comment in comment_search_list %} + {{ comment.header_as_li }} + {% endfor %} + </ul> + </div> + </div> + {% endif %} + </div> +</div> + +{% endblock content %} diff --git a/scipost/templatetags/scipost_extras.py b/scipost/templatetags/scipost_extras.py index 3a34f87e76bc8559d8943d360f43469a14860f95..40863a5f2d987024c06caeb3c480f2477293a174 100644 --- a/scipost/templatetags/scipost_extras.py +++ b/scipost/templatetags/scipost_extras.py @@ -21,8 +21,7 @@ def sort_by(queryset, order): @register.filter(name='is_in_group') def is_in_group(user, group_name): - group = Group.objects.get(name=group_name) - return True if group in user.groups.all() else False + return user.groups.filter(name=group_name).exists() @register.filter(name='associated_contributors') diff --git a/scipost/views.py b/scipost/views.py index b9a114a8d8bcc5a83b3f35f3826d56bd722ce073..295f62b52a930e54af13098bbcc530adb54e488e 100644 --- a/scipost/views.py +++ b/scipost/views.py @@ -153,17 +153,15 @@ def documentsSearchResults(query): def search(request): """ For the global search form in navbar """ - if request.method == 'POST': - form = SearchForm(request.POST) - if form.is_valid(): - context = documentsSearchResults(form.cleaned_data['query']) - request.session['query'] = form.cleaned_data['query'] - else: - context = {} + form = SearchForm(request.GET or None) + context = {} + if form.is_valid(): + context = documentsSearchResults(form.cleaned_data['q']) + request.session['query'] = form.cleaned_data['q'] + context['search_term'] = form.cleaned_data['q'] elif 'query' in request.session: - context = documentsSearchResults(request.session['query']) - else: - context = {} + context = documentsSearchResults(request.session['query']) + context['search_term'] = request.session['query'] if 'publication_search_queryset' in context: publication_search_list_paginator = Paginator(context['publication_search_queryset'], 10) @@ -937,137 +935,135 @@ def mark_unavailable_period(request): return redirect('scipost:personal_page') +@login_required def personal_page(request): """ The Personal Page is the main view for accessing user functions. """ - if request.user.is_authenticated(): - contributor = Contributor.objects.get(user=request.user) - - # 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 is_SP_Admin(request.user): - intwodays = now + timezone.timedelta(days=2) - - # 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.filter( - user__is_active=False, key_expires__gte=now, - key_expires__lte=intwodays, status=0).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 is_MEC(request.user): - nr_assignments_to_consider = (EditorialAssignment.objects - .filter(to=contributor, accepted=None, deprecated=False) + 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 is_SP_Admin(contributor.user): + intwodays = now + timezone.timedelta(days=2) + + # 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.filter( + user__is_active=False, key_expires__gte=now, + key_expires__lte=intwodays, status=0).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 is_MEC(contributor.user): + 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.filter( + status=0, 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 is_VE(request.user): + nr_commentary_page_requests_to_vet = Commentary.objects.filter(vetted=False).count() + nr_comments_to_vet = Comment.objects.filter(status=0).count() + nr_thesislink_requests_to_vet = ThesisLink.objects.filter(vetted=False).count() + nr_authorship_claims_to_vet = AuthorshipClaim.objects.filter(status='0').count() + 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) + # Verify if there exist objects authored by this contributor, + # whose authorship hasn't been claimed yet + own_submissions = (Submission.objects + .filter(authors__in=[contributor], is_current=True) + .order_by('-submission_date')) + own_commentaries = (Commentary.objects + .filter(authors__in=[contributor]) + .order_by('-latest_activity')) + own_thesislinks = ThesisLink.objects.filter(author_as_cont__in=[contributor]) + 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()) - active_assignments = EditorialAssignment.objects.filter( - to=contributor, accepted=True, completed=False) - nr_reports_to_vet = Report.objects.filter( - status=0, 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 is_VE(request.user): - nr_commentary_page_requests_to_vet = Commentary.objects.filter(vetted=False).count() - nr_comments_to_vet = Comment.objects.filter(status=0).count() - nr_thesislink_requests_to_vet = ThesisLink.objects.filter(vetted=False).count() - nr_authorship_claims_to_vet = AuthorshipClaim.objects.filter(status='0').count() - 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) - # Verify if there exist objects authored by this contributor, - # whose authorship hasn't been claimed yet - own_submissions = (Submission.objects - .filter(authors__in=[contributor], is_current=True) - .order_by('-submission_date')) - own_commentaries = (Commentary.objects - .filter(authors__in=[contributor]) - .order_by('-latest_activity')) - own_thesislinks = ThesisLink.objects.filter(author_as_cont__in=[contributor]) - 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]) + 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()) - own_comments = (Comment.objects - .filter(author=contributor, is_author_reply=False) - .order_by('-date_submitted')) - own_authorreplies = (Comment.objects - .filter(author=contributor, is_author_reply=True) - .order_by('-date_submitted')) - lists_owned = List.objects.filter(owner=contributor) - lists = List.objects.filter(teams_with_access__members__in=[contributor]) - teams_led = Team.objects.filter(leader=contributor) - teams = Team.objects.filter(members__in=[contributor]) - graphs_owned = Graph.objects.filter(owner=contributor) - graphs_private = Graph.objects.filter(Q(teams_with_access__leader=contributor) - | Q(teams_with_access__members__in=[contributor])) - appellation = title_dict[contributor.title] + ' ' + contributor.user.last_name - context = { - '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_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, - 'own_submissions': own_submissions, - 'own_commentaries': own_commentaries, - 'own_thesislinks': own_thesislinks, - 'own_comments': own_comments, 'own_authorreplies': own_authorreplies, - 'lists_owned': lists_owned, - 'lists': lists, - 'teams_led': teams_led, - 'teams': teams, - 'graphs_owned': graphs_owned, - 'graphs_private': graphs_private, - } - return render(request, 'scipost/personal_page.html', context) - else: - form = AuthenticationForm() - context = {'form': form} - return render(request, 'scipost/login.html', context) + 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.select_related('author', 'submission') + .filter(author=contributor, is_author_reply=False) + .order_by('-date_submitted')) + own_authorreplies = (Comment.objects + .filter(author=contributor, is_author_reply=True) + .order_by('-date_submitted')) + lists_owned = List.objects.filter(owner=contributor) + lists = List.objects.filter(teams_with_access__members__in=[contributor]) + teams_led = Team.objects.select_related('leader__user').filter(leader=contributor) + teams = Team.objects.select_related('leader__user').filter(members__in=[contributor]) + graphs_owned = Graph.objects.filter(owner=contributor) + graphs_private = Graph.objects.filter(Q(teams_with_access__leader=contributor) + | Q(teams_with_access__members__in=[contributor])) + appellation = title_dict[contributor.title] + ' ' + 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_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, + 'own_submissions': own_submissions, + 'own_commentaries': own_commentaries, + 'own_thesislinks': own_thesislinks, + 'own_comments': own_comments, 'own_authorreplies': own_authorreplies, + 'lists_owned': lists_owned, + 'lists': lists, + 'teams_led': teams_led, + 'teams': teams, + 'graphs_owned': graphs_owned, + 'graphs_private': graphs_private, + } + return render(request, 'scipost/personal_page.html', context) @login_required diff --git a/submissions/models.py b/submissions/models.py index 8ca56af4a8d1d553d10b49041712a5eee45a5a53..7aea9adab2567057eb7c7753c025fa62f2e26c4b 100644 --- a/submissions/models.py +++ b/submissions/models.py @@ -634,7 +634,7 @@ class Report(models.Model): # -3: rejected (not useful) # -4: rejected (not academic in style) status = models.SmallIntegerField(default=0) - submission = models.ForeignKey(Submission, on_delete=models.CASCADE) + submission = models.ForeignKey(Submission, related_name='reports', on_delete=models.CASCADE) vetted_by = models.ForeignKey(Contributor, related_name="report_vetted_by", blank=True, null=True, on_delete=models.CASCADE) # `invited' filled from RefereeInvitation objects at moment of report submission diff --git a/submissions/templatetags/submissions_extras.py b/submissions/templatetags/submissions_extras.py index 7460a3c30745b62cf6f7ce4f29aff1f7bc5ab83b..b2b785c0357b7be546be77fe2a3eb0d1761022da 100644 --- a/submissions/templatetags/submissions_extras.py +++ b/submissions/templatetags/submissions_extras.py @@ -73,7 +73,7 @@ def required_actions(submission): todo.append('The refereeing deadline has passed. Please either extend it, ' 'or formulate your Editorial Recommendation if at least ' 'one Report has been received.') - reports = submission.report_set.all() + reports = submission.reports.all() for report in reports: if report.status == 0: todo.append('The Report from %s has been delivered but is not yet vetted. ' diff --git a/submissions/views.py b/submissions/views.py index 2681da5f9dfafd7d11f42ee3bb6f18a085af8dc5..553e344673c0f4b4ddcf79b1c25bf4d19b2c8cc3 100644 --- a/submissions/views.py +++ b/submissions/views.py @@ -271,7 +271,10 @@ def submission_detail_wo_vn_nr(request, arxiv_identifier_wo_vn_nr): def submission_detail(request, arxiv_identifier_w_vn_nr): - submission = get_object_or_404(Submission, arxiv_identifier_w_vn_nr=arxiv_identifier_w_vn_nr) + submission = get_object_or_404(Submission.objects.select_related( + 'editor_in_charge', 'publication__in_issue__in_volume__in_journal' + ).prefetch_related('authors'), + arxiv_identifier_w_vn_nr=arxiv_identifier_w_vn_nr) try: is_author = request.user.contributor in submission.authors.all() except AttributeError: @@ -288,7 +291,7 @@ def submission_detail(request, arxiv_identifier_w_vn_nr): form = CommentForm() - reports = submission.report_set.all() + reports = submission.reports.prefetch_related('reports') try: author_replies = Comment.objects.filter(submission=submission, is_author_reply=True,