SciPost Code Repository

Skip to content
Snippets Groups Projects
views.py 8.63 KiB
Newer Older
__copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"


import datetime

from django.contrib import messages
from django.contrib.auth.decorators import login_required, permission_required
from django.core.urlresolvers import reverse
from django.shortcuts import get_object_or_404, render, redirect
from django.template import Context, Template
from django.utils import timezone

from .constants import motion_categories_dict
from .forms import FeedbackForm, NominationForm, MotionForm
from .models import VGM, Feedback, Nomination, Motion

Jorran de Wit's avatar
Jorran de Wit committed
from scipost.constants import SCIPOST_SUBJECT_AREAS
from scipost.forms import RemarkForm
from scipost.models import Contributor, Remark
from invitations.models import RegistrationInvitation


@login_required
@permission_required('scipost.can_attend_VGMs')
def VGMs(request):
    VGM_list = VGM.objects.all().order_by('start_date')
    context = {'VGM_list': VGM_list}
    return render(request, 'virtualmeetings/VGMs.html', context)


@login_required
@permission_required('scipost.can_attend_VGMs')
def VGM_detail(request, VGM_id):
    VGM_instance = get_object_or_404(VGM, id=VGM_id)
Jorran de Wit's avatar
Jorran de Wit committed
    VGM_information = Template(VGM_instance.information).render(Context({}))
    feedback_received = Feedback.objects.filter(VGM=VGM_instance).order_by('date')
    feedback_form = FeedbackForm()
    current_Fellows = Contributor.objects.filter(
        user__groups__name='Editorial College').order_by('user__last_name')
    pending_inv_Fellows = RegistrationInvitation.objects.for_fellows().no_response()
    declined_inv_Fellows = RegistrationInvitation.objects.for_fellows().declined()
Jorran de Wit's avatar
Jorran de Wit committed
    spec_list = SCIPOST_SUBJECT_AREAS  # subject_areas_dict
    nomination_form = NominationForm()
    nominations = Nomination.objects.filter(VGM=VGM_instance, accepted=None).order_by('last_name')
    motion_form = MotionForm()
    remark_form = RemarkForm()
    context = {
        'VGM': VGM_instance,
        'VGM_information': VGM_information,
        'feedback_received': feedback_received,
        'feedback_form': feedback_form,
        'current_Fellows': current_Fellows,
        'pending_inv_Fellows': pending_inv_Fellows,
        'declined_inv_Fellows': declined_inv_Fellows,
        'spec_list': spec_list,
        'nominations': nominations,
        'nomination_form': nomination_form,
        'motion_categories_dict': motion_categories_dict,
        'motion_form': motion_form,
        'remark_form': remark_form,
    }
    return render(request, 'virtualmeetings/VGM_detail.html', context)


@login_required
@permission_required('scipost.can_attend_VGMs')
def feedback(request, VGM_id=None):
    if request.method == 'POST':
        feedback_form = FeedbackForm(request.POST)
        if feedback_form.is_valid():
            feedback = Feedback(by=request.user.contributor,
                                date=timezone.now().date(),
                                feedback=feedback_form.cleaned_data['feedback'],)
            if VGM_id:
                VGM_instance = get_object_or_404(VGM, id=VGM_id)
                feedback.VGM = VGM_instance
            feedback.save()
            ack_message = 'Your feedback has been received.'
            context = {'ack_message': ack_message}
            if VGM_id:
                context['followup_message'] = 'Return to the '
                context['followup_link'] = reverse('virtualmeetings:VGM_detail',
                                                   kwargs={'VGM_id': VGM_id})
                context['followup_link_label'] = 'VGM page'
            return render(request, 'scipost/acknowledgement.html', context)
        else:
            errormessage = 'The form was not filled properly.'
            return render(request, 'scipost/error.html', {'errormessage': errormessage})
    else:
        errormessage = 'This view can only be posted to.'
        return render(request, 'scipost/error.html', {'errormessage': errormessage})


@login_required
@permission_required('scipost.can_attend_VGMs', raise_exception=True)
def add_remark_on_feedback(request, VGM_id, feedback_id):
    feedback = get_object_or_404(Feedback, pk=feedback_id)
    remark_form = RemarkForm(request.POST)
    if remark_form.is_valid():
        remark = Remark(contributor=request.user.contributor,
                        feedback=feedback,
                        remark=remark_form.cleaned_data['remark'])
        remark.save()
        messages.danger(request, 'The form was invalidly filled.')
    return redirect(feedback.get_absolute_url())


