Newer
Older
__copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
import random
import requests
import xml.etree.ElementTree as ET
from django.contrib.auth.decorators import login_required
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import PermissionDenied
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.core.urlresolvers import reverse
from django.conf import settings
from django.db import transaction
from django.http import Http404, HttpResponse
from django.utils import timezone
from django.utils.decorators import method_decorator
from django.views.generic.detail import DetailView
from django.views.generic.edit import UpdateView
from django.shortcuts import get_object_or_404, get_list_or_404, render, redirect
from .constants import STATUS_DRAFT, PUBLICATION_PREPUBLISHED
from .models import Journal, Issue, Publication, Deposit, DOAJDeposit,\
GenericDOIDeposit, PublicationAuthorsTable
UnregisteredAuthorForm, CreateMetadataXMLForm, CitationListBibitemsForm,\
ReferenceFormSet, CreateMetadataDOAJForm, DraftPublicationForm,\
PublicationGrantsForm, DraftPublicationApprovalForm, PublicationPublishForm,\
from .mixins import PublicationMixin, ProdSupervisorPublicationPermissionMixin
from .utils import JournalUtils
from comments.models import Comment
from funders.forms import FunderSelectForm, GrantSelectForm
from submissions.models import Submission, Report
from scipost.constants import SCIPOST_SUBJECT_AREAS
from scipost.models import Contributor
from scipost.mixins import PermissionsMixin, RequestViewMixin, PaginationMixin
from guardian.decorators import permission_required
def journals(request):
'''Main landing page for Journals application.'''
return render(request, 'journals/journals.html', context)
class PublicationListView(PaginationMixin, ListView):
"""
Show Publications filtered per subject area.
"""
queryset = Publication.objects.published()
paginate_by = 10
def get_queryset(self):
qs = super().get_queryset()
if self.request.GET.get('journal'):
qs = qs.for_journal(self.request.GET['journal'])
try:
issue = int(self.request.GET['issue'])
except ValueError:
issue = None
if issue:
qs = qs.filter(in_issue__id=issue)
if self.request.GET.get('subject'):
qs = qs.for_subject(self.request.GET['subject'])
if self.request.GET.get('orderby') == 'citations':
qs = qs.order_by('-number_of_citations')
else:
qs = qs.order_by('-publication_date')
return qs
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['recent_issues'] = Issue.objects.published().order_by('-start_date')[:5]
context['subject_areas'] = (('', 'Show all'),) + SCIPOST_SUBJECT_AREAS[0][1]
return context
def landing_page(request, doi_label):
The landing page of a Journal lists either the latest and the current issue of a Journal
of paginates the individual Publications.
"""
journal = get_object_or_404(Journal, doi_label=doi_label)
'journal': journal,
'most_cited': Publication.objects.for_journal(journal.name).published().most_cited(5),
'latest_publications': Publication.objects.for_journal(journal.name).published()[:5],
'accepted_submissions': Submission.objects.accepted().filter(
submitted_to_journal=journal.name).order_by('-latest_activity'),
return render(request, 'journals/journal_landing_page.html', context)
class IssuesView(DetailView):
"""
List all Issues sorted per Journal.
"""
queryset = Journal.objects.has_issues()
slug_field = slug_url_kwarg = 'doi_label'
template_name = 'journals/journal_issues.html'
def redirect_to_about(request, doi_label):
journal = get_object_or_404(Journal, doi_label=doi_label)
return redirect(
reverse('journal:about', kwargs={'doi_label': journal.doi_label}), permanent=True)
def info_for_authors(request, doi_label):
journal = get_object_or_404(Journal, doi_label=doi_label)
return render(request, 'journals/%s_info_for_authors.html' % doi_label, context)
def about(request, doi_label):
journal = get_object_or_404(Journal, doi_label=doi_label)
return render(request, 'journals/%s_about.html' % doi_label, context)
def issue_detail(request, doi_label):
issue = get_object_or_404(Issue.objects.published(), doi_label=doi_label)
journal = issue.in_volume.in_journal
papers = issue.publications.published().order_by('paper_nr')
next_issue = Issue.objects.published().filter(
in_volume__in_journal=journal, start_date__gt=issue.start_date
).order_by('start_date').first()
prev_issue = Issue.objects.published().filter(
in_volume__in_journal=journal, start_date__lt=issue.start_date
).order_by('start_date').last()
context = {
'issue': issue,
'prev_issue': prev_issue,
'next_issue': next_issue,
return render(request, 'journals/journal_issue_detail.html', context)
#######################
# Publication process #
#######################
class PublicationGrantsView(PermissionsMixin, UpdateView):
"""
Add/update grants associated to a Publication.
"""
permission_required = 'scipost.can_draft_publication'
queryset = Publication.objects.drafts()
slug_field = slug_url_kwarg = 'doi_label'
form_class = PublicationGrantsForm
template_name = 'journals/grants_form.html'
class PublicationGrantsRemovalView(PermissionsMixin, DetailView):
"""
Remove grant associated to a Publication.
"""
permission_required = 'scipost.can_draft_publication'
queryset = Publication.objects.drafts()
slug_field = slug_url_kwarg = 'doi_label'
def get(self, request, *args, **kwargs):
super().get(request, *args, **kwargs)
grant = get_object_or_404(Grant, id=kwargs.get('grant_id'))
self.object.grants.remove(grant)
return redirect(reverse('journals:update_grants', args=(self.object.doi_label,)))
@permission_required('scipost.can_publish_accepted_submission', raise_exception=True)
def publication_authors_ordering(request, doi_label):
publication = get_object_or_404(Publication, doi_label=doi_label)
formset = PublicationAuthorOrderingFormSet(
request.POST or None, queryset=publication.authors.order_by('order'))
if formset.is_valid():
Loading
Loading full blame...