SciPost Code Repository

Skip to content
Snippets Groups Projects
views.py 56.9 KiB
Newer Older
import json
import random
import requests
import xml.etree.ElementTree as ET
Jorran de Wit's avatar
Jorran de Wit committed

from django.contrib.auth.decorators import login_required
from django.contrib.contenttypes.models import ContentType
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.core.urlresolvers import reverse
from django.conf import settings
from django.contrib import messages
Jorran de Wit's avatar
Jorran de Wit committed
from django.db import transaction
from django.http import Http404, HttpResponse
from django.utils import timezone
Jorran de Wit's avatar
Jorran de Wit committed
from django.views.generic.detail import DetailView
from django.views.generic.edit import UpdateView
from django.shortcuts import get_object_or_404, render, redirect
Jorran de Wit's avatar
Jorran de Wit committed
from .constants import STATUS_DRAFT
from .exceptions import PaperNumberingError
from .helpers import paper_nr_string, issue_doi_label_from_doi_label
from .models import Journal, Issue, Publication, Deposit, DOAJDeposit,\
                    GenericDOIDeposit, PublicationAuthorsTable
from .forms import FundingInfoForm, InitiatePublicationForm, ValidatePublicationForm,\
Jorran de Wit's avatar
Jorran de Wit committed
                   UnregisteredAuthorForm, CreateMetadataXMLForm, CitationListBibitemsForm,\
Jorran de Wit's avatar
Jorran de Wit committed
                   ReferenceFormSet, CreateMetadataDOAJForm, DraftPublicationForm,\
                   PublicationGrantsForm, DraftPublicationApprovalForm
from .utils import JournalUtils
from comments.models import Comment
Jorran de Wit's avatar
Jorran de Wit committed
from funders.forms import FunderSelectForm, GrantSelectForm
from funders.models import Funder, Grant
from submissions.models import Submission, Report
Jorran de Wit's avatar
Jorran de Wit committed
from scipost.forms import ConfirmationForm
from scipost.models import Contributor
Jorran de Wit's avatar
Jorran de Wit committed
from scipost.mixins import PermissionsMixin
from production.constants import PROOFS_PUBLISHED
from production.models import ProductionEvent
from production.signals import notify_stream_status_change

from guardian.decorators import permission_required
Jorran de Wit's avatar
Jorran de Wit committed
def journals(request):
    '''Main landing page for Journals application.'''
Jorran de Wit's avatar
Jorran de Wit committed
    context = {'journals': Journal.objects.order_by('name')}
Jorran de Wit's avatar
Jorran de Wit committed
    return render(request, 'journals/journals.html', context)


def landing_page(request, doi_label):
    journal = get_object_or_404(Journal, doi_label=doi_label)
Jorran de Wit's avatar
Jorran de Wit committed
    current_issue = Issue.objects.published(
        in_volume__in_journal=journal,
        start_date__lte=timezone.now(),
        until_date__gte=timezone.now()).order_by('-until_date').first()
Jorran de Wit's avatar
Jorran de Wit committed
    latest_issue = Issue.objects.published(
        in_volume__in_journal=journal,
        until_date__lte=timezone.now()).order_by('-until_date').first()

    prev_issue = None
    if current_issue:
        prev_issue = (Issue.objects.published(in_volume__in_journal=journal,
                                              start_date__lt=current_issue.start_date)
                                   .order_by('start_date').last())

    context = {
        'current_issue': current_issue,
        'latest_issue': latest_issue,
        'prev_issue': prev_issue,
        'journal': journal
    return render(request, 'journals/journal_landing_page.html', context)
def issues(request, doi_label):
    journal = get_object_or_404(Journal, doi_label=doi_label)

    issues = Issue.objects.published(in_volume__in_journal=journal).order_by('-until_date')
    context = {
        'issues': issues,
        'journal': journal
    }
    return render(request, 'journals/journal_issues.html', context)
def recent(request, doi_label):
    Display page for the most recent 20 publications in SciPost Physics.
    journal = get_object_or_404(Journal, doi_label=doi_label)
Jorran de Wit's avatar
Jorran de Wit committed
    recent_papers = Publication.objects.published().filter(
        in_issue__in_volume__in_journal=journal).order_by('-publication_date',
                                                          '-paper_nr')[:20]
    context = {
        'recent_papers': recent_papers,
        'journal': journal,
    return render(request, 'journals/journal_recent.html', context)
def accepted(request, doi_label):
    """
    Display page for submissions to SciPost Physics which
    have been accepted but are not yet published.
    """
    journal = get_object_or_404(Journal, doi_label=doi_label)
    accepted_SP_submissions = (Submission.objects.accepted()
                               .filter(submitted_to_journal=journal.name)
                               .order_by('-latest_activity'))
    context = {
        'accepted_SP_submissions': accepted_SP_submissions,
        'journal': journal
    return render(request, 'journals/journal_accepted.html', context)
def info_for_authors(request, doi_label):
    journal = get_object_or_404(Journal, doi_label=doi_label)
        'journal': journal
    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)
        'journal': journal
    return render(request, 'journals/%s_about.html' % doi_label, context)
def issue_detail(request, doi_label):
    issue = Issue.objects.get_published(doi_label=doi_label)
    journal = issue.in_volume.in_journal

    papers = issue.publication_set.order_by('paper_nr')
    next_issue = (Issue.objects.published(in_volume__in_journal=journal,
                                          start_date__gt=issue.start_date)
                               .order_by('start_date').first())
    prev_issue = (Issue.objects.published(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,
        'journal': journal
    return render(request, 'journals/journal_issue_detail.html', context)
#######################
# Publication process #
#######################
Jorran de Wit's avatar
Jorran de Wit committed
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'
Jorran de Wit's avatar
Jorran de Wit committed
    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,)))


class DraftPublicationUpdateView(PermissionsMixin, UpdateView):
Jorran de Wit's avatar
Jorran de Wit committed
    """
    Any Production Officer or Administrator can draft a new publication without publishing here.
    The actual publishing is done lin a later stadium, after the draft has been finished.
    """
Jorran de Wit's avatar
Jorran de Wit committed
    permission_required = 'scipost.can_draft_publication'
Jorran de Wit's avatar
Jorran de Wit committed
    queryset = Publication.objects.drafts()
    slug_url_kwarg = 'arxiv_identifier_w_vn_nr'
Loading
Loading full blame...