Newer
Older
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from django.contrib.auth.decorators import login_required, permission_required
from django.shortcuts import get_object_or_404, render, redirect
from django.core.urlresolvers import reverse, reverse_lazy
from django.utils.decorators import method_decorator
from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.views.generic.list import ListView
from .constants import POTENTIAL_FELLOWSHIP_INVITED, potential_fellowship_statuses_dict,\
POTENTIAL_FELLOWSHIP_EVENT_EMAILED, POTENTIAL_FELLOWSHIP_EVENT_STATUSUPDATED,\
POTENTIAL_FELLOWSHIP_EVENT_COMMENT
from .forms import FellowshipForm, FellowshipTerminateForm, FellowshipRemoveSubmissionForm,\
FellowshipAddSubmissionForm, AddFellowshipForm, SubmissionAddFellowshipForm,\
FellowshipRemoveProceedingsForm, FellowshipAddProceedingsForm, SubmissionAddVotingFellowForm,\
FellowVotingRemoveSubmissionForm,\
PotentialFellowshipForm, PotentialFellowshipStatusForm, PotentialFellowshipEventForm
from .models import Fellowship, PotentialFellowship, PotentialFellowshipEvent
from scipost.constants import SCIPOST_SUBJECT_AREAS
from scipost.mixins import PermissionsMixin, PaginationMixin
from mails.forms import EmailTemplateForm
from mails.views import MailView
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def fellowships(request):
"""List all fellowships to be able to edit them, or create new ones."""
fellowships = Fellowship.objects.active()
context = {
'fellowships': fellowships
}
return render(request, 'colleges/fellowships.html', context)
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def fellowship_detail(request, id):
fellowship = get_object_or_404(Fellowship, id=id)
context = {
'fellowship': fellowship
}
return render(request, 'colleges/fellowship_details.html', context)
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def fellowship_add(request):
"""
Create a new Fellowship.
"""
form = AddFellowshipForm(request.POST or None, initial=request.GET or None)
if form.is_valid():
fellowship = form.save()
messages.success(request, 'Fellowship added.')
return redirect(fellowship.get_absolute_url())
context = {
'form': form
}
return render(request, 'colleges/fellowship_add.html', context)
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def fellowship_edit(request, id):
"""
Edit basic information about fellowship.
"""
fellowship = get_object_or_404(Fellowship, id=id)
form = FellowshipForm(request.POST or None, instance=fellowship)
if form.is_valid():
form.save()
messages.success(request, 'Fellowship updated.')
return redirect(fellowship.get_absolute_url())
context = {
'fellowship': fellowship,
'form': form
}
return render(request, 'colleges/fellowship_edit.html', context)
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def fellowship_terminate(request, id):
"""
Terminate Fellowship by setting the until_date to today's date.
"""
fellowship = get_object_or_404(Fellowship, id=id)
form = FellowshipTerminateForm(request.POST or None, instance=fellowship)
if form.is_valid():
form.save()
messages.success(request, 'Fellowship terminated.')
else:
messages.warning(request, 'Fellowship has not been terminated, please try again.')
return redirect(fellowship.get_absolute_url())
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def submission_pool(request, identifier_w_vn_nr):
submission = get_object_or_404(Submission, preprint__identifier_w_vn_nr=identifier_w_vn_nr)
context = {
'submission': submission
}
return render(request, 'colleges/submission_pool.html', context)
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def submission_voting_fellows(request, identifier_w_vn_nr):
"""
List all Fellowships selected for voting on the EIC related to Submission.
"""
submission = get_object_or_404(Submission, preprint__identifier_w_vn_nr=identifier_w_vn_nr)
context = {
'submission': submission
}
return render(request, 'colleges/submission_voting_fellows.html', context)
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def submission_add_fellowship_voting(request, identifier_w_vn_nr):
"""Add Fellowship to the Fellows voting on the EICRecommendation of a Submission."""
submission = get_object_or_404(Submission, preprint__identifier_w_vn_nr=identifier_w_vn_nr)
form = SubmissionAddVotingFellowForm(request.POST or None, instance=submission)
if form.is_valid():
form.save()
messages.success(request, 'Fellowship {fellowship} ({id}) added to voting Fellows.'.format(
fellowship=form.cleaned_data['fellowship'].contributor,
id=form.cleaned_data['fellowship'].id))
return redirect(reverse('colleges:submission_voting_fellows',
args=(submission.preprint.identifier_w_vn_nr,)))
context = {
'submission': submission,
'form': form,
}
return render(request, 'colleges/submission_add_for_voting.html', context)
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def fellowship_remove_submission_voting(request, id, identifier_w_vn_nr):
"""Remove Fellow from the EICRecommendation voting group for the Submission."""
fellowship = get_object_or_404(Fellowship, id=id)
submission = get_object_or_404(
fellowship.voting_pool.all(), preprint__identifier_w_vn_nr=identifier_w_vn_nr)
form = FellowVotingRemoveSubmissionForm(request.POST or None,
submission=submission, instance=fellowship)
if form.is_valid() and request.POST:
form.save()
messages.success(request, 'Submission {submission_id} removed from Fellowship.'.format(
submission_id=identifier_w_vn_nr))
return redirect(reverse('colleges:submission_voting_fellows',
args=(submission.preprint.identifier_w_vn_nr,)))
context = {
'fellowship': fellowship,
'form': form,
'submission': submission
}
return render(request, 'colleges/fellowship_submission_remove_voting.html', context)
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def submission_add_fellowship(request, identifier_w_vn_nr):
"""Add Fellowship to the pool of a Submission."""
submission = get_object_or_404(Submission, preprint__identifier_w_vn_nr=identifier_w_vn_nr)
form = SubmissionAddFellowshipForm(request.POST or None, instance=submission)
if form.is_valid():
form.save()
messages.success(request, 'Fellowship {fellowship} ({id}) added to Submission.'.format(
fellowship=form.cleaned_data['fellowship'].contributor,
id=form.cleaned_data['fellowship'].id))
return redirect(reverse('colleges:submission',
args=(submission.preprint.identifier_w_vn_nr,)))
context = {
'submission': submission,
'form': form,
}
return render(request, 'colleges/submission_add.html', context)
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def fellowship_remove_submission(request, id, identifier_w_vn_nr):
"""Remove Submission from the pool of a Fellowship."""
fellowship = get_object_or_404(Fellowship, id=id)
submission = get_object_or_404(
fellowship.pool.all(), preprint__identifier_w_vn_nr=identifier_w_vn_nr)
form = FellowshipRemoveSubmissionForm(request.POST or None,
submission=submission, instance=fellowship)
if form.is_valid() and request.POST:
form.save()
messages.success(request, 'Submission {submission_id} removed from Fellowship.'.format(
submission_id=identifier_w_vn_nr))
return redirect(fellowship.get_absolute_url())
context = {
'fellowship': fellowship,
'form': form,
'submission': submission
}
return render(request, 'colleges/fellowship_submission_remove.html', context)
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def fellowship_add_submission(request, id):
"""Add Submission to the pool of a Fellowship."""
fellowship = get_object_or_404(Fellowship, id=id)
form = FellowshipAddSubmissionForm(request.POST or None, instance=fellowship)
if form.is_valid():
form.save()
messages.success(request, 'Submission {submission_id} added to Fellowship.'.format(
submission_id=form.cleaned_data['submission'].preprint.identifier_w_vn_nr))
return redirect(fellowship.get_absolute_url())
context = {
'fellowship': fellowship,
'form': form,
}
return render(request, 'colleges/fellowship_submission_add.html', context)
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def fellowship_remove_proceedings(request, id, proceedings_id):
"""
Remove Proceedings from the pool of a Fellowship.
"""
fellowship = get_object_or_404(Fellowship, id=id)
proceedings = get_object_or_404(fellowship.proceedings.all(), id=proceedings_id)
form = FellowshipRemoveProceedingsForm(request.POST or None,
proceedings=proceedings, instance=fellowship)
if form.is_valid() and request.POST:
form.save()
messages.success(request, 'Proceedings %s removed from Fellowship.' % str(proceedings))
return redirect(fellowship.get_absolute_url())
context = {
'fellowship': fellowship,
'form': form,
'proceedings': proceedings
}
return render(request, 'colleges/fellowship_proceedings_remove.html', context)
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def fellowship_add_proceedings(request, id):
"""
Add Proceedings to the pool of a Fellowship.
"""
fellowship = get_object_or_404(Fellowship, id=id)
form = FellowshipAddProceedingsForm(request.POST or None, instance=fellowship)
if form.is_valid():
form.save()
proceedings = form.cleaned_data.get('proceedings', '')
messages.success(request, 'Proceedings %s added to Fellowship.' % str(proceedings))
return redirect(fellowship.get_absolute_url())
context = {
'fellowship': fellowship,
'form': form,
}
return render(request, 'colleges/fellowship_proceedings_add.html', context)
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
# Potential Fellowships
class PotentialFellowshipCreateView(PermissionsMixin, CreateView):
"""
Formview to create a new Potential Fellowship.
"""
permission_required = 'scipost.can_manage_college_composition'
form_class = PotentialFellowshipForm
template_name = 'colleges/potentialfellowship_form.html'
success_url = reverse_lazy('colleges:potential_fellowships')
class PotentialFellowshipUpdateView(PermissionsMixin, UpdateView):
"""
Formview to update a Potential Fellowship.
"""
permission_required = 'scipost.can_manage_college_composition'
model = PotentialFellowship
form_class = PotentialFellowshipForm
template_name = 'colleges/potentialfellowship_form.html'
success_url = reverse_lazy('colleges:potential_fellowships')
class PotentialFellowshipUpdateStatusView(PermissionsMixin, UpdateView):
"""
Formview to update the status of a Potential Fellowship.
"""
permission_required = 'scipost.can_manage_college_composition'
model = PotentialFellowship
fields = ['status']
success_url = reverse_lazy('colleges:potential_fellowships')
def form_valid(self, form):
event = PotentialFellowshipEvent(
potfel=self.object,
event=POTENTIAL_FELLOWSHIP_EVENT_STATUSUPDATED,
comments=('Status updated to %s'
% potential_fellowship_statuses_dict[form.cleaned_data['status']]),
noted_on=timezone.now(),
noted_by=self.request.user.contributor)
event.save()
return super().form_valid(form)
class PotentialFellowshipDeleteView(PermissionsMixin, DeleteView):
"""
Delete a Potential Fellowship.
"""
permission_required = 'scipost.can_manage_college_composition'
model = PotentialFellowship
success_url = reverse_lazy('colleges:potential_fellowships')
class PotentialFellowshipListView(PermissionsMixin, PaginationMixin, ListView):
"""
List the PotentialFellowship object instances.
"""
permission_required = 'scipost.can_manage_college_composition'
model = PotentialFellowship
paginate_by = 25
def get_queryset(self):
"""
Return a queryset of PotentialFellowships using optional GET data.
"""
queryset = PotentialFellowship.objects.all()
if self.kwargs.get('discipline', None):
queryset = queryset.filter(profile__discipline=self.kwargs['discipline'].lower())
if self.kwargs.get('expertise', None):
queryset = queryset.filter(profile__expertises__contains=[self.kwargs['expertise']])
return queryset
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['subject_areas'] = SCIPOST_SUBJECT_AREAS
return context
class PotentialFellowshipDetailView(PermissionsMixin, DetailView):
permission_required = 'scipost.can_manage_college_composition'
model = PotentialFellowship
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
context['pfstatus_form'] = PotentialFellowshipStatusForm()
context['pfevent_form'] = PotentialFellowshipEventForm()
return context
class PotentialFellowshipInitialEmailView(PermissionsMixin, MailView):
"""Send a templated email to a Potential Fellow."""
permission_required = 'scipost.can_manage_college_composition'
queryset = PotentialFellowship.objects.all()
mail_code = 'potentialfellowships/invite_potential_fellow_initial'
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
success_url = reverse_lazy('colleges:potential_fellowships')
def form_valid(self, form):
"""Create an event associated to this outgoing email."""
event = PotentialFellowshipEvent(
potfel=self.object,
event=POTENTIAL_FELLOWSHIP_EVENT_EMAILED,
comments='Emailed initial template to potential Fellow',
noted_on=timezone.now(),
noted_by=self.request.user.contributor)
event.save()
self.object.status = POTENTIAL_FELLOWSHIP_INVITED
self.object.save()
return super().form_valid(form)
class PotentialFellowshipEventCreateView(PermissionsMixin, CreateView):
"""
Add an event for a Potential Fellowship.
"""
permission_required = 'scipost.can_manage_college_composition'
form_class = PotentialFellowshipEventForm
success_url = reverse_lazy('colleges:potential_fellowships')
def form_valid(self, form):
form.instance.potfel = get_object_or_404(PotentialFellowship, id=self.kwargs['pk'])
form.instance.noted_on = timezone.now()
form.instance.noted_by = self.request.user.contributor
messages.success(self.request, 'Event added successfully')
return super().form_valid(form)