__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) 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 return initial 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)}) 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 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() return context @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'))