SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit 61753593 authored by Jorran de Wit's avatar Jorran de Wit
Browse files

Merge branch 'commentaries/browse' into development

parents 887cd1ec d7fa5ce5
No related branches found
No related tags found
No related merge requests found
...@@ -214,13 +214,13 @@ class VetCommentaryForm(forms.Form): ...@@ -214,13 +214,13 @@ class VetCommentaryForm(forms.Form):
class CommentarySearchForm(forms.Form): class CommentarySearchForm(forms.Form):
"""Search for Commentary specified by user""" """Search for Commentary specified by user"""
pub_author = forms.CharField(max_length=100, required=False, label="Author(s)") author = forms.CharField(max_length=100, required=False, label="Author(s)")
pub_title_keyword = forms.CharField(max_length=100, required=False, label="Title") title = forms.CharField(max_length=100, required=False, label="Title")
pub_abstract_keyword = forms.CharField(max_length=1000, required=False, label="Abstract") abstract = forms.CharField(max_length=1000, required=False, label="Abstract")
def search_results(self): def search_results(self):
"""Return all Commentary objects according to search""" """Return all Commentary objects according to search"""
return Commentary.objects.vetted( return Commentary.objects.vetted(
pub_title__icontains=self.cleaned_data['pub_title_keyword'], pub_title__icontains=self.cleaned_data['title'],
pub_abstract__icontains=self.cleaned_data['pub_abstract_keyword'], pub_abstract__icontains=self.cleaned_data['abstract'],
author_list__icontains=self.cleaned_data['pub_author']).order_by('-pub_date') author_list__icontains=self.cleaned_data['author']).order_by('-pub_date')
from django.db import models from django.db import models
from django.contrib.postgres.fields import JSONField from django.contrib.postgres.fields import JSONField
from django.template import Template, Context from django.template import Template, Context
from django.template.loader import get_template
from journals.models import SCIPOST_JOURNALS_DOMAINS from journals.models import SCIPOST_JOURNALS_DOMAINS
from scipost.behaviors import ArxivCallable from scipost.behaviors import ArxivCallable
...@@ -135,36 +136,10 @@ class Commentary(ArxivCallable, TimeStampedModel): ...@@ -135,36 +136,10 @@ class Commentary(ArxivCallable, TimeStampedModel):
template = Template('<a href="{{scipost_url}}" class="pubtitleli">{{pub_title}}</a>') template = Template('<a href="{{scipost_url}}" class="pubtitleli">{{pub_title}}</a>')
return template.render(context) return template.render(context)
def header_as_li(self): def header_as_li(self):
# for display in search lists # TO BE REMOVED!!!!
context = Context({'scipost_url': self.scipost_url(), 'pub_title': self.pub_title, template = get_template('commentaries/commentary_header_li.html')
'author_list': self.author_list, return template.render({'object': self})
'latest_activity': self.latest_activity.strftime('%Y-%m-%d %H:%M')})
header = ('<li>'
# '<div class="flex-container">'
# '<div class="flex-whitebox0">'
'<p><a href="{{ scipost_url }}" '
'class="pubtitleli">{{ pub_title }}</a></p>'
'<p>by {{ author_list }}')
if self.type == 'published':
header += ', {{ journal }} {{ volume }}, {{ pages }}'
context['journal'] = self.journal
context['volume'] = self.volume
context['pages'] = self.pages
elif self.type == 'preprint':
header += ', <a href="{{ arxiv_link }}">{{ arxiv_link }}</a>'
context['arxiv_link'] = self.arxiv_link
header += '</p>'
if self.pub_date:
header += '<p> (published {{ pub_date }}) - '
context['pub_date'] = str(self.pub_date)
header += ('latest activity: {{ latest_activity }}</p>'
# '</div></div>'
'</li>')
template = Template(header)
return template.render(context)
def simple_header_as_li(self): def simple_header_as_li(self):
# for display in Lists # for display in Lists
......
<li>
<p>
<a href="{{ object.scipost_url }}" class="pubtitleli">{{ object.pub_title }}</a>
</p>
<p>
by {{ object.author_list }}
{% if object.type == 'published' %}, {{ object.journal }} {{ object.volume }}, {{ object.pages }}
{% elif object.type == 'preprint' %}, <a href="{{ object.arxiv_link }}">{{ object.arxiv_link }}</a>{% endif %}
</p>
<p>
{% if object.pub_date %}(published {{ object.pub_date }}) - {% endif %}latest activity: {{ object.latest_activity }}
</p>
</li>
{% extends 'scipost/base.html' %} {% extends 'scipost/base.html' %}
{% load bootstrap %} {% load bootstrap %}
{% load request_filters %}
{% block pagetitle %}: Commentaries{% endblock pagetitle %} {% block pagetitle %}: Commentaries{% endblock pagetitle %}
...@@ -9,8 +10,6 @@ ...@@ -9,8 +10,6 @@
{% endblock headsup %} {% endblock headsup %}
{% block content %} {% block content %}
<div class="row"> <div class="row">
<div class="col-md-4"> <div class="col-md-4">
<div class="panel page-header-panel"> <div class="panel page-header-panel">
...@@ -22,10 +21,9 @@ ...@@ -22,10 +21,9 @@
<div class="col-md-4"> <div class="col-md-4">
<div class="panel page-header-panel"> <div class="panel page-header-panel">
<h2>Search SciPost Commentaries:</h2> <h2>Search SciPost Commentaries:</h2>
<form action="{% url 'commentaries:commentaries' %}" class="small" method="post"> <form action="{% url 'commentaries:commentaries' %}" class="small" method="get">
{% csrf_token %}
{{ form|bootstrap:'4,8,sm' }} {{ form|bootstrap:'4,8,sm' }}
<input class="btn btn-sm btn-secondary" type="submit" name="Submit" /> <input class="btn btn-sm btn-secondary" type="submit"/>
</form> </form>
</div> </div>
</div> </div>
...@@ -39,69 +37,51 @@ ...@@ -39,69 +37,51 @@
</div> </div>
</div> </div>
{% if commentary_search_list %} {% if not browse and recent %}
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<hr class="hr12">
<h3>Search results:</h3>
<ul>
{% for commentary in commentary_search_list %}
{{ commentary.header_as_li }}
{% endfor %}
</ul>
</div>
</div>
{% elif form.has_changed %}
<div class="row">
<div class="col-12">
<h3>No match found for your search query.</h3>
</div>
</div>
{% endif %}
{% if comment_recent_list %}
<div class="row">
<div class="col-12">
<hr class="hr12"> <hr class="hr12">
<h2>Recent Comments</h2> <h2>Recent Comments</h2>
<ul> <ul>
{% for comment in comment_recent_list %} {% for comment in comment_list %}
{{ comment.simple_header_as_li }} {{ comment.simple_header_as_li }}
{% endfor %} {% endfor %}
</ul> </ul>
</div> </div>
</div>
{% endif %}
{% if commentary_recent_list %}
<div class="row">
<div class="col-12">
<hr class="hr12">
<h2>Recently active Commentaries:</h2>
<ul>
{% for commentary in commentary_recent_list %}
{{ commentary.header_as_li }}
{% endfor %}
</ul>
</div>
</div> </div>
{% endif %} {% endif %}
{% if commentary_browse_list %}
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<hr class="hr12"> <hr class="hr12">
<h2>Commentaries in {{ discipline }} in the last {{ nrweeksback }} week{% if nrweeksback == '1' %}{% else %}s{% endif %}:</h2> {% if recent %}
<ul> <h2>Recently active Commentaries:</h2>
{% for commentary in commentary_browse_list %} {% elif browse %}
{{ commentary.header_as_li }} <h2>Commentaries in {{ discipline }} in the last {{ nrweeksback }} week{{ nrweeksback|pluralize }}:</h2>
{% endfor %} {% else %}
</ul> <h2>Search results:</h3>
</div> {% endif %}
{% if object_list %}
{% if is_paginated %}
<p>
{% if page_obj.has_previous %}
<a href="?{% url_replace page=page_obj.previous_page_number %}">Previous</a>
{% endif %}
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
{% if page_obj.has_next %}
<a href="?{% url_replace page=page_obj.next_page_number %}">Next</a>
{% endif %}
</p>
{% endif %}
<ul>
{% for object in object_list %}
{% include 'commentaries/commentary_header_li.html' with object=object %}
{% endfor %}
</ul>
{% else %}
<h3>No match found for your search query.</h3>
{% endif %}
</div>
</div> </div>
{% endif %}
{% endblock content %} {% endblock content %}
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
{% if errormessage %} {% if errormessage %}
<h3 style="color: red;">Error: {{ errormessage }}</h3> <h3 style="color: red;">Error: {{ errormessage }}</h3>
{% if existing_commentary %} {% if existing_commentary %}
<ul>{{ existing_commentary.header_as_li }}</ul> <ul>{% include 'commentaries/commentary_header_li.html' with object=existing_commentary %}</ul>
{% endif %} {% endif %}
<br/> <br/>
{% endif %} {% endif %}
......
...@@ -5,21 +5,28 @@ from . import views ...@@ -5,21 +5,28 @@ from . import views
urlpatterns = [ urlpatterns = [
# Commentaries # Commentaries
url(r'^$', views.commentaries, name='commentaries'), url(r'^$', views.CommentaryListView.as_view(), name='commentaries'),
url(r'^browse/(?P<discipline>[a-z]+)/(?P<nrweeksback>[0-9]+)/$', views.browse, name='browse'), url(r'^browse/(?P<discipline>[a-z]+)/(?P<nrweeksback>[0-9]+)/$',
views.CommentaryListView.as_view(), name='browse'),
url(r'^howto$', TemplateView.as_view(template_name='commentaries/howto.html'), name='howto'), url(r'^howto$', TemplateView.as_view(template_name='commentaries/howto.html'), name='howto'),
# Match a DOI-based link: # Match a DOI-based link:
url(r'^(?P<arxiv_or_DOI_string>10.[0-9]{4,9}/[-._;()/:a-zA-Z0-9]+)/$', views.commentary_detail, name='commentary'), url(r'^(?P<arxiv_or_DOI_string>10.[0-9]{4,9}/[-._;()/:a-zA-Z0-9]+)/$',
views.commentary_detail, name='commentary'),
# Match an arxiv-based link: # Match an arxiv-based link:
# new style identifiers: # new style identifiers:
url(r'^(?P<arxiv_or_DOI_string>arXiv:[0-9]{4,}.[0-9]{5,}(v[0-9]+)?)/$', views.commentary_detail, name='commentary'), url(r'^(?P<arxiv_or_DOI_string>arXiv:[0-9]{4,}.[0-9]{5,}(v[0-9]+)?)/$',
views.commentary_detail, name='commentary'),
# old style identifiers: # old style identifiers:
url(r'^(?P<arxiv_or_DOI_string>arXiv:[a-z-]+/[0-9]{7,}(v[0-9]+)?)/$', views.commentary_detail, name='commentary'), url(r'^(?P<arxiv_or_DOI_string>arXiv:[a-z-]+/[0-9]{7,}(v[0-9]+)?)/$',
views.commentary_detail, name='commentary'),
url(r'^request_commentary$', views.RequestCommentary.as_view(), name='request_commentary'), url(r'^request_commentary$', views.RequestCommentary.as_view(), name='request_commentary'),
url(r'^prefill_using_DOI$', views.prefill_using_DOI, name='prefill_using_DOI'), url(r'^prefill_using_DOI$', views.prefill_using_DOI, name='prefill_using_DOI'),
url(r'^prefill_using_identifier$', views.PrefillUsingIdentifierView.as_view(), name='prefill_using_identifier'), url(r'^prefill_using_identifier$', views.PrefillUsingIdentifierView.as_view(),
url(r'^vet_commentary_requests$', views.vet_commentary_requests, name='vet_commentary_requests'), name='prefill_using_identifier'),
url(r'^vet_commentary_request_ack/(?P<commentary_id>[0-9]+)$', views.vet_commentary_request_ack, name='vet_commentary_request_ack'), url(r'^vet_commentary_requests$', views.vet_commentary_requests,
name='vet_commentary_requests'),
url(r'^vet_commentary_request_ack/(?P<commentary_id>[0-9]+)$',
views.vet_commentary_request_ack, name='vet_commentary_request_ack'),
] ]
import datetime
import feedparser
import re import re
import requests import requests
from django.utils import timezone
from django.shortcuts import get_object_or_404, render from django.shortcuts import get_object_or_404, render
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.decorators import permission_required from django.contrib.auth.decorators import permission_required
...@@ -13,6 +10,7 @@ from django.core.urlresolvers import reverse, reverse_lazy ...@@ -13,6 +10,7 @@ from django.core.urlresolvers import reverse, reverse_lazy
from django.shortcuts import redirect from django.shortcuts import redirect
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.views.generic.edit import CreateView, FormView from django.views.generic.edit import CreateView, FormView
from django.views.generic.list import ListView
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from .models import Commentary from .models import Commentary
...@@ -39,7 +37,7 @@ class RequestCommentaryMixin(object): ...@@ -39,7 +37,7 @@ class RequestCommentaryMixin(object):
kwargs['request_commentary_form'] = RequestCommentaryForm() kwargs['request_commentary_form'] = RequestCommentaryForm()
context = super(RequestCommentaryMixin, self).get_context_data(**kwargs) context = super(RequestCommentaryMixin, self).get_context_data(**kwargs)
context['existing_commentary'] = None # context['request_commentary_form'].get_existing_commentary() context['existing_commentary'] = None
context['doiform'] = DOIToQueryForm() context['doiform'] = DOIToQueryForm()
context['identifierform'] = IdentifierToQueryForm() context['identifierform'] = IdentifierToQueryForm()
return context return context
...@@ -267,33 +265,37 @@ def vet_commentary_request_ack(request, commentary_id): ...@@ -267,33 +265,37 @@ def vet_commentary_request_ack(request, commentary_id):
return render(request, 'scipost/acknowledgement.html', context) return render(request, 'scipost/acknowledgement.html', context)
def commentaries(request): class CommentaryListView(ListView):
"""List and search all commentaries""" model = Commentary
form = CommentarySearchForm(request.POST or None) form = CommentarySearchForm
if form.is_valid() and form.has_changed(): paginate_by = 10
commentary_search_list = form.search_results()
else: def get_queryset(self):
commentary_search_list = [] '''Perform search form here already to get the right pagination numbers.'''
self.form = self.form(self.request.GET)
comment_recent_list = Comment.objects.filter(status='1').order_by('-date_submitted')[:10] if self.form.is_valid() and self.form.has_changed():
commentary_recent_list = Commentary.objects.vetted().order_by('-latest_activity')[:10] return self.form.search_results()
context = { return self.model.objects.vetted().order_by('-latest_activity')
'form': form, 'commentary_search_list': commentary_search_list,
'comment_recent_list': comment_recent_list, def get_context_data(self, **kwargs):
'commentary_recent_list': commentary_recent_list} # Call the base implementation first to get a context
return render(request, 'commentaries/commentaries.html', context) context = super().get_context_data(**kwargs)
# Get newest comments
def browse(request, discipline, nrweeksback): context['comment_list'] = Comment.objects.vetted().order_by('-date_submitted')[:10]
"""List all commentaries for discipline and period"""
commentary_browse_list = Commentary.objects.vetted( # Form into the context!
discipline=discipline, context['form'] = self.form
latest_activity__gte=timezone.now() + datetime.timedelta(weeks=-int(nrweeksback)))
context = { # To customize display in the template
'form': CommentarySearchForm(), if 'discipline' in self.kwargs:
'discipline': discipline, 'nrweeksback': nrweeksback, context['discipline'] = self.kwargs['discipline']
'commentary_browse_list': commentary_browse_list} context['nrweeksback'] = self.kwargs['nrweeksback']
return render(request, 'commentaries/commentaries.html', context) context['browse'] = True
elif not any(self.request.GET[field] for field in self.request.GET):
context['recent'] = True
return context
def commentary_detail(request, arxiv_or_DOI_string): def commentary_detail(request, arxiv_or_DOI_string):
......
from django.db import models from django.db import models
class CommentManager(models.Manager): class CommentManager(models.Manager):
def vetted(self): def vetted(self):
return self.filter(status__gte=1) return self.filter(status__gte=1)
from django import template
from urllib.parse import urlencode
register = template.Library()
@register.simple_tag(takes_context=True)
def url_replace(context, **kwargs):
query = context['request'].GET.dict()
query.update(kwargs)
return urlencode(query)
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
{% load bootstrap %} {% load bootstrap %}
{% load submissions_extras %} {% load submissions_extras %}
{% load request_filters %}
{% block pagetitle %}: Submissions{% endblock pagetitle %} {% block pagetitle %}: Submissions{% endblock pagetitle %}
......
...@@ -79,9 +79,3 @@ def required_actions(submission): ...@@ -79,9 +79,3 @@ def required_actions(submission):
todo.append('The Report from %s has been delivered but is not yet vetted. ' todo.append('The Report from %s has been delivered but is not yet vetted. '
'Please vet it.' % report.author) 'Please vet it.' % report.author)
return todo return todo
@register.simple_tag(takes_context=True)
def url_replace(context, **kwargs):
query = context['request'].GET.dict()
query.update(kwargs)
return urlencode(query)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment