Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new workflow for Request with same time review #4187

Merged
merged 4 commits into from
Nov 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 23 additions & 3 deletions docs/references/workflows.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ Each workflow offers different statuses (e.g. External Review, Ready for Determi
## What are the 4 workflows?

1. [Request](#request)
2. [Request with external review](#request-with-external-review)
3. [Request with community review](#request-with-community-review)
4. [Concept and Proposal](#concept-and-proposal)
2. [Request with same time review](#request-with-same-time-review) (new in v5.20.0)
3. [Request with external review](#request-with-external-review)
4. [Request with community review](#request-with-community-review)
5. [Concept and Proposal](#concept-and-proposal)

All workflows begin with applicant drafting, revising and submitting an application (`DRAFT_STATE`) — only transition available is to `INITIAL_STATE`, upon applicant taking the action to submit their application/request.

Expand All @@ -40,6 +41,25 @@ Once an application is submitted (`INITIAL_STATE`) — it can transition into th
- Accepted (`accepted`) — application accepted. Staff can still edit this submission.
- Rejected (`rejected`) — application rejected. Permissions removed from all roles.

### 👳 Request with same time review

This workflow is a single stage process with an advisory council review or external review stage -- includes functionalties for external reviewers like advisory board members to access applications and submit reviews.

It is very simlar to the "Request with external review" workflow, see below, but the internal and external review step happens at the same step.

Beware if you opt to customise the "Reviewer Settings" (in Wagtail admin). Only the "All states" option in the "State" setting will work with this workflow.

Once an application is submitted (`INITIAL_STATE`) — it can transition into the following:

- A request for more information (`same_more_info`) — opens editing permissions to applicant again to revise their application to provide the information requested by the screeners.
- Open review (`same_internal_review`) — can transition only between closing review period (`same_post_review_discussion`) and reverting back to the internal screening phase.
- `same_post_review_discussion` — after review is closed, you can request more information (`same_post_review_more_info`), ready for determination (`same_determination`), revert back to opening the review (`same_internal_review`), or reject (`same_rejected`)
- `same_post_review_more_info` — opens editing permissions to applicant again to revise their application to provide the information requested by the screeners.
- Ready for determination (`same_determination`) — can revert back to discussion (“Ready For Discussion (revert)” — `same_post_review_discussion`) , or accept with additional info needed (`same_almost`), accept (`same_accepted`) or reject (`same_rejected`)
- Accepted, but additional info is needed (`same_almost`) — opens editing permissions to applicant again to revise their application to provide the information requested by the reviewers, admin, or staff positions.
- Accepted (`same_accepted`) — application accepted. Staff can still edit this submission.
- Rejected (`same_rejected`) — application rejected. Permissions removed from all roles.

### 👳 Request with external review

This workflow is a single stage process with an advisory council review or external review stage -- includes functionalties for external reviewers like advisory board members to access applications and submit reviews.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# Generated by Django 4.2.16 on 2024-11-18 12:28

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("funds", "0120_applicationsubmission_public_id_and_more"),
]

operations = [
migrations.AlterField(
model_name="applicationbase",
name="workflow_name",
field=models.CharField(
choices=[
("single", "Request"),
("single_same", "Request with same time review"),
("single_ext", "Request with external review"),
("single_com", "Request with community review"),
("double", "Concept & Proposal"),
],
default="single",
max_length=100,
verbose_name="Workflow",
),
),
migrations.AlterField(
model_name="applicationsubmission",
name="workflow_name",
field=models.CharField(
choices=[
("single", "Request"),
("single_same", "Request with same time review"),
("single_ext", "Request with external review"),
("single_com", "Request with community review"),
("double", "Concept & Proposal"),
],
default="single",
max_length=100,
verbose_name="Workflow",
),
),
migrations.AlterField(
model_name="labbase",
name="workflow_name",
field=models.CharField(
choices=[
("single", "Request"),
("single_same", "Request with same time review"),
("single_ext", "Request with external review"),
("single_com", "Request with community review"),
("double", "Concept & Proposal"),
],
default="single",
max_length=100,
verbose_name="Workflow",
),
),
migrations.AlterField(
model_name="roundbase",
name="workflow_name",
field=models.CharField(
choices=[
("single", "Request"),
("single_same", "Request with same time review"),
("single_ext", "Request with external review"),
("single_com", "Request with community review"),
("double", "Concept & Proposal"),
],
default="single",
max_length=100,
verbose_name="Workflow",
),
),
]
141 changes: 141 additions & 0 deletions hypha/apply/funds/workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,8 @@ def make_permissions(edit=None, review=None, view=None):

Request = Stage("Request", False)

RequestSame = Stage("RequestSame", True)

RequestExt = Stage("RequestExt", True)

RequestCom = Stage("RequestCom", True)
Expand Down Expand Up @@ -386,6 +388,137 @@ def make_permissions(edit=None, review=None, view=None):
},
]

SingleStageSameDefinition = [
{
DRAFT_STATE: {
"transitions": {
INITIAL_STATE: {
"display": _("Submit"),
"permissions": {UserPermissions.APPLICANT},
"method": "create_revision",
"custom": {"trigger_on_submit": True},
},
},
"display": _("Draft"),
"stage": RequestSame,
"permissions": applicant_edit_permissions,
}
},
{
INITIAL_STATE: {
"transitions": {
"same_more_info": _("Request More Information"),
"same_internal_review": _("Open Review"),
"same_determination": _("Ready For Determination"),
"same_rejected": _("Dismiss"),
},
"display": _("Need screening"),
"public": _("Application Received"),
"stage": RequestSame,
"permissions": default_permissions,
},
"same_more_info": {
"transitions": {
INITIAL_STATE: {
"display": _("Submit"),
"permissions": {
UserPermissions.APPLICANT,
UserPermissions.STAFF,
UserPermissions.LEAD,
UserPermissions.ADMIN,
},
"method": "create_revision",
"custom": {"trigger_on_submit": True},
},
},
"display": _("More information required"),
"stage": RequestSame,
"permissions": applicant_edit_permissions,
},
},
{
"same_internal_review": {
"transitions": {
"same_post_review_discussion": _("Close Review"),
INITIAL_STATE: _("Need screening (revert)"),
},
"display": _("Review"),
"public": _("{org_short_name} Review").format(
org_short_name=settings.ORG_SHORT_NAME
),
"stage": RequestSame,
"permissions": reviewer_review_permissions,
},
},
{
"same_post_review_discussion": {
"transitions": {
"same_post_review_more_info": _("Request More Information"),
"same_determination": _("Ready For Determination"),
"same_internal_review": _("Open Review (revert)"),
"same_rejected": _("Dismiss"),
},
"display": _("Ready For Discussion"),
"stage": RequestSame,
"permissions": hidden_from_applicant_permissions,
},
"same_post_review_more_info": {
"transitions": {
"same_post_review_discussion": {
"display": _("Submit"),
"permissions": {
UserPermissions.APPLICANT,
UserPermissions.STAFF,
UserPermissions.LEAD,
UserPermissions.ADMIN,
},
"method": "create_revision",
"custom": {"trigger_on_submit": True},
},
},
"display": _("More information required"),
"stage": RequestSame,
"permissions": applicant_edit_permissions,
},
},
{
"same_determination": {
"transitions": {
"same_post_review_discussion": _("Ready For Discussion (revert)"),
"same_almost": _("Accept but additional info required"),
"same_accepted": _("Accept"),
"same_rejected": _("Dismiss"),
},
"display": _("Ready for Determination"),
"permissions": hidden_from_applicant_permissions,
"stage": RequestSame,
},
},
{
"same_accepted": {
"display": _("Accepted"),
"future": _("Application Outcome"),
"stage": RequestSame,
"permissions": staff_edit_permissions,
},
"same_almost": {
"transitions": {
"same_accepted": _("Accept"),
"same_post_review_discussion": _("Ready For Discussion (revert)"),
},
"display": _("Accepted but additional info required"),
"stage": RequestSame,
"permissions": applicant_edit_permissions,
},
"same_rejected": {
"display": _("Dismissed"),
"stage": RequestSame,
"permissions": no_permissions,
},
},
]


SingleStageExternalDefinition = [
{
DRAFT_STATE: {
Expand Down Expand Up @@ -1114,6 +1247,12 @@ def phase_data(phases):

Request = Workflow("Request", "single", **phase_data(SingleStageDefinition))

RequestSameTime = Workflow(
"Request with same time review",
"single_same",
**phase_data(SingleStageSameDefinition),
)

RequestExternal = Workflow(
"Request with external review",
"single_ext",
Expand All @@ -1133,6 +1272,7 @@ def phase_data(phases):

WORKFLOWS = {
Request.admin_name: Request,
RequestSameTime.admin_name: RequestSameTime,
RequestExternal.admin_name: RequestExternal,
RequestCommunity.admin_name: RequestCommunity,
ConceptProposal.admin_name: ConceptProposal,
Expand Down Expand Up @@ -1255,6 +1395,7 @@ def get_dismissed_statuses():
DETERMINATION_RESPONSE_PHASES = [
"post_review_discussion",
"concept_review_discussion",
"same_post_review_discussion",
"post_external_review_discussion",
"ext_post_external_review_discussion",
"com_post_external_review_discussion",
Expand Down
Loading