SciPost Code Repository

Skip to content
Snippets Groups Projects
views.py 4.75 KiB
Newer Older
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
Jean-Sébastien Caux's avatar
Jean-Sébastien Caux committed
import hashlib
import random
import string

from django.contrib import messages
from django.core.mail import EmailMultiAlternatives
from django.shortcuts import get_object_or_404, render, redirect
from django.template import Context, Template

Jorran de Wit's avatar
Jorran de Wit committed
from mails.utils import DirectMailUtil

Jean-Sébastien Caux's avatar
Jean-Sébastien Caux committed
from .models import Petition, PetitionSignatory
from .forms import SignPetitionForm


def petition(request, slug):
    petition = get_object_or_404(Petition, slug=slug)
Jorran de Wit's avatar
Jorran de Wit committed

Jean-Sébastien Caux's avatar
Jean-Sébastien Caux committed
    is_signed = False
    initial = {}
Jorran de Wit's avatar
Jorran de Wit committed
    if request.user.is_authenticated:
        is_signed = petition.petition_signatories.verified().filter(
            signatory=request.user.contributor).exists()
Jorran de Wit's avatar
Jorran de Wit committed
        affiliation = request.user.contributor.affiliations.first() or {}
        institition = affiliation.institution.name if affiliation else ''
        country = affiliation.institution.country if affiliation else ''
Jean-Sébastien Caux's avatar
Jean-Sébastien Caux committed
        initial = {
            'petition': petition,
Jean-Sébastien Caux's avatar
Jean-Sébastien Caux committed
            'title': request.user.contributor.title,
            'first_name': request.user.first_name,
            'last_name': request.user.last_name,
            'email': request.user.email,
Jorran de Wit's avatar
Jorran de Wit committed
            'country_of_employment': country,
            'affiliation': institition,
Jorran de Wit's avatar
Jorran de Wit committed

Jorran de Wit's avatar
Jorran de Wit committed
    form = SignPetitionForm(request.POST or None, initial=initial, petition=petition,
                            current_user=request.user)
Jorran de Wit's avatar
Jorran de Wit committed
    if form.is_valid():
        signature = form.save(commit=False)
        signature.petition = petition
        message = ('<h3>Many thanks for signing!</h3>'
                   '<p>Please invite your colleagues to also sign.</p>')
Jorran de Wit's avatar
Jorran de Wit committed
        if request.user.is_authenticated:
            signature.signatory = request.user.contributor
            signature.verified = True
Jorran de Wit's avatar
Jorran de Wit committed
            signature.save()
            mail_util = DirectMailUtil('signatory/thank_SPB_signature', object=signature)
            mail_util.send_mail()
Jorran de Wit's avatar
Jorran de Wit committed
        else:
            # Generate verification key and link
Jorran de Wit's avatar
Jorran de Wit committed
            salt = ''
Jorran de Wit's avatar
Jorran de Wit committed
            for i in range(5):
Jorran de Wit's avatar
Jorran de Wit committed
                salt += random.choice(string.ascii_letters)
Jorran de Wit's avatar
Jorran de Wit committed
            salt = salt.encode('utf8')
            verificationsalt = form.cleaned_data['last_name']
            verificationsalt = verificationsalt.encode('utf8')
Jorran de Wit's avatar
Jorran de Wit committed
            verification_key = hashlib.sha1(salt + verificationsalt).hexdigest()
Jorran de Wit's avatar
Jorran de Wit committed
            signature.verification_key = verification_key
Jorran de Wit's avatar
Jorran de Wit committed
            signature.save()
Jorran de Wit's avatar
Jorran de Wit committed
            message += '\n<p>You will receive an email with a verification link.</p>'
            email_text = ('Please click on the link below to confirm '
                          'your signature of the petition: \n'
                          'https://scipost.org/petitions/'
                          + petition.slug + '/verify_signature/' + verification_key + '.\n')
            email_text_html = (
                '<p>Please click on the link below to confirm '
                'your signature of the petition:</p>'
                '<p><a href="https://scipost.org/petitions/{{ slug }}/verify_signature'
                '/{{ key }}">confirm your signature</a></p>')
            html_template = Template(email_text_html)
            html_version = html_template.render(Context({'slug': petition.slug,
                                                         'key': verification_key}))
            emailmessage = EmailMultiAlternatives(
                'Petition signature verification',
                email_text,
                'SciPost petitions<petitions@scipost.org>',
                [form.cleaned_data['email']],
                bcc=['petitions@scipost.org'])
            emailmessage.attach_alternative(html_version, 'text/html')
            emailmessage.send()
        messages.success(request, message)
        return redirect(petition.get_absolute_url())

Jean-Sébastien Caux's avatar
Jean-Sébastien Caux committed
    context = {
        'petition': petition,
        'is_signed': is_signed,
        'form': form,
    }
    return render(request, 'petitions/petition.html', context)


def verify_signature(request, slug, key):
    petition = get_object_or_404(Petition, slug=slug)
    try:
Jorran de Wit's avatar
Jorran de Wit committed
        signature = petition.petition_signatories.get(verification_key=key)
    except PetitionSignatory.DoesNotExist:
Jean-Sébastien Caux's avatar
Jean-Sébastien Caux committed
        messages.warning(request, ('Unknown signature key.'))
Jorran de Wit's avatar
Jorran de Wit committed
        return redirect(petition.get_absolute_url())

    if not signature.verified:
        # Slight reduction of db write-use
        signature.verified = True
        signature.save()
    messages.success(request, ('<h3>Many thanks for confirming your signature.</h3>'
                               '<p>Please invite your colleagues to also sign.</p>'))
Jorran de Wit's avatar
Jorran de Wit committed
    mail_util = DirectMailUtil(
        'signatory/thank_SPB_signature', recipient_list=[signature.email])
    mail_util.send_mail()
Jorran de Wit's avatar
Jorran de Wit committed
    return redirect(petition.get_absolute_url())