Newer
Older
__copyright__ = "Copyright 2016-2018, 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.edit import CreateView, UpdateView, DeleteView
from django.views.generic.list import ListView
from .constants import PROSPECTIVE_FELLOW_INVITED,\
prospective_Fellow_statuses_dict,\
PROSPECTIVE_FELLOW_EVENT_EMAILED, PROSPECTIVE_FELLOW_EVENT_STATUSUPDATED,\
PROSPECTIVE_FELLOW_EVENT_COMMENT
from .forms import FellowshipForm, FellowshipTerminateForm, FellowshipRemoveSubmissionForm,\
FellowshipAddSubmissionForm, AddFellowshipForm, SubmissionAddFellowshipForm,\
FellowshipRemoveProceedingsForm, FellowshipAddProceedingsForm, SubmissionAddVotingFellowForm,\
FellowVotingRemoveSubmissionForm,\
ProspectiveFellowForm, ProspectiveFellowStatusForm, ProspectiveFellowEventForm
from .models import Fellowship, ProspectiveFellow, ProspectiveFellowEvent
from scipost.constants import SCIPOST_SUBJECT_AREAS
from scipost.mixins import PermissionsMixin
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, arxiv_identifier_w_vn_nr):
"""
List all Fellowships related to Submission.
"""
submission = get_object_or_404(Submission, arxiv_identifier_w_vn_nr=arxiv_identifier_w_vn_nr)
context = {
'submission': submission
}
return render(request, 'colleges/submission_pool.html', context)
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def submission_voting_fellows(request, arxiv_identifier_w_vn_nr):
"""
List all Fellowships selected for voting on the EIC related to Submission.
"""
submission = get_object_or_404(Submission, arxiv_identifier_w_vn_nr=arxiv_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, arxiv_identifier_w_vn_nr):
"""
Add Fellowship to the Fellows voting on the EICRecommendation of a Submission.
"""
submission = get_object_or_404(Submission, arxiv_identifier_w_vn_nr=arxiv_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.arxiv_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, arxiv_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(),
arxiv_identifier_w_vn_nr=arxiv_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 {sub} removed from Fellowship.'.format(
sub=arxiv_identifier_w_vn_nr))
return redirect(reverse('colleges:submission_voting_fellows',
args=(submission.arxiv_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, arxiv_identifier_w_vn_nr):
"""
Add Fellowship to the pool of a Submission.
"""
submission = get_object_or_404(Submission, arxiv_identifier_w_vn_nr=arxiv_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.arxiv_identifier_w_vn_nr,)))
context = {
'submission': submission,
'form': form,
}
return render(request, 'colleges/submission_add.html', context)
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
@login_required
@permission_required('scipost.can_manage_college_composition', raise_exception=True)
def fellowship_remove_submission(request, id, arxiv_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(),
arxiv_identifier_w_vn_nr=arxiv_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 {sub} removed from Fellowship.'.format(
sub=arxiv_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} added to Fellowship.'.format(
submission=form.cleaned_data['submission'].arxiv_identifier_w_vn_nr))
return redirect(fellowship.get_absolute_url())
context = {
'fellowship': fellowship,
'form': form,
}
return render(request, 'colleges/fellowship_submission_add.html', context)
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
300
301
302
303
304
305
306
307
308
309
@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)
class ProspectiveFellowCreateView(PermissionsMixin, CreateView):
"""
Formview to create a new Prospective Fellow.
"""
permission_required = 'scipost.can_manage_college_composition'
template_name = 'colleges/prospectivefellow_form.html'
success_url = reverse_lazy('colleges:prospective_Fellows')
class ProspectiveFellowUpdateView(PermissionsMixin, UpdateView):
"""
Formview to update a Prospective Fellow.
"""
permission_required = 'scipost.can_manage_college_composition'
model = ProspectiveFellow
template_name = 'colleges/prospectivefellow_form.html'
success_url = reverse_lazy('colleges:prospective_Fellows')
class ProspectiveFellowUpdateStatusView(PermissionsMixin, UpdateView):
"""
Formview to update the status of a Prospective Fellow.
"""
permission_required = 'scipost.can_manage_college_composition'
model = ProspectiveFellow
fields = ['status']
success_url = reverse_lazy('colleges:prospective_Fellows')
def form_valid(self, form):
event = ProspectiveFellowEvent(
prosfellow=self.object,
event=PROSPECTIVE_FELLOW_EVENT_STATUSUPDATED,
comments=('Status updated to %s'
% prospective_Fellow_statuses_dict[form.cleaned_data['status']]),
noted_on=timezone.now(),
noted_by=self.request.user.contributor)
event.save()
return super().form_valid(form)
class ProspectiveFellowDeleteView(PermissionsMixin, DeleteView):
"""
Delete a Prospective Fellow.
"""
permission_required = 'scipost.can_manage_college_composition'
model = ProspectiveFellow
success_url = reverse_lazy('colleges:prospective_Fellows')
class ProspectiveFellowListView(PermissionsMixin, ListView):
"""
List the ProspectiveFellow object instances.
"""
permission_required = 'scipost.can_manage_college_composition'
model = ProspectiveFellow
paginate_by = 50
def get_queryset(self):
"""
Return a queryset of ProspectiveFellows using optional GET data.
"""
queryset = ProspectiveFellow.objects.all()
if 'discipline' in self.request.GET:
queryset = queryset.filter(discipline=self.request.GET['discipline'].lower())
if 'expertise' in self.request.GET:
queryset = queryset.filter(expertises__contains=[self.request.GET['expertise']])
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['subject_areas'] = SCIPOST_SUBJECT_AREAS
context['pfstatus_form'] = ProspectiveFellowStatusForm()
context['pfevent_form'] = ProspectiveFellowEventForm()
return context
class ProspectiveFellowInitialEmailView(PermissionsMixin, MailView):
"""
Send a templated email to a Prospective Fellow.
"""
permission_required = 'scipost.can_manage_college_composition'
queryset = ProspectiveFellow.objects.all()
mail_code = 'prospectivefellows/invite_prospective_fellow_initial'
success_url = reverse_lazy('colleges:prospective_Fellows')
def form_valid(self, form):
"""
Create an event associated to this outgoing email.
"""
event = ProspectiveFellowEvent(
prosfellow=self.object,
event=PROSPECTIVE_FELLOW_EVENT_EMAILED,
comments='Emailed initial template',
noted_on=timezone.now(),
noted_by=self.request.user.contributor)
event.save()
self.object.status=PROSPECTIVE_FELLOW_INVITED
self.object.save()
return super().form_valid(form)
class ProspectiveFellowEventCreateView(PermissionsMixin, CreateView):
"""
Add an event for a Prospective Fellow.
"""
permission_required = 'scipost.can_manage_college_composition'
form_class = ProspectiveFellowEventForm
success_url = reverse_lazy('colleges:prospective_Fellows')
def form_valid(self, form):
form.instance.prosfellow = get_object_or_404(ProspectiveFellow, 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)