diff --git a/opentech/apply/activity/messaging.py b/opentech/apply/activity/messaging.py index bac259cb56bce6f76f000c97f0cc2dfef14e2b9f..415b9e029570c14c53072f8104181599d7f9667d 100644 --- a/opentech/apply/activity/messaging.py +++ b/opentech/apply/activity/messaging.py @@ -22,6 +22,7 @@ class MESSAGES(Enum): REVIEWERS_UPDATED = 'reviewers_updated' NEW_REVIEW = 'new_review' COMMENT = 'comment' + PROPOSAL_SUBMITTED = 'proposal_submitted' class AdapterBase: @@ -98,6 +99,9 @@ class SlackAdapter(AdapterBase): MESSAGES.UPDATE_LEAD: 'The lead of <{link}|{submission.title}> has been updated from {old.lead} to {submission.lead} by {user}', MESSAGES.COMMENT: 'A new comment has been posted on <{link}|{submission.title}>', MESSAGES.REVIEWERS_UPDATED: '{user} has updated the reviewers on <{link}|{submission.title}>', + MESSAGES.TRANSITION: '{user} has updated the status of <{link}|{submission.title}>: {old_phase.display_name} → {submission.phase}', + MESSAGES.DETERMINATION_OUTCOME: 'A determination for <{link}|{submission.title}> was sent by email: {submission.determination.get_outcome_display}', + MESSAGES.PROPOSAL_SUBMITTED: 'A proposal has been submitted for review: <{link}|{submission.title}>', } def __init__(self): diff --git a/opentech/apply/determinations/forms.py b/opentech/apply/determinations/forms.py index 9ad3f2652d48bb74d482974f057be2b3c6e2bb35..900485459eaa106c56c3c8a0662af876cbb5474b 100644 --- a/opentech/apply/determinations/forms.py +++ b/opentech/apply/determinations/forms.py @@ -1,7 +1,7 @@ from django import forms from django.core.exceptions import NON_FIELD_ERRORS -from opentech.apply.funds.workflow import DETERMINATION_RESPONSE_TRANSITIONS +from opentech.apply.funds.workflow import DETERMINATION_OUTCOMES from .models import Determination, DETERMINATION_CHOICES, NEEDS_MORE_INFO, REJECTED, ACCEPTED, \ DETERMINATION_TRANSITION_SUFFIX @@ -75,7 +75,7 @@ class BaseDeterminationForm(forms.ModelForm): return super().save(commit) def get_determination_from_action_name(self, action_name): - if action_name in DETERMINATION_RESPONSE_TRANSITIONS: + if action_name in DETERMINATION_OUTCOMES: if 'more_info' in action_name: return NEEDS_MORE_INFO elif 'accepted' in action_name or 'invited_to_proposal' in action_name: diff --git a/opentech/apply/funds/models.py b/opentech/apply/funds/models.py index 8c93ec46e2204bf1ae788b33eeac0fd5922a15f7..be3a73359a05c4701bddbac37534ab8a662a0942 100644 --- a/opentech/apply/funds/models.py +++ b/opentech/apply/funds/models.py @@ -46,13 +46,14 @@ from .blocks import ApplicationCustomFormFieldsBlock, REQUIRED_BLOCK_NAMES from .edit_handlers import FilteredFieldPanel, ReadOnlyPanel, ReadOnlyInlinePanel from .workflow import ( active_statuses, + DETERMINATION_OUTCOMES, + DETERMINATION_PHASES, + DETERMINATION_RESPONSE_PHASES, get_review_statuses, INITIAL_STATE, review_statuses, UserPermissions, WORKFLOWS, - DETERMINATION_PHASES, - DETERMINATION_RESPONSE_PHASES, ) LIMIT_TO_STAFF = {'groups__name': STAFF_GROUP_NAME} diff --git a/opentech/apply/funds/views.py b/opentech/apply/funds/views.py index 0f0f962f0db72ca0b110b69ff4a810d82543152f..30fb9d80fd5730485399f4515dd6f2a9c551b60d 100644 --- a/opentech/apply/funds/views.py +++ b/opentech/apply/funds/views.py @@ -19,7 +19,7 @@ from opentech.apply.activity.views import ( DelegatedViewMixin, ) from opentech.apply.activity.messaging import messenger, MESSAGES -from opentech.apply.funds.workflow import DETERMINATION_RESPONSE_TRANSITIONS +from opentech.apply.funds.workflow import DETERMINATION_OUTCOMES from opentech.apply.review.views import ReviewContextMixin from opentech.apply.users.decorators import staff_required from opentech.apply.utils.views import DelegateableView, ViewDispatcher @@ -38,7 +38,7 @@ class SubmissionListView(AllActivityContextMixin, SingleTableMixin, FilterView): filterset_class = SubmissionFilter def get_queryset(self): - return self.filterset_class._meta.model.objects.current() + return self.filterset_class._meta.model.objects.active().current() def get_context_data(self, **kwargs): active_filters = self.filterset.data @@ -77,13 +77,21 @@ class ProgressSubmissionView(DelegatedViewMixin, UpdateView): def form_valid(self, form): action = form.cleaned_data.get('action') # Defer to the determination form for any of the determination transitions - if action in DETERMINATION_RESPONSE_TRANSITIONS: + if action in DETERMINATION_OUTCOMES and not self.object.determination.submitted: return HttpResponseRedirect(reverse_lazy( 'apply:submissions:determinations:form', args=(form.instance.id,)) + "?action=" + action) self.object.perform_transition(action, self.request.user, request=self.request) + if object.phase.name == 'proposal_discussion' and action == 'proposal_discussion': + messenger( + MESSAGES.PROPOSAL_SUBMITTED, + request=self.request, + user=self.request.user, + submission=self.object.instance, + ) + return super().form_valid(form) diff --git a/opentech/apply/funds/workflow.py b/opentech/apply/funds/workflow.py index 3d1afa63f60c6fbd89f7500fd9a2de78d46f6013..2f7dca237e69fa403973684ea27a4d5c93519226 100644 --- a/opentech/apply/funds/workflow.py +++ b/opentech/apply/funds/workflow.py @@ -427,4 +427,4 @@ def get_determination_transitions(): return transitions -DETERMINATION_RESPONSE_TRANSITIONS = get_determination_transitions() +DETERMINATION_OUTCOMES = get_determination_transitions()