SciPost Code Repository

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


from django.contrib import messages
from django.core.urlresolvers import reverse, reverse_lazy
from django.db import IntegrityError
from django.shortcuts import get_object_or_404, render, redirect
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.views.generic.list import ListView

from guardian.decorators import permission_required

from scipost.constants import SCIPOST_SUBJECT_AREAS
from scipost.mixins import PermissionsMixin, PaginationMixin
from scipost.models import Contributor
from invitations.models import RegistrationInvitation
from submissions.models import RefereeInvitation

from .models import Profile, AlternativeEmail
from .forms import ProfileForm, AlternativeEmailForm, SearchTextForm
class ProfileCreateView(PermissionsMixin, CreateView):
    """
    Formview to create a new Profile.
    """
    permission_required = 'scipost.can_create_profiles'
    form_class = ProfileForm
    template_name = 'profiles/profile_form.html'
    success_url = reverse_lazy('profiles:profiles')

    def get_initial(self):
        """
        Provide initial data based on kwargs.
        The data can come from a Contributor, Invitation, UnregisteredAuthor, ...
        """
        initial = super().get_initial()
        from_type = self.kwargs.get('from_type', None)
        pk = self.kwargs.get('pk', None)
Jean-Sébastien Caux's avatar
Jean-Sébastien Caux committed
        print(from_type)
        print(pk)
        if pk:
            pk = int(pk)
            if from_type == 'contributor':
                contributor = get_object_or_404(Contributor, pk=pk)
                initial['title'] = contributor.title
                initial['first_name'] = contributor.user.first_name
                initial['last_name'] = contributor.user.last_name
                initial['email'] = contributor.user.email
                initial['discipline'] = contributor.discipline
                initial['expertises'] = contributor.expertises
                initial['orcid_id'] = contributor.orcid_id
                initial['webpage'] = contributor.personalwebpage
                initial['accepts_SciPost_emails'] = contributor.accepts_SciPost_emails
            elif from_type == 'refereeinvitation':
                refinv = get_object_or_404(RefereeInvitation, pk=pk)
                initial['title'] = refinv.title
                initial['first_name'] = refinv.first_name
                initial['last_name'] = refinv.last_name
                initial['email'] = refinv.email_address
                initial['discipline'] = refinv.submission.discipline
                initial['expertises'] = refinv.submission.secondary_areas
            elif from_type == 'registrationinvitation':
                reginv = get_object_or_404(RegistrationInvitation, pk=pk)
                initial['title'] = reginv.title
                initial['first_name'] = reginv.first_name
                initial['last_name'] = reginv.last_name
                initial['email'] = reginv.email

class ProfileUpdateView(PermissionsMixin, UpdateView):
    """
    Formview to update a Profile.
    """
    permission_required = 'scipost.can_create_profiles'
    model = Profile
    form_class = ProfileForm
    template_name = 'profiles/profile_form.html'
    success_url = reverse_lazy('profiles:profiles')


class ProfileDeleteView(PermissionsMixin, DeleteView):
    """
    Delete a Profile.
    """
    permission_required = 'scipost.can_create_profiles'
    model = Profile
    success_url = reverse_lazy('profiles:profiles')


class ProfileListView(PermissionsMixin, PaginationMixin, ListView):
    """
    List Profile object instances.
    """
    permission_required = 'scipost.can_view_profiles'
    model = Profile
    paginate_by = 25

    def get_queryset(self):
        """
        Return a queryset of Profiles using optional GET data.
        """
        queryset = Profile.objects.all()
        if self.request.GET.get('discipline', None):
            queryset = queryset.filter(discipline=self.request.GET['discipline'].lower())
            if self.request.GET.get('expertise', None):
                queryset = queryset.filter(expertises__contains=[self.request.GET['expertise']])
        if self.request.GET.get('contributor', None) == 'False':
            queryset = queryset.filter(contributor=None)
        elif self.request.GET.get('contributor', None) == 'True':
            queryset = queryset.exclude(contributor=None)
        if self.request.GET.get('text', None):
            queryset = queryset.filter(last_name__startswith=self.request.GET.get('text'))
        return queryset

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['subject_areas'] = SCIPOST_SUBJECT_AREAS
        context['searchform'] = SearchTextForm(initial={'text': self.request.GET.get('text', None)})
Jean-Sébastien Caux's avatar
Jean-Sébastien Caux committed
        contributors_dup_email = Contributor.objects.have_duplicate_email()
        context['nr_contributors_w_duplicate_email'] = contributors_dup_email.count()
        context['contributors_w_duplicate_email'] = contributors_dup_email
Jean-Sébastien Caux's avatar
Jean-Sébastien Caux committed
        contributors_wo_profile = Contributor.objects.filter(profile=None)
        context['nr_contributors_wo_profile'] = contributors_wo_profile.count()
        context['next_contributor_wo_profile'] = contributors_wo_profile.first()
        refinv_wo_profile = RefereeInvitation.objects.filter(profile=None)
        context['nr_refinv_wo_profile'] = refinv_wo_profile.count()
        context['next_refinv_wo_profile'] = refinv_wo_profile.first()
        reginv_wo_profile = RegistrationInvitation.objects.filter(profile=None)
        context['nr_reginv_wo_profile'] = reginv_wo_profile.count()
        context['next_reginv_wo_profile'] = reginv_wo_profile.first()
        context['alternative_email_form'] = AlternativeEmailForm()


@permission_required('scipost.can_create_profiles')
def add_alternative_email(request, profile_id):
    """
    Add an alternative email address to a Profile.
    """
    profile = get_object_or_404(Profile, pk=profile_id)
    form = AlternativeEmailForm(request.POST or None)
    if form.is_valid():
        try:
            newaltemail = AlternativeEmail(profile=profile,
                                           email=form.cleaned_data['email'],
                                           still_valid=form.cleaned_data['still_valid'])
            newaltemail.save()
            messages.success(request, 'Alternative email successfully added.')
        except IntegrityError:
            errormessage = 'This profile/email pair is already defined.'
            return render(request, 'scipost/error.html',
                          context={'errormessage': errormessage})
    else:
        errormessage = 'Please enter a valid email address'
        return render(request, 'scipost/error.html',
                          context={'errormessage': errormessage})
    return redirect(reverse('profiles:profiles'))