Newer
Older
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.urls import reverse_lazy
from django.utils.decorators import method_decorator
from django.views.generic import DetailView
from django.views.generic.detail import SingleObjectTemplateResponseMixin
from django.views.generic.edit import ProcessFormView, ModelFormMixin
from opentech.apply.funds.models import ApplicationSubmission
from opentech.apply.users.decorators import staff_required
from .forms import ConceptDeterminationForm, ProposalDeterminationForm
from .models import Determination
def get_form_for_stage(submission):
forms = [ConceptDeterminationForm, ProposalDeterminationForm]
index = submission.workflow.stages.index(submission.stage)
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
return forms[index]
class CreateOrUpdateView(SingleObjectTemplateResponseMixin, ModelFormMixin, ProcessFormView):
def get(self, request, *args, **kwargs):
try:
self.object = self.get_object()
except self.model.DoesNotExist:
self.object = None
return super().get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
try:
self.object = self.get_object()
except self.model.DoesNotExist:
self.object = None
return super().post(request, *args, **kwargs)
class DeterminationCreateOrUpdateView(CreateOrUpdateView):
model = Determination
template_name = 'determinations/determination_form.html'
def get_object(self, queryset=None):
return self.model.objects.get(submission=self.submission, author=self.request.user)
def dispatch(self, request, *args, **kwargs):
self.submission = get_object_or_404(ApplicationSubmission, id=self.kwargs['submission_pk'])
# TODO add proper permission
# if not self.submission.phase.has_perm(request.user, 'add_determination') or \
if not self.submission.user_lead_or_admin(request.user):
raise PermissionDenied()
return super().dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
try:
has_submitted_determination = not self.submission.determination.is_draft
except ObjectDoesNotExist:
has_submitted_determination = False
return super().get_context_data(
submission=self.submission,
has_submitted_determination=has_submitted_determination,
title="Update Determination draft" if self.object else 'Add Determination',
**kwargs
)
def get_form_class(self):
return get_form_for_stage(self.submission)
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['request'] = self.request
kwargs['submission'] = self.submission
if self.object:
kwargs['initial'] = self.object.determination_data
kwargs['initial']['determination'] = self.object.determination
kwargs['initial']['determination_message'] = self.object.determination_message
return kwargs
def get_success_url(self):
return self.submission.get_absolute_url()
@method_decorator(staff_required, name='dispatch')
class DeterminationDetailView(DetailView):
model = Determination
def dispatch(self, request, *args, **kwargs):
determination = self.get_object()
if request.user != determination.submission.lead and not request.user.is_superuser:
raise PermissionDenied
if determination.is_draft:
return HttpResponseRedirect(reverse_lazy('apply:submissions:determinations:form', args=(determination.submission.id,)))
return super().dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
determination_data = self.get_object().determination_data
form_used = get_form_for_stage(self.get_object().submission)
for name, field in form_used.base_fields.items():
try:
form_determination_data.setdefault(title, [])
value = determination_data[name]
form_determination_data.setdefault(field.label, str(value))
except KeyError:
lead_or_admin = self.request.user.is_superuser or self.request.user == self.get_object().submission.lead
can_view_extended_data=lead_or_admin,