Skip to content
Snippets Groups Projects
views.py 5.08 KiB
Newer Older
  • Learn to ignore specific revisions
  • from django.contrib.auth.decorators import login_required
    
    Dan Braghis's avatar
    Dan Braghis committed
    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
    
    Dan Braghis's avatar
    Dan Braghis committed
    from opentech.apply.funds.workflow import DETERMINATION_PHASES
    
    Dan Braghis's avatar
    Dan Braghis committed
    
    from .forms import ConceptDeterminationForm, ProposalDeterminationForm
    
    Dan Braghis's avatar
    Dan Braghis committed
    from .models import Determination, NEEDS_MORE_INFO
    
    Dan Braghis's avatar
    Dan Braghis committed
    
    
    def get_form_for_stage(submission):
        forms = [ConceptDeterminationForm, ProposalDeterminationForm]
    
        index = submission.workflow.stages.index(submission.stage)
    
    Dan Braghis's avatar
    Dan Braghis committed
        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):
    
    Dan Braghis's avatar
    Dan Braghis committed
            return self.model.objects.get(submission=self.submission)
    
    Dan Braghis's avatar
    Dan Braghis committed
    
        def dispatch(self, request, *args, **kwargs):
            self.submission = get_object_or_404(ApplicationSubmission, id=self.kwargs['submission_pk'])
    
    
    Dan Braghis's avatar
    Dan Braghis committed
            if self.submission.phase not in DETERMINATION_PHASES \
                    and not self.submission.user_lead_or_admin(request.user):
    
    Dan Braghis's avatar
    Dan Braghis committed
                raise PermissionDenied()
    
    
            try:
                submitted = self.get_object().submitted
            except Determination.DoesNotExist:
                submitted = False
    
            if self.request.POST and submitted:
                return self.get(request, *args, **kwargs)
    
    
    Dan Braghis's avatar
    Dan Braghis committed
            return super().dispatch(request, *args, **kwargs)
    
        def get_context_data(self, **kwargs):
            try:
    
    Dan Braghis's avatar
    Dan Braghis committed
                has_determination_response = self.submission.determination.outcome != NEEDS_MORE_INFO \
                                             and not self.submission.determination.is_draft
    
    Dan Braghis's avatar
    Dan Braghis committed
            except ObjectDoesNotExist:
    
    Dan Braghis's avatar
    Dan Braghis committed
                has_determination_response = False
    
    Dan Braghis's avatar
    Dan Braghis committed
    
            return super().get_context_data(
                submission=self.submission,
    
    Dan Braghis's avatar
    Dan Braghis committed
                has_determination_response=has_determination_response,
    
    Dan Braghis's avatar
    Dan Braghis committed
                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:
    
    Dan Braghis's avatar
    Dan Braghis committed
                kwargs['initial'] = self.object.data
                kwargs['initial']['outcome'] = self.object.outcome
                kwargs['initial']['message'] = self.object.message
    
    Dan Braghis's avatar
    Dan Braghis committed
    
            return kwargs
    
        def get_success_url(self):
            return self.submission.get_absolute_url()
    
    
    
    @method_decorator(login_required, name='dispatch')
    
    Dan Braghis's avatar
    Dan Braghis committed
    class DeterminationDetailView(DetailView):
        model = Determination
    
    
    Dan Braghis's avatar
    Dan Braghis committed
        def get_object(self, queryset=None):
            return self.model.objects.get(submission=self.submission)
    
    
    Dan Braghis's avatar
    Dan Braghis committed
        def dispatch(self, request, *args, **kwargs):
    
    Dan Braghis's avatar
    Dan Braghis committed
            self.submission = get_object_or_404(ApplicationSubmission, id=self.kwargs['submission_pk'])
    
    Dan Braghis's avatar
    Dan Braghis committed
            determination = self.get_object()
    
    
            if request.user != submission.user and request.user != submission.lead \
                    and not request.user.is_apply_staff and not request.user.is_superuser:
    
    Dan Braghis's avatar
    Dan Braghis committed
                raise PermissionDenied
    
            if determination.is_draft:
    
    Dan Braghis's avatar
    Dan Braghis committed
                return HttpResponseRedirect(reverse_lazy('apply:submissions:determinations:form', args=(self.submission.id,)))
    
    Dan Braghis's avatar
    Dan Braghis committed
    
            return super().dispatch(request, *args, **kwargs)
    
        def get_context_data(self, **kwargs):
    
    Dan Braghis's avatar
    Dan Braghis committed
            determination = self.get_object()
            form_used = get_form_for_stage(determination.submission)
            form_data = {}
    
    Dan Braghis's avatar
    Dan Braghis committed
    
            for name, field in form_used.base_fields.items():
                try:
    
                    # Add any titles that exist
    
    Dan Braghis's avatar
    Dan Braghis committed
                    title = form_used.titles[field.group]
    
    Dan Braghis's avatar
    Dan Braghis committed
                    form_data.setdefault(title, '')
    
    Dan Braghis's avatar
    Dan Braghis committed
                except AttributeError:
                    pass
    
                try:
    
    Dan Braghis's avatar
    Dan Braghis committed
                    value = determination.data[name]
                    form_data.setdefault(field.label, str(value))
    
                except KeyError:
    
    Dan Braghis's avatar
    Dan Braghis committed
                    pass
    
            return super().get_context_data(
    
    Dan Braghis's avatar
    Dan Braghis committed
                can_view_extended_data=determination.submission.user_lead_or_admin(self.request.user),
                determination_data=form_data,
    
    Dan Braghis's avatar
    Dan Braghis committed
                **kwargs
            )