diff --git a/hypha/apply/determinations/forms.py b/hypha/apply/determinations/forms.py index 60755ef29c19a9580d43bdfb72f9c4a5a9b4be39..16693bf1a575bcea55ac8449c0a0a008bcf2ee08 100644 --- a/hypha/apply/determinations/forms.py +++ b/hypha/apply/determinations/forms.py @@ -370,7 +370,11 @@ class BaseProposalDeterminationForm(forms.Form): rationale.group = 4 -class BaseBatchDeterminationForm(DeterminationModelForm, forms.Form): +class FormMixedMetaClass(type(StreamBaseForm), type(forms.Form)): + pass + + +class BatchDeterminationForm(StreamBaseForm, forms.Form, metaclass=FormMixedMetaClass): submissions = forms.ModelMultipleChoiceField( queryset=ApplicationSubmission.objects.all(), widget=forms.ModelMultipleChoiceField.hidden_widget, @@ -380,6 +384,24 @@ class BaseBatchDeterminationForm(DeterminationModelForm, forms.Form): widget=forms.ModelChoiceField.hidden_widget, required=True, ) + outcome = forms.ChoiceField( + choices=DETERMINATION_CHOICES, + label='Determination', + help_text='Do you recommend requesting a proposal based on this concept note?', + widget=forms.HiddenInput() + ) + + def __init__(self, *args, user, submissions, action, initial={}, edit=False, **kwargs): + initial.update(submissions=submissions.values_list('id', flat=True)) + try: + initial.update(outcome=TRANSITION_DETERMINATION[action]) + except KeyError: + pass + initial.update(author=user.id) + super().__init__(*args, initial=initial, **kwargs) + self.fields['submissions'].disabled = True + self.fields['author'].disabled = True + self.fields['outcome'].disabled = True def data_fields(self): return [ @@ -387,11 +409,24 @@ class BaseBatchDeterminationForm(DeterminationModelForm, forms.Form): if field not in ['submissions', 'outcome', 'author', 'send_notice'] ] + def clean(self): + cleaned_data = super().clean() + cleaned_data['form_data'] = { + key: value + for key, value in cleaned_data.items() + if key in self.data_fields() + } + return cleaned_data + + def clean_outcome(self): + # Enforce outcome as an int + return int(self.cleaned_data['outcome']) + def _post_clean(self): submissions = self.cleaned_data['submissions'].undetermined() data = { field: self.cleaned_data[field] - for field in ['author', 'data', 'outcome'] + for field in ['author', 'form_data', 'outcome'] } self.instances = [ @@ -408,21 +443,3 @@ class BaseBatchDeterminationForm(DeterminationModelForm, forms.Form): determinations = Determination.objects.bulk_create(self.instances) self.instances = determinations return determinations - - -class BatchConceptDeterminationForm(BaseConceptDeterminationForm, BaseBatchDeterminationForm): - def __init__(self, *args, submissions, initial={}, **kwargs): - initial.update(submissions=submissions.values_list('id', flat=True)) - super(BaseBatchDeterminationForm, self).__init__(*args, initial=initial, submission=None, **kwargs) - self.fields['outcome'].widget = forms.HiddenInput() - - self.fields = self.apply_form_settings('concept', self.fields) - - -class BatchProposalDeterminationForm(BaseProposalDeterminationForm, BaseBatchDeterminationForm): - def __init__(self, *args, submissions, initial={}, **kwargs): - initial.update(submissions=submissions.values_list('id', flat=True)) - super(BaseBatchDeterminationForm, self).__init__(*args, initial=initial, **kwargs) - self.fields['outcome'].widget = forms.HiddenInput() - - self.fields = self.apply_form_settings('proposal', self.fields) diff --git a/hypha/apply/determinations/views.py b/hypha/apply/determinations/views.py index 628f93ceaa73dfbfe9f5ace400676972fcca441d..4d37aafefbebe734c2b688afd4d0172d95f0530e 100644 --- a/hypha/apply/determinations/views.py +++ b/hypha/apply/determinations/views.py @@ -24,8 +24,7 @@ from hypha.apply.utils.views import CreateOrUpdateView, ViewDispatcher from hypha.apply.stream_forms.models import BaseStreamForm from .forms import ( - BatchConceptDeterminationForm, - BatchProposalDeterminationForm, + BatchDeterminationForm, DeterminationModelForm, ) from .models import ( @@ -49,32 +48,13 @@ from .options import ( from .blocks import DeterminationBlock -def get_form_for_stages(submissions): - forms = [ - get_form_for_stage(submission, batch=True) - for submission in submissions - ] - if len(set(forms)) != 1: - raise ValueError('Submissions expect different forms - please contact admin') - - return forms[0] - - -def get_form_for_stage(submission, batch=False, edit=False): - if batch: - forms = [BatchConceptDeterminationForm, BatchProposalDeterminationForm] - index = submission.workflow.stages.index(submission.stage) - return forms[index] - - def get_fields_for_stages(submissions): forms_fields = [ get_fields_for_stage(submission) for submission in submissions ] - # import ipdb; ipdb.set_trace() - # if len(set(forms)) != 1: - # raise ValueError('Submissions expect different forms - please contact admin') + if not all(i == forms_fields[0] for i in forms_fields): + raise ValueError('Submissions expect different forms - please contact admin') return forms_fields[0] @@ -259,8 +239,7 @@ class DeterminationCreateOrUpdateView(BaseStreamForm, CreateOrUpdateView): @method_decorator(staff_required, name='dispatch') class BatchDeterminationCreateView(BaseStreamForm, CreateView): - submission_form_class = DeterminationModelForm - model = Determination + submission_form_class = BatchDeterminationForm template_name = 'determinations/batch_determination_form.html' def dispatch(self, *args, **kwargs): @@ -291,12 +270,18 @@ class BatchDeterminationCreateView(BaseStreamForm, CreateView): kwargs = super().get_form_kwargs() kwargs['user'] = self.request.user kwargs['submissions'] = self.get_submissions() - kwargs['submission'] = None kwargs['action'] = self.get_action() - # kwargs['site'] = Site.find_for_request(self.request) kwargs.pop('instance') return kwargs + def get_form_class(self): + form_fields = self.get_form_fields() + field_blocks = self.get_defined_fields() + for field_block in field_blocks: + if isinstance(field_block.block, DeterminationBlock): + form_fields.pop(field_block.id) + return type('WagtailStreamForm', (self.submission_form_class,), form_fields) + def get_defined_fields(self): return get_fields_for_stages(self.get_submissions()) @@ -318,7 +303,6 @@ class BatchDeterminationCreateView(BaseStreamForm, CreateView): determination.submission.id: determination for determination in form.instances } - messenger( MESSAGES.BATCH_DETERMINATION_OUTCOME, request=self.request, @@ -336,6 +320,9 @@ class BatchDeterminationCreateView(BaseStreamForm, CreateView): 'Unable to determine submission "{title}" as already determined'.format(title=submission.title), ) else: + determination.form_fields = self.get_defined_fields() + determination.message = form.cleaned_data[determination.message_field.id] + determination.save() transition = transition_from_outcome(form.cleaned_data.get('outcome'), submission) if determination.outcome == NEEDS_MORE_INFO: