Skip to content

Commit cf2c47e

Browse files
frankduncanfrjo
andauthored
Add new workflow for Request With Review (#4187)
This workflow is like Request with External Review, in that both internal and external reviewers can review submissions. However, it has a workflow more like Request in that there is only one Review step. Co-authored-by: Fredrik Jonsson <[email protected]>
1 parent 5c578c6 commit cf2c47e

File tree

3 files changed

+240
-3
lines changed

3 files changed

+240
-3
lines changed

docs/references/workflows.md

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ Each workflow offers different statuses (e.g. External Review, Ready for Determi
1111
## What are the 4 workflows?
1212

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

1819
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.
1920

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

44+
### 👳 Request with same time review
45+
46+
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.
47+
48+
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.
49+
50+
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.
51+
52+
Once an application is submitted (`INITIAL_STATE`) — it can transition into the following:
53+
54+
- 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.
55+
- Open review (`same_internal_review`) — can transition only between closing review period (`same_post_review_discussion`) and reverting back to the internal screening phase.
56+
- `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`)
57+
- `same_post_review_more_info` — opens editing permissions to applicant again to revise their application to provide the information requested by the screeners.
58+
- 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`)
59+
- 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.
60+
- Accepted (`same_accepted`) — application accepted. Staff can still edit this submission.
61+
- Rejected (`same_rejected`) — application rejected. Permissions removed from all roles.
62+
4363
### 👳 Request with external review
4464

4565
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.
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# Generated by Django 4.2.16 on 2024-11-18 12:28
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("funds", "0120_applicationsubmission_public_id_and_more"),
9+
]
10+
11+
operations = [
12+
migrations.AlterField(
13+
model_name="applicationbase",
14+
name="workflow_name",
15+
field=models.CharField(
16+
choices=[
17+
("single", "Request"),
18+
("single_same", "Request with same time review"),
19+
("single_ext", "Request with external review"),
20+
("single_com", "Request with community review"),
21+
("double", "Concept & Proposal"),
22+
],
23+
default="single",
24+
max_length=100,
25+
verbose_name="Workflow",
26+
),
27+
),
28+
migrations.AlterField(
29+
model_name="applicationsubmission",
30+
name="workflow_name",
31+
field=models.CharField(
32+
choices=[
33+
("single", "Request"),
34+
("single_same", "Request with same time review"),
35+
("single_ext", "Request with external review"),
36+
("single_com", "Request with community review"),
37+
("double", "Concept & Proposal"),
38+
],
39+
default="single",
40+
max_length=100,
41+
verbose_name="Workflow",
42+
),
43+
),
44+
migrations.AlterField(
45+
model_name="labbase",
46+
name="workflow_name",
47+
field=models.CharField(
48+
choices=[
49+
("single", "Request"),
50+
("single_same", "Request with same time review"),
51+
("single_ext", "Request with external review"),
52+
("single_com", "Request with community review"),
53+
("double", "Concept & Proposal"),
54+
],
55+
default="single",
56+
max_length=100,
57+
verbose_name="Workflow",
58+
),
59+
),
60+
migrations.AlterField(
61+
model_name="roundbase",
62+
name="workflow_name",
63+
field=models.CharField(
64+
choices=[
65+
("single", "Request"),
66+
("single_same", "Request with same time review"),
67+
("single_ext", "Request with external review"),
68+
("single_com", "Request with community review"),
69+
("double", "Concept & Proposal"),
70+
],
71+
default="single",
72+
max_length=100,
73+
verbose_name="Workflow",
74+
),
75+
),
76+
]

hypha/apply/funds/workflow.py

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,8 @@ def make_permissions(edit=None, review=None, view=None):
232232

233233
Request = Stage("Request", False)
234234

235+
RequestSame = Stage("RequestSame", True)
236+
235237
RequestExt = Stage("RequestExt", True)
236238

237239
RequestCom = Stage("RequestCom", True)
@@ -386,6 +388,137 @@ def make_permissions(edit=None, review=None, view=None):
386388
},
387389
]
388390

391+
SingleStageSameDefinition = [
392+
{
393+
DRAFT_STATE: {
394+
"transitions": {
395+
INITIAL_STATE: {
396+
"display": _("Submit"),
397+
"permissions": {UserPermissions.APPLICANT},
398+
"method": "create_revision",
399+
"custom": {"trigger_on_submit": True},
400+
},
401+
},
402+
"display": _("Draft"),
403+
"stage": RequestSame,
404+
"permissions": applicant_edit_permissions,
405+
}
406+
},
407+
{
408+
INITIAL_STATE: {
409+
"transitions": {
410+
"same_more_info": _("Request More Information"),
411+
"same_internal_review": _("Open Review"),
412+
"same_determination": _("Ready For Determination"),
413+
"same_rejected": _("Dismiss"),
414+
},
415+
"display": _("Need screening"),
416+
"public": _("Application Received"),
417+
"stage": RequestSame,
418+
"permissions": default_permissions,
419+
},
420+
"same_more_info": {
421+
"transitions": {
422+
INITIAL_STATE: {
423+
"display": _("Submit"),
424+
"permissions": {
425+
UserPermissions.APPLICANT,
426+
UserPermissions.STAFF,
427+
UserPermissions.LEAD,
428+
UserPermissions.ADMIN,
429+
},
430+
"method": "create_revision",
431+
"custom": {"trigger_on_submit": True},
432+
},
433+
},
434+
"display": _("More information required"),
435+
"stage": RequestSame,
436+
"permissions": applicant_edit_permissions,
437+
},
438+
},
439+
{
440+
"same_internal_review": {
441+
"transitions": {
442+
"same_post_review_discussion": _("Close Review"),
443+
INITIAL_STATE: _("Need screening (revert)"),
444+
},
445+
"display": _("Review"),
446+
"public": _("{org_short_name} Review").format(
447+
org_short_name=settings.ORG_SHORT_NAME
448+
),
449+
"stage": RequestSame,
450+
"permissions": reviewer_review_permissions,
451+
},
452+
},
453+
{
454+
"same_post_review_discussion": {
455+
"transitions": {
456+
"same_post_review_more_info": _("Request More Information"),
457+
"same_determination": _("Ready For Determination"),
458+
"same_internal_review": _("Open Review (revert)"),
459+
"same_rejected": _("Dismiss"),
460+
},
461+
"display": _("Ready For Discussion"),
462+
"stage": RequestSame,
463+
"permissions": hidden_from_applicant_permissions,
464+
},
465+
"same_post_review_more_info": {
466+
"transitions": {
467+
"same_post_review_discussion": {
468+
"display": _("Submit"),
469+
"permissions": {
470+
UserPermissions.APPLICANT,
471+
UserPermissions.STAFF,
472+
UserPermissions.LEAD,
473+
UserPermissions.ADMIN,
474+
},
475+
"method": "create_revision",
476+
"custom": {"trigger_on_submit": True},
477+
},
478+
},
479+
"display": _("More information required"),
480+
"stage": RequestSame,
481+
"permissions": applicant_edit_permissions,
482+
},
483+
},
484+
{
485+
"same_determination": {
486+
"transitions": {
487+
"same_post_review_discussion": _("Ready For Discussion (revert)"),
488+
"same_almost": _("Accept but additional info required"),
489+
"same_accepted": _("Accept"),
490+
"same_rejected": _("Dismiss"),
491+
},
492+
"display": _("Ready for Determination"),
493+
"permissions": hidden_from_applicant_permissions,
494+
"stage": RequestSame,
495+
},
496+
},
497+
{
498+
"same_accepted": {
499+
"display": _("Accepted"),
500+
"future": _("Application Outcome"),
501+
"stage": RequestSame,
502+
"permissions": staff_edit_permissions,
503+
},
504+
"same_almost": {
505+
"transitions": {
506+
"same_accepted": _("Accept"),
507+
"same_post_review_discussion": _("Ready For Discussion (revert)"),
508+
},
509+
"display": _("Accepted but additional info required"),
510+
"stage": RequestSame,
511+
"permissions": applicant_edit_permissions,
512+
},
513+
"same_rejected": {
514+
"display": _("Dismissed"),
515+
"stage": RequestSame,
516+
"permissions": no_permissions,
517+
},
518+
},
519+
]
520+
521+
389522
SingleStageExternalDefinition = [
390523
{
391524
DRAFT_STATE: {
@@ -1114,6 +1247,12 @@ def phase_data(phases):
11141247

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

1250+
RequestSameTime = Workflow(
1251+
"Request with same time review",
1252+
"single_same",
1253+
**phase_data(SingleStageSameDefinition),
1254+
)
1255+
11171256
RequestExternal = Workflow(
11181257
"Request with external review",
11191258
"single_ext",
@@ -1133,6 +1272,7 @@ def phase_data(phases):
11331272

11341273
WORKFLOWS = {
11351274
Request.admin_name: Request,
1275+
RequestSameTime.admin_name: RequestSameTime,
11361276
RequestExternal.admin_name: RequestExternal,
11371277
RequestCommunity.admin_name: RequestCommunity,
11381278
ConceptProposal.admin_name: ConceptProposal,
@@ -1255,6 +1395,7 @@ def get_dismissed_statuses():
12551395
DETERMINATION_RESPONSE_PHASES = [
12561396
"post_review_discussion",
12571397
"concept_review_discussion",
1398+
"same_post_review_discussion",
12581399
"post_external_review_discussion",
12591400
"ext_post_external_review_discussion",
12601401
"com_post_external_review_discussion",

0 commit comments

Comments
 (0)