@login_required
@permission_required('scipost.can_attend_VGMs')
def nominate_Fellow(request, VGM_id):
    VGM_instance = get_object_or_404(VGM, id=VGM_id)
    nomination_form = NominationForm(request.POST)

    if nomination_form.is_valid():
Jorran de Wit's avatar
Jorran de Wit committed
        nomination = nomination_form.save(commit=False)
        nomination.VGM = VGM_instance
        nomination.by = request.user.contributor
        nomination.voting_deadline = VGM_instance.end_date + datetime.timedelta(days=7)
        nomination.save()
        nomination.update_votes(request.user.contributor.id, 'A')
        messages.success(request, 'The nomination has been registered.')
Jorran de Wit's avatar
Jorran de Wit committed
        messages.warning(request, 'The form was not filled properly.')
    return redirect(VGM_instance.get_absolute_url())


@login_required
@permission_required('scipost.can_attend_VGMs', raise_exception=True)
def add_remark_on_nomination(request, VGM_id, nomination_id):
    # contributor = request.user.contributor
    nomination = get_object_or_404(Nomination, pk=nomination_id)
    remark_form = RemarkForm(request.POST)
    if remark_form.is_valid():
        remark = Remark(contributor=request.user.contributor,
                        nomination=nomination,
                        remark=remark_form.cleaned_data['remark'])
        remark.save()
        messages.danger(request, 'The form was invalidly filled.')
    return redirect(nomination.get_absolute_url())


@login_required
@permission_required('scipost.can_attend_VGMs', raise_exception=True)
def vote_on_nomination(request, nomination_id, vote):
    contributor = request.user.contributor
    nomination = get_object_or_404(Nomination, pk=nomination_id)
    if timezone.now() > nomination.voting_deadline:
        messages.warning(request, 'The voting deadline on this nomination has passed.')
    else:
        nomination.update_votes(contributor.id, vote)
        messages.success(request, 'You have successfully voted on nomination %i' % nomination.id)
    return redirect(nomination.get_absolute_url())


@login_required
@permission_required('scipost.can_attend_VGMs')
def put_motion_forward(request, VGM_id):
    VGM_instance = get_object_or_404(VGM, id=VGM_id)
    if timezone.now().date() > VGM_instance.end_date:
        messages.warning(request, 'This VGM has ended. No new motions can be put forward.')
        return redirect(VGM_instance.get_absolute_url())

    motion_form = MotionForm(request.POST)
    if motion_form.is_valid():
        motion = Motion(
            category=motion_form.cleaned_data['category'],
            VGM=VGM_instance,
            background=motion_form.cleaned_data['background'],
            motion=motion_form.cleaned_data['motion'],
            put_forward_by=request.user.contributor,
            voting_deadline=VGM_instance.end_date + datetime.timedelta(days=7),
        )
        motion.save()
        motion.update_votes(request.user.contributor.id, 'A')
        messages.success(request, 'Your vote has been registered.')
        messages.danger(request, 'The form was not filled properly.')
    return redirect(motion.get_absolute_url())


@login_required
@permission_required('scipost.can_attend_VGMs', raise_exception=True)
def add_remark_on_motion(request, motion_id):
    motion = get_object_or_404(Motion, pk=motion_id)
    remark_form = RemarkForm(request.POST)
    if remark_form.is_valid():
        remark = Remark(contributor=request.user.contributor,
                        motion=motion,
                        remark=remark_form.cleaned_data['remark'])
        remark.save()
        messages.danger(request, 'The form was not filled properly.')
    return redirect(motion.get_absolute_url())


@login_required
@permission_required('scipost.can_attend_VGMs', raise_exception=True)
def vote_on_motion(request, motion_id, vote):
    contributor = request.user.contributor
    motion = get_object_or_404(Motion, pk=motion_id)
    if timezone.now() > motion.voting_deadline:
        messages.warning(request, 'The voting deadline on this motion has passed.')
    else:
        motion.update_votes(contributor.id, vote)
        messages.success(request, 'You have successfully voted on motion %i' % motion.id)
    return redirect(motion.get_absolute_url())