Source code for commentaries.views

from django.shortcuts import get_object_or_404, render
from django.contrib import messages
from django.contrib.auth.decorators import login_required, permission_required
from django.core.mail import EmailMessage
from django.core.urlresolvers import reverse, reverse_lazy
from django.db import transaction
from django.shortcuts import redirect
from django.template.loader import render_to_string
from django.views.generic.edit import CreateView
from django.views.generic.list import ListView
from django.utils.decorators import method_decorator
from django.http import Http404

from .models import Commentary
from .forms import DOIToQueryForm, ArxivQueryForm, VetCommentaryForm, RequestCommentaryForm,\
                   CommentarySearchForm, RequestPublishedArticleForm, RequestArxivPreprintForm,\
                   CommentSciPostPublication

from comments.models import Comment
from comments.forms import CommentForm
from journals.models import Publication
from scipost.mixins import PaginationMixin

import strings


@login_required
@permission_required('scipost.can_request_commentary_pages', raise_exception=True)
def request_commentary(request):
    return render(request, 'commentaries/request_commentary.html')


@method_decorator(login_required, name='dispatch')
@method_decorator(permission_required(
    'scipost.can_request_commentary_pages', raise_exception=True), name='dispatch')
class RequestCommentary(CreateView):
    success_url = reverse_lazy('scipost:personal_page')

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['requested_by'] = self.request.user.contributor
        return kwargs

    def form_valid(self, form):
        messages.success(self.request, strings.acknowledge_request_commentary, fail_silently=True)
        return super().form_valid(form)


class RequestPublishedArticle(RequestCommentary):
    form_class = RequestPublishedArticleForm
    template_name = 'commentaries/request_published_article.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['query_form'] = DOIToQueryForm()
        return context


class RequestArxivPreprint(RequestCommentary):
    form_class = RequestArxivPreprintForm
    template_name = 'commentaries/request_arxiv_preprint.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['query_form'] = ArxivQueryForm()
        return context


@permission_required('scipost.can_request_commentary_pages', raise_exception=True)
def prefill_using_DOI(request):
    if request.method == "POST":
        query_form = DOIToQueryForm(request.POST)
        # The form checks if doi is valid and commentary doesn't already exist.
        if query_form.is_valid():
            prefill_data = query_form.request_published_article_form_prefill_data()
            form = RequestPublishedArticleForm(initial=prefill_data)
            messages.success(request, strings.acknowledge_doi_query, fail_silently=True)
        else:
            form = RequestPublishedArticleForm()

        context = {
            'form': form,
            'query_form': query_form,
        }
        return render(request, 'commentaries/request_published_article.html', context)
    else:
        raise Http404


@permission_required('scipost.can_request_commentary_pages', raise_exception=True)
def prefill_using_arxiv_identifier(request):
    if request.method == "POST":
        query_form = ArxivQueryForm(request.POST)
        if query_form.is_valid():
            prefill_data = query_form.request_arxiv_preprint_form_prefill_data()
            form = RequestArxivPreprintForm(initial=prefill_data)
            messages.success(request, strings.acknowledge_arxiv_query, fail_silently=True)
        else:
            form = RequestArxivPreprintForm()

        context = {
            'form': form,
            'query_form': query_form,
        }
        return render(request, 'commentaries/request_arxiv_preprint.html', context)
    else:
        raise Http404


@permission_required('scipost.can_vet_commentary_requests', raise_exception=True)
[docs]def vet_commentary_requests(request, commentary_id=None): """Show the first commentary thats awaiting vetting""" queryset = Commentary.objects.awaiting_vetting().exclude(requested_by=request.user.contributor) if commentary_id: # Security fix: Smart asses can vet their own commentary without this line. commentary_to_vet = get_object_or_404(queryset, id=commentary_id) else: commentary_to_vet = queryset.first() form = VetCommentaryForm(request.POST or None, user=request.user, commentary_id=commentary_id) if form.is_valid(): # Get commentary commentary = form.get_commentary() email_context = { 'commentary': commentary } # Retrieve email_template for action if form.commentary_is_accepted(): email_template = 'commentaries/vet_commentary_email_accepted.html' elif form.commentary_is_refused(): email_template = 'commentaries/vet_commentary_email_rejected.html' email_context['refusal_reason'] = form.get_refusal_reason() email_context['further_explanation'] = form.cleaned_data['email_response_field'] elif form.commentary_is_modified(): # For a modified commentary, redirect to request_commentary_form return redirect(reverse('commentaries:modify_commentary_request', args=(commentary.id,))) # Send email and process form email_text = render_to_string(email_template, email_context) email_args = ( 'SciPost Commentary Page activated', email_text, commentary.requested_by.user.email, ['commentaries@scipost.org'] ) emailmessage = EmailMessage(*email_args, reply_to=['commentaries@scipost.org']) emailmessage.send(fail_silently=False) commentary = form.process_commentary() messages.success(request, 'SciPost Commentary request vetted.') return redirect(reverse('commentaries:vet_commentary_requests')) context = { 'commentary_to_vet': commentary_to_vet, 'form': form } return render(request, 'commentaries/vet_commentary_requests.html', context)
@permission_required('scipost.can_vet_commentary_requests', raise_exception=True)
[docs]def modify_commentary_request(request, commentary_id): """Modify a commentary request after vetting with status 'modified'.""" commentary = get_object_or_404((Commentary.objects.awaiting_vetting() .exclude(requested_by=request.user.contributor)), id=commentary_id) form = RequestCommentaryForm(request.POST or None, instance=commentary) if form.is_valid(): # Process commentary data commentary = form.save(commit=False) commentary.vetted = True commentary.save() # Send email and process form email_template = 'commentaries/vet_commentary_email_modified.html' email_text = render_to_string(email_template, {'commentary': commentary}) email_args = ( 'SciPost Commentary Page activated', email_text, commentary.requested_by.user.email, ['commentaries@scipost.org'] ) emailmessage = EmailMessage(*email_args, reply_to=['commentaries@scipost.org']) emailmessage.send(fail_silently=False) messages.success(request, 'SciPost Commentary request modified and vetted.') return redirect(reverse('commentaries:vet_commentary_requests')) context = { 'commentary': commentary, 'form': form } return render(request, 'commentaries/modify_commentary_request.html', context)
class CommentaryListView(PaginationMixin, ListView): model = Commentary form = CommentarySearchForm paginate_by = 10 context_object_name = 'commentary_list' def get_queryset(self): '''Perform search form here already to get the right pagination numbers.''' self.form = self.form(self.request.GET) if self.form.is_valid() and self.form.has_changed(): return self.form.search_results() return self.model.objects.vetted().order_by('-latest_activity') def get_context_data(self, **kwargs): # Call the base implementation first to get a context context = super().get_context_data(**kwargs) # Get newest comments context['comment_list'] = Comment.objects.vetted().order_by('-date_submitted')[:10] # Form into the context! context['form'] = self.form # To customize display in the template if 'discipline' in self.kwargs: context['discipline'] = self.kwargs['discipline'] context['nrweeksback'] = self.kwargs['nrweeksback'] 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): commentary = get_object_or_404(Commentary.objects.vetted(), arxiv_or_DOI_string=arxiv_or_DOI_string) form = CommentForm() try: author_replies = Comment.objects.filter( commentary=commentary, is_author_reply=True, status__gte=1) except Comment.DoesNotExist: author_replies = () context = {'commentary': commentary, 'author_replies': author_replies, 'form': form} return render(request, 'commentaries/commentary_detail.html', context) @login_required @permission_required('scipost.can_submit_comments', raise_exception=True) @transaction.atomic
[docs]def comment_on_publication(request, doi_label): """ This will let authors of an SciPost publication comment on their Publication by automatically creating a Commentary page if not exist already. """ publication = get_object_or_404(Publication.objects.published(), doi_label=doi_label, authors=request.user.contributor) form = CommentSciPostPublication(request.POST or None, request.FILES or None, publication=publication, current_user=request.user) if form.is_valid(): comment = form.save() messages.success(request, strings.acknowledge_request_commentary) return redirect(comment.content_object.get_absolute_url()) context = { 'publication': publication, 'form': form } return render(request, 'commentaries/comment_on_publication.html', context)