diff --git a/.gitmodules b/.gitmodules index 84dfae748f..c471f265a4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "portality/static/vendor/edges"] path = portality/static/vendor/edges - url = https://github.com/CottageLabs/edges.git \ No newline at end of file + url = https://github.com/CottageLabs/edges.git +[submodule "modules/formulaic"] + path = modules/formulaic + url = git@github.com:CottageLabs/formulaic.git diff --git a/doajtest/generate_tests.py b/doajtest/generate_tests.py index b76a86938c..3139c297f7 100644 --- a/doajtest/generate_tests.py +++ b/doajtest/generate_tests.py @@ -1,25 +1,59 @@ +"""Generate test files from parameter matrices. + +Usage: + python generate_tests.py [matrix_dir] [bundle_name] [run_test import path] [outdir] + +matrix_dir: directory under matrices to read (default: "tasks.public_data_dump") +bundle_name: bundle name to load parameter sets for (default: "data_dump") +""" + +import argparse, json, re from combinatrix.testintegration import load_parameter_sets from portality.lib.paths import rel2abs -def load_cases(): - return load_parameter_sets(rel2abs(__file__, "matrices", "tasks.public_data_dump"), "data_dump", "test_id", - {"test_id": []}) +def load_cases(matrix_dir, bundle): + return load_parameter_sets(rel2abs(__file__, "matrices", matrix_dir), bundle, "test_id", {"test_id": []}) + + +def main(): + p = argparse.ArgumentParser(description="Generate tests from combinatrix matrices") + p.add_argument("matrix_dir", nargs="?", default="tasks.public_data_dump", + help="directory under matrices to read (e.g. 'tasks.public_data_dump')") + p.add_argument("bundle", nargs="?", default="data_dump", help="bundle name to load parameter sets for") + p.add_argument("import_path", nargs="?", default="", help="import for run_test function") + p.add_argument("outdir", nargs="?", default="", help="directory to write the test to") + args = p.parse_args() -STUB = rel2abs(__file__, "matrices", "tasks.public_data_dump", "stub.py") -OUT = rel2abs(__file__, "matrices", "tasks.public_data_dump", "test_tasks_public_data_dump.py") + matrix_dir = args.matrix_dir + bundle = args.bundle + # convert bundle to CapWords (PascalCase) for use in class names + bundle_cap = "".join([p.capitalize() for p in re.split(r'[^0-9A-Za-z]+', bundle) if p]) + outdir = args.outdir + import_path = args.import_path -tests = "" -for case in load_cases(): - num = case[0].zfill(3) - tests += f""" + + + # output paths + out_filename = f"test_{bundle}.py" + out_path = rel2abs(__file__, "unit", outdir, out_filename) + + tests = f""" +from doajtest.helpers import DoajTestCase +from {import_path} import run_test + +class Test{bundle_cap}(DoajTestCase): + """ + for case in load_cases(matrix_dir, bundle): + num = case[0].zfill(3) + args = json.dumps(case[1], indent=2) + tests += f""" def test_{num}(self): - self.run_test({case[1]}) + run_test({args}) """ -with open(STUB, "r") as f: - stub = f.read() - stub += "\n\n" - stub += tests + with open(out_path, "w") as f: + f.write(tests) + -with open(OUT, "w") as f: - f.write(stub) \ No newline at end of file +if __name__ == "__main__": + main() diff --git a/doajtest/matrices/tasks.public_data_dump/stub.py b/doajtest/matrices/tasks.public_data_dump/stub.py index 4861324728..e1cea5c114 100644 --- a/doajtest/matrices/tasks.public_data_dump/stub.py +++ b/doajtest/matrices/tasks.public_data_dump/stub.py @@ -9,7 +9,7 @@ from doajtest.fixtures import JournalFixtureFactory, ArticleFixtureFactory from doajtest.helpers import DoajTestCase from doajtest.mocks.store import StoreMockFactory -from lib.thread_utils import wait_until +from portality.lib.thread_utils import wait_until from portality import models, store from portality.background import BackgroundApi from portality.core import app diff --git a/doajtest/matrices/triage_workflow/triage_workflow.matrix.csv b/doajtest/matrices/triage_workflow/triage_workflow.matrix.csv new file mode 100644 index 0000000000..5061e33a49 --- /dev/null +++ b/doajtest/matrices/triage_workflow/triage_workflow.matrix.csv @@ -0,0 +1,277 @@ +test_id,module,stage,reviewer,action,actor,has_minimal_review,label,state_id,result_module,result_stage,result_reviewer,initial_legacy_status,result_legacy_status,initial_legacy_eg,result_legacy_eg,error +1,triage,in_progress,none,event_claim,admin,yes,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +2,triage,in_progress,none,event_claim,admin,no,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +3,triage,in_progress,none,event_claim,unassigned_triage,yes,none,1.1,triage,minimal_review,assigned,pending,in progress,Triage,Triage,no +4,triage,in_progress,none,event_claim,unassigned_triage,no,none,1.1,triage,in_progress,assigned,pending,in progress,Triage,Triage,no +5,triage,in_progress,none,event_claim,unassigned_non_triage,yes,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +6,triage,in_progress,none,event_claim,unassigned_non_triage,no,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +7,triage,in_progress,none,event_assign_triage,admin,yes,none,1.1,triage,minimal_review,assigned,pending,in progress,Triage,Triage,no +8,triage,in_progress,none,event_assign_triage,admin,no,none,1.1,triage,in_progress,assigned,pending,in progress,Triage,Triage,no +9,triage,in_progress,none,event_assign_triage,unassigned_triage,yes,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +10,triage,in_progress,none,event_assign_triage,unassigned_triage,no,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +11,triage,in_progress,none,event_assign_triage,unassigned_non_triage,yes,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +12,triage,in_progress,none,event_assign_triage,unassigned_non_triage,no,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +13,triage,in_progress,none,event_assign_non_triage,admin,yes,none,1.1,triage,,,pending,,Triage,Triage,AuthoriseException +14,triage,in_progress,none,event_assign_non_triage,admin,no,none,1.1,triage,,,pending,,Triage,Triage,AuthoriseException +15,triage,in_progress,none,event_assign_non_triage,unassigned_triage,yes,none,1.1,triage,,,pending,,Triage,Triage,AuthoriseException +16,triage,in_progress,none,event_assign_non_triage,unassigned_triage,no,none,1.1,triage,,,pending,,Triage,Triage,AuthoriseException +17,triage,in_progress,none,event_assign_non_triage,unassigned_non_triage,yes,none,1.1,triage,,,pending,,Triage,Triage,AuthoriseException +18,triage,in_progress,none,event_assign_non_triage,unassigned_non_triage,no,none,1.1,triage,,,pending,,Triage,Triage,AuthoriseException +19,triage,in_progress,triage,action_edit,assigned_triage,yes,none,1.2,triage,,,in progress,in progress,Triage,Triage,no +20,triage,in_progress,triage,action_edit,assigned_triage,no,none,1.2,triage,,,in progress,in progress,Triage,Triage,no +21,triage,in_progress,triage,action_edit,admin,yes,none,1.2,triage,,,in progress,in progress,Triage,Triage,no +22,triage,in_progress,triage,action_edit,admin,no,none,1.2,triage,,,in progress,in progress,Triage,Triage,no +23,triage,in_progress,triage,action_edit,unassigned_triage,yes,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +24,triage,in_progress,triage,action_edit,unassigned_triage,no,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +25,triage,in_progress,triage,action_edit,unassigned_non_triage,yes,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +26,triage,in_progress,triage,action_edit,unassigned_non_triage,no,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +27,triage,in_progress,triage,event_unclaim,assigned_triage,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,no +28,triage,in_progress,triage,event_unclaim,assigned_triage,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,no +29,triage,in_progress,triage,event_unclaim,admin,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +30,triage,in_progress,triage,event_unclaim,admin,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +31,triage,in_progress,triage,event_unclaim,unassigned_triage,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +32,triage,in_progress,triage,event_unclaim,unassigned_triage,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +33,triage,in_progress,triage,event_unclaim,unassigned_non_triage,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +34,triage,in_progress,triage,event_unclaim,unassigned_non_triage,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +35,triage,in_progress,triage,event_unassign,assigned_triage,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +36,triage,in_progress,triage,event_unassign,assigned_triage,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +37,triage,in_progress,triage,event_unassign,admin,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,no +38,triage,in_progress,triage,event_unassign,admin,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,no +39,triage,in_progress,triage,event_unassign,unassigned_triage,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +40,triage,in_progress,triage,event_unassign,unassigned_triage,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +41,triage,in_progress,triage,event_unassign,unassigned_non_triage,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +42,triage,in_progress,triage,event_unassign,unassigned_non_triage,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +43,triage,in_progress,triage,event_reassign_triage,assigned_triage,yes,none,1.2,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +44,triage,in_progress,triage,event_reassign_triage,assigned_triage,no,none,1.2,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +45,triage,in_progress,triage,event_reassign_triage,admin,yes,none,1.2,triage,,assigned,in progress,in progress,Triage,Triage,no +46,triage,in_progress,triage,event_reassign_triage,admin,no,none,1.2,triage,in_progress,assigned,in progress,in progress,Triage,Triage,no +47,triage,in_progress,triage,event_reassign_triage,unassigned_triage,yes,none,1.2,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +48,triage,in_progress,triage,event_reassign_triage,unassigned_triage,no,none,1.2,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +49,triage,in_progress,triage,event_reassign_triage,unassigned_non_triage,yes,none,1.2,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +50,triage,in_progress,triage,event_reassign_triage,unassigned_non_triage,no,none,1.2,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +51,triage,in_progress,triage,event_reassign_non_triage,assigned_triage,yes,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +52,triage,in_progress,triage,event_reassign_non_triage,assigned_triage,no,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +53,triage,in_progress,triage,event_reassign_non_triage,admin,yes,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +54,triage,in_progress,triage,event_reassign_non_triage,admin,no,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +55,triage,in_progress,triage,event_reassign_non_triage,unassigned_triage,yes,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +56,triage,in_progress,triage,event_reassign_non_triage,unassigned_triage,no,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +57,triage,in_progress,triage,event_reassign_non_triage,unassigned_non_triage,yes,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +58,triage,in_progress,triage,event_reassign_non_triage,unassigned_non_triage,no,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +59,triage,in_progress,triage,event_minimal_review,assigned_triage,yes,none,1.2,triage,minimal_review,,in progress,in progress,Triage,Triage,no +60,triage,in_progress,triage,event_minimal_review,assigned_triage,no,none,1.2,triage,minimal_review,,in progress,in progress,Triage,Triage,no +61,triage,in_progress,triage,event_minimal_review,admin,yes,none,1.2,triage,minimal_review,,in progress,in progress,Triage,Triage,no +62,triage,in_progress,triage,event_minimal_review,admin,no,none,1.2,triage,minimal_review,,in progress,in progress,Triage,Triage,no +63,triage,in_progress,triage,event_minimal_review,unassigned_triage,yes,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +64,triage,in_progress,triage,event_minimal_review,unassigned_triage,no,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +65,triage,in_progress,triage,event_minimal_review,unassigned_non_triage,yes,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +66,triage,in_progress,triage,event_minimal_review,unassigned_non_triage,no,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +67,triage,in_progress,triage,event_fail,assigned_triage,yes,none,1.2,rejected,,none,in progress,rejected,Triage,none,no +68,triage,in_progress,triage,event_fail,assigned_triage,no,none,1.2,rejected,,none,in progress,rejected,Triage,none,no +69,triage,in_progress,triage,event_fail,admin,yes,none,1.2,triage,,none,in progress,rejected,Triage,none,AuthoriseException +70,triage,in_progress,triage,event_fail,admin,no,none,1.2,triage,,none,in progress,rejected,Triage,none,AuthoriseException +71,triage,in_progress,triage,event_fail,unassigned_triage,yes,none,1.2,triage,,none,in progress,rejected,Triage,none,AuthoriseException +72,triage,in_progress,triage,event_fail,unassigned_triage,no,none,1.2,triage,,none,in progress,rejected,Triage,none,AuthoriseException +73,triage,in_progress,triage,event_fail,unassigned_non_triage,yes,none,1.2,triage,,none,in progress,rejected,Triage,none,AuthoriseException +74,triage,in_progress,triage,event_fail,unassigned_non_triage,no,none,1.2,triage,,none,in progress,rejected,Triage,none,AuthoriseException +75,triage,in_progress,non_triage,action_edit,assigned_non_triage,yes,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +76,triage,in_progress,non_triage,action_edit,assigned_non_triage,no,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +77,triage,in_progress,non_triage,action_edit,admin,yes,none,1.2,triage,,,in progress,in progress,Triage,Triage,no +78,triage,in_progress,non_triage,action_edit,admin,no,none,1.2,triage,,,in progress,in progress,Triage,Triage,no +79,triage,in_progress,non_triage,action_edit,unassigned_triage,yes,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +80,triage,in_progress,non_triage,action_edit,unassigned_triage,no,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +81,triage,in_progress,non_triage,action_edit,unassigned_non_triage,yes,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +82,triage,in_progress,non_triage,action_edit,unassigned_non_triage,no,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +83,triage,in_progress,non_triage,event_unclaim,assigned_non_triage,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,no +84,triage,in_progress,non_triage,event_unclaim,assigned_non_triage,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,no +85,triage,in_progress,non_triage,event_unclaim,admin,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +86,triage,in_progress,non_triage,event_unclaim,admin,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +87,triage,in_progress,non_triage,event_unclaim,unassigned_triage,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +88,triage,in_progress,non_triage,event_unclaim,unassigned_triage,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +89,triage,in_progress,non_triage,event_unclaim,unassigned_non_triage,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +90,triage,in_progress,non_triage,event_unclaim,unassigned_non_triage,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +91,triage,in_progress,non_triage,event_unassign,assigned_non_triage,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +92,triage,in_progress,non_triage,event_unassign,assigned_non_triage,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +93,triage,in_progress,non_triage,event_unassign,admin,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,no +94,triage,in_progress,non_triage,event_unassign,admin,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,no +95,triage,in_progress,non_triage,event_unassign,unassigned_triage,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +96,triage,in_progress,non_triage,event_unassign,unassigned_triage,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +97,triage,in_progress,non_triage,event_unassign,unassigned_non_triage,yes,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +98,triage,in_progress,non_triage,event_unassign,unassigned_non_triage,no,none,1.2,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +99,triage,in_progress,non_triage,event_reassign_triage,assigned_non_triage,yes,none,1.2,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +100,triage,in_progress,non_triage,event_reassign_triage,assigned_non_triage,no,none,1.2,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +101,triage,in_progress,non_triage,event_reassign_triage,admin,yes,none,1.2,triage,,assigned,in progress,in progress,Triage,Triage,no +102,triage,in_progress,non_triage,event_reassign_triage,admin,no,none,1.2,triage,in_progress,assigned,in progress,in progress,Triage,Triage,no +103,triage,in_progress,non_triage,event_reassign_triage,unassigned_triage,yes,none,1.2,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +104,triage,in_progress,non_triage,event_reassign_triage,unassigned_triage,no,none,1.2,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +105,triage,in_progress,non_triage,event_reassign_triage,unassigned_non_triage,yes,none,1.2,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +106,triage,in_progress,non_triage,event_reassign_triage,unassigned_non_triage,no,none,1.2,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +107,triage,in_progress,non_triage,event_reassign_non_triage,assigned_non_triage,yes,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +108,triage,in_progress,non_triage,event_reassign_non_triage,assigned_non_triage,no,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +109,triage,in_progress,non_triage,event_reassign_non_triage,admin,yes,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +110,triage,in_progress,non_triage,event_reassign_non_triage,admin,no,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +111,triage,in_progress,non_triage,event_reassign_non_triage,unassigned_triage,yes,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +112,triage,in_progress,non_triage,event_reassign_non_triage,unassigned_triage,no,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +113,triage,in_progress,non_triage,event_reassign_non_triage,unassigned_non_triage,yes,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +114,triage,in_progress,non_triage,event_reassign_non_triage,unassigned_non_triage,no,none,1.2,triage,,,in progress,,Triage,Triage,AuthoriseException +115,triage,in_progress,non_triage,event_minimal_review,assigned_non_triage,yes,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +116,triage,in_progress,non_triage,event_minimal_review,assigned_non_triage,no,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +117,triage,in_progress,non_triage,event_minimal_review,admin,yes,none,1.2,triage,minimal_review,,in progress,in progress,Triage,Triage,no +118,triage,in_progress,non_triage,event_minimal_review,admin,no,none,1.2,triage,minimal_review,,in progress,in progress,Triage,Triage,no +119,triage,in_progress,non_triage,event_minimal_review,unassigned_triage,yes,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +120,triage,in_progress,non_triage,event_minimal_review,unassigned_triage,no,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +121,triage,in_progress,non_triage,event_minimal_review,unassigned_non_triage,yes,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +122,triage,in_progress,non_triage,event_minimal_review,unassigned_non_triage,no,none,1.2,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +123,triage,in_progress,non_triage,event_fail,assigned_non_triage,yes,none,1.2,triage,,none,in progress,rejected,Triage,none,AuthoriseException +124,triage,in_progress,non_triage,event_fail,assigned_non_triage,no,none,1.2,triage,,none,in progress,rejected,Triage,none,AuthoriseException +125,triage,in_progress,non_triage,event_fail,admin,yes,none,1.2,triage,,none,in progress,rejected,Triage,none,AuthoriseException +126,triage,in_progress,non_triage,event_fail,admin,no,none,1.2,triage,,none,in progress,rejected,Triage,none,AuthoriseException +127,triage,in_progress,non_triage,event_fail,unassigned_triage,yes,none,1.2,triage,,none,in progress,rejected,Triage,none,AuthoriseException +128,triage,in_progress,non_triage,event_fail,unassigned_triage,no,none,1.2,triage,,none,in progress,rejected,Triage,none,AuthoriseException +129,triage,in_progress,non_triage,event_fail,unassigned_non_triage,yes,none,1.2,triage,,none,in progress,rejected,Triage,none,AuthoriseException +130,triage,in_progress,non_triage,event_fail,unassigned_non_triage,no,none,1.2,triage,,none,in progress,rejected,Triage,none,AuthoriseException +131,triage,minimal_review,none,event_claim,admin,yes,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +132,triage,minimal_review,none,event_claim,admin,no,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +133,triage,minimal_review,none,event_claim,unassigned_triage,yes,none,1.1,triage,minimal_review,assigned,pending,in progress,Triage,Triage,no +134,triage,minimal_review,none,event_claim,unassigned_triage,no,none,1.1,triage,in_progress,assigned,pending,in progress,Triage,Triage,no +135,triage,minimal_review,none,event_claim,unassigned_non_triage,yes,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +136,triage,minimal_review,none,event_claim,unassigned_non_triage,no,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +137,triage,minimal_review,none,event_assign_triage,admin,yes,none,1.1,triage,minimal_review,assigned,pending,in progress,Triage,Triage,no +138,triage,minimal_review,none,event_assign_triage,admin,no,none,1.1,triage,in_progress,assigned,pending,in progress,Triage,Triage,no +139,triage,minimal_review,none,event_assign_triage,unassigned_triage,yes,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +140,triage,minimal_review,none,event_assign_triage,unassigned_triage,no,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +141,triage,minimal_review,none,event_assign_triage,unassigned_non_triage,yes,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +142,triage,minimal_review,none,event_assign_triage,unassigned_non_triage,no,none,1.1,triage,,assigned,pending,in progress,Triage,Triage,AuthoriseException +143,triage,minimal_review,none,event_assign_non_triage,admin,yes,none,1.1,triage,,,pending,,Triage,Triage,AuthoriseException +144,triage,minimal_review,none,event_assign_non_triage,admin,no,none,1.1,triage,,,pending,,Triage,Triage,AuthoriseException +145,triage,minimal_review,none,event_assign_non_triage,unassigned_triage,yes,none,1.1,triage,,,pending,,Triage,Triage,AuthoriseException +146,triage,minimal_review,none,event_assign_non_triage,unassigned_triage,no,none,1.1,triage,,,pending,,Triage,Triage,AuthoriseException +147,triage,minimal_review,none,event_assign_non_triage,unassigned_non_triage,yes,none,1.1,triage,,,pending,,Triage,Triage,AuthoriseException +148,triage,minimal_review,none,event_assign_non_triage,unassigned_non_triage,no,none,1.1,triage,,,pending,,Triage,Triage,AuthoriseException +149,triage,minimal_review,triage,action_edit,assigned_triage,yes,none,1.3,triage,,,in progress,in progress,Triage,Triage,no +150,triage,minimal_review,triage,action_edit,assigned_triage,no,none,1.3,triage,,,in progress,in progress,Triage,Triage,no +151,triage,minimal_review,triage,action_edit,admin,yes,none,1.3,triage,,,in progress,in progress,Triage,Triage,no +152,triage,minimal_review,triage,action_edit,admin,no,none,1.3,triage,,,in progress,in progress,Triage,Triage,no +153,triage,minimal_review,triage,action_edit,unassigned_triage,yes,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +154,triage,minimal_review,triage,action_edit,unassigned_triage,no,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +155,triage,minimal_review,triage,action_edit,unassigned_non_triage,yes,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +156,triage,minimal_review,triage,action_edit,unassigned_non_triage,no,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +157,triage,minimal_review,triage,event_unclaim,assigned_triage,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,no +158,triage,minimal_review,triage,event_unclaim,assigned_triage,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,no +159,triage,minimal_review,triage,event_unclaim,admin,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +160,triage,minimal_review,triage,event_unclaim,admin,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +161,triage,minimal_review,triage,event_unclaim,unassigned_triage,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +162,triage,minimal_review,triage,event_unclaim,unassigned_triage,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +163,triage,minimal_review,triage,event_unclaim,unassigned_non_triage,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +164,triage,minimal_review,triage,event_unclaim,unassigned_non_triage,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +165,triage,minimal_review,triage,event_unassign,assigned_triage,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +166,triage,minimal_review,triage,event_unassign,assigned_triage,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +167,triage,minimal_review,triage,event_unassign,admin,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,no +168,triage,minimal_review,triage,event_unassign,admin,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,no +169,triage,minimal_review,triage,event_unassign,unassigned_triage,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +170,triage,minimal_review,triage,event_unassign,unassigned_triage,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +171,triage,minimal_review,triage,event_unassign,unassigned_non_triage,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +172,triage,minimal_review,triage,event_unassign,unassigned_non_triage,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +173,triage,minimal_review,triage,event_reassign_triage,assigned_triage,yes,none,1.3,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +174,triage,minimal_review,triage,event_reassign_triage,assigned_triage,no,none,1.3,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +175,triage,minimal_review,triage,event_reassign_triage,admin,yes,none,1.3,triage,minimal_review,assigned,in progress,in progress,Triage,Triage,no +176,triage,minimal_review,triage,event_reassign_triage,admin,no,none,1.3,triage,,assigned,in progress,in progress,Triage,Triage,no +177,triage,minimal_review,triage,event_reassign_triage,unassigned_triage,yes,none,1.3,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +178,triage,minimal_review,triage,event_reassign_triage,unassigned_triage,no,none,1.3,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +179,triage,minimal_review,triage,event_reassign_triage,unassigned_non_triage,yes,none,1.3,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +180,triage,minimal_review,triage,event_reassign_triage,unassigned_non_triage,no,none,1.3,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +181,triage,minimal_review,triage,event_reassign_non_triage,assigned_triage,yes,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +182,triage,minimal_review,triage,event_reassign_non_triage,assigned_triage,no,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +183,triage,minimal_review,triage,event_reassign_non_triage,admin,yes,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +184,triage,minimal_review,triage,event_reassign_non_triage,admin,no,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +185,triage,minimal_review,triage,event_reassign_non_triage,unassigned_triage,yes,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +186,triage,minimal_review,triage,event_reassign_non_triage,unassigned_triage,no,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +187,triage,minimal_review,triage,event_reassign_non_triage,unassigned_non_triage,yes,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +188,triage,minimal_review,triage,event_reassign_non_triage,unassigned_non_triage,no,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +189,triage,minimal_review,triage,event_fail,assigned_triage,yes,none,1.3,rejected,,none,in progress,rejected,Triage,none,no +190,triage,minimal_review,triage,event_fail,assigned_triage,no,none,1.3,rejected,,none,in progress,rejected,Triage,none,no +191,triage,minimal_review,triage,event_fail,admin,yes,none,1.3,triage,,none,in progress,rejected,Triage,none,AuthoriseException +192,triage,minimal_review,triage,event_fail,admin,no,none,1.3,triage,,none,in progress,rejected,Triage,none,AuthoriseException +193,triage,minimal_review,triage,event_fail,unassigned_triage,yes,none,1.3,triage,,none,in progress,rejected,Triage,none,AuthoriseException +194,triage,minimal_review,triage,event_fail,unassigned_triage,no,none,1.3,triage,,none,in progress,rejected,Triage,none,AuthoriseException +195,triage,minimal_review,triage,event_fail,unassigned_non_triage,yes,none,1.3,triage,,none,in progress,rejected,Triage,none,AuthoriseException +196,triage,minimal_review,triage,event_fail,unassigned_non_triage,no,none,1.3,triage,,none,in progress,rejected,Triage,none,AuthoriseException +197,triage,minimal_review,triage,event_rescind_minimal_review,assigned_triage,yes,none,1.3,triage,in_progress,,in progress,in progress,Triage,Triage,no +198,triage,minimal_review,triage,event_rescind_minimal_review,assigned_triage,no,none,1.3,triage,in_progress,,in progress,in progress,Triage,Triage,no +199,triage,minimal_review,triage,event_rescind_minimal_review,admin,yes,none,1.3,triage,in_progress,,in progress,in progress,Triage,Triage,no +200,triage,minimal_review,triage,event_rescind_minimal_review,admin,no,none,1.3,triage,in_progress,,in progress,in progress,Triage,Triage,no +201,triage,minimal_review,triage,event_rescind_minimal_review,unassigned_triage,yes,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +202,triage,minimal_review,triage,event_rescind_minimal_review,unassigned_triage,no,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +203,triage,minimal_review,triage,event_rescind_minimal_review,unassigned_non_triage,yes,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +204,triage,minimal_review,triage,event_rescind_minimal_review,unassigned_non_triage,no,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +205,triage,minimal_review,triage,event_triaged,assigned_triage,yes,quick_fail,1.3,quick_fail,,none,in progress,in progress,Triage,none,no +206,triage,minimal_review,triage,event_triaged,assigned_triage,yes,quality_review,1.3,quality_review,,none,in progress,in progress,Triage,none,no +207,triage,minimal_review,triage,event_triaged,admin,yes,quick_fail,1.3,triage,,none,in progress,in progress,Triage,none,AuthoriseException +208,triage,minimal_review,triage,event_triaged,admin,yes,quality_review,1.3,triage,,none,in progress,in progress,Triage,none,AuthoriseException +209,triage,minimal_review,triage,event_triaged,unassigned_triage,yes,quick_fail,1.3,triage,,none,in progress,in progress,Triage,none,AuthoriseException +210,triage,minimal_review,triage,event_triaged,unassigned_triage,yes,quality_review,1.3,triage,,none,in progress,in progress,Triage,none,AuthoriseException +211,triage,minimal_review,triage,event_triaged,unassigned_non_triage,yes,quick_fail,1.3,triage,,none,in progress,in progress,Triage,none,AuthoriseException +212,triage,minimal_review,triage,event_triaged,unassigned_non_triage,yes,quality_review,1.3,triage,,none,in progress,in progress,Triage,none,AuthoriseException +213,triage,minimal_review,non_triage,action_edit,assigned_non_triage,yes,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +214,triage,minimal_review,non_triage,action_edit,assigned_non_triage,no,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +215,triage,minimal_review,non_triage,action_edit,admin,yes,none,1.3,triage,,,in progress,in progress,Triage,Triage,no +216,triage,minimal_review,non_triage,action_edit,admin,no,none,1.3,triage,,,in progress,in progress,Triage,Triage,no +217,triage,minimal_review,non_triage,action_edit,unassigned_triage,yes,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +218,triage,minimal_review,non_triage,action_edit,unassigned_triage,no,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +219,triage,minimal_review,non_triage,action_edit,unassigned_non_triage,yes,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +220,triage,minimal_review,non_triage,action_edit,unassigned_non_triage,no,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +221,triage,minimal_review,non_triage,event_unclaim,assigned_non_triage,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,no +222,triage,minimal_review,non_triage,event_unclaim,assigned_non_triage,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,no +223,triage,minimal_review,non_triage,event_unclaim,admin,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +224,triage,minimal_review,non_triage,event_unclaim,admin,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +225,triage,minimal_review,non_triage,event_unclaim,unassigned_triage,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +226,triage,minimal_review,non_triage,event_unclaim,unassigned_triage,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +227,triage,minimal_review,non_triage,event_unclaim,unassigned_non_triage,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +228,triage,minimal_review,non_triage,event_unclaim,unassigned_non_triage,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +229,triage,minimal_review,non_triage,event_unassign,assigned_non_triage,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +230,triage,minimal_review,non_triage,event_unassign,assigned_non_triage,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +231,triage,minimal_review,non_triage,event_unassign,admin,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,no +232,triage,minimal_review,non_triage,event_unassign,admin,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,no +233,triage,minimal_review,non_triage,event_unassign,unassigned_triage,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +234,triage,minimal_review,non_triage,event_unassign,unassigned_triage,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +235,triage,minimal_review,non_triage,event_unassign,unassigned_non_triage,yes,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +236,triage,minimal_review,non_triage,event_unassign,unassigned_non_triage,no,none,1.3,triage,,none,in progress,pending,Triage,Triage,AuthoriseException +237,triage,minimal_review,non_triage,event_reassign_triage,assigned_non_triage,yes,none,1.3,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +238,triage,minimal_review,non_triage,event_reassign_triage,assigned_non_triage,no,none,1.3,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +239,triage,minimal_review,non_triage,event_reassign_triage,admin,yes,none,1.3,triage,minimal_review,assigned,in progress,in progress,Triage,Triage,no +240,triage,minimal_review,non_triage,event_reassign_triage,admin,no,none,1.3,triage,,assigned,in progress,in progress,Triage,Triage,no +241,triage,minimal_review,non_triage,event_reassign_triage,unassigned_triage,yes,none,1.3,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +242,triage,minimal_review,non_triage,event_reassign_triage,unassigned_triage,no,none,1.3,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +243,triage,minimal_review,non_triage,event_reassign_triage,unassigned_non_triage,yes,none,1.3,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +244,triage,minimal_review,non_triage,event_reassign_triage,unassigned_non_triage,no,none,1.3,triage,,assigned,in progress,in progress,Triage,Triage,AuthoriseException +245,triage,minimal_review,non_triage,event_reassign_non_triage,assigned_non_triage,yes,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +246,triage,minimal_review,non_triage,event_reassign_non_triage,assigned_non_triage,no,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +247,triage,minimal_review,non_triage,event_reassign_non_triage,admin,yes,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +248,triage,minimal_review,non_triage,event_reassign_non_triage,admin,no,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +249,triage,minimal_review,non_triage,event_reassign_non_triage,unassigned_triage,yes,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +250,triage,minimal_review,non_triage,event_reassign_non_triage,unassigned_triage,no,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +251,triage,minimal_review,non_triage,event_reassign_non_triage,unassigned_non_triage,yes,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +252,triage,minimal_review,non_triage,event_reassign_non_triage,unassigned_non_triage,no,none,1.3,triage,,,in progress,,Triage,Triage,AuthoriseException +253,triage,minimal_review,non_triage,event_fail,assigned_non_triage,yes,none,1.3,triage,,none,in progress,rejected,Triage,none,AuthoriseException +254,triage,minimal_review,non_triage,event_fail,assigned_non_triage,no,none,1.3,triage,,none,in progress,rejected,Triage,none,AuthoriseException +255,triage,minimal_review,non_triage,event_fail,admin,yes,none,1.3,triage,,none,in progress,rejected,Triage,none,AuthoriseException +256,triage,minimal_review,non_triage,event_fail,admin,no,none,1.3,triage,,none,in progress,rejected,Triage,none,AuthoriseException +257,triage,minimal_review,non_triage,event_fail,unassigned_triage,yes,none,1.3,triage,,none,in progress,rejected,Triage,none,AuthoriseException +258,triage,minimal_review,non_triage,event_fail,unassigned_triage,no,none,1.3,triage,,none,in progress,rejected,Triage,none,AuthoriseException +259,triage,minimal_review,non_triage,event_fail,unassigned_non_triage,yes,none,1.3,triage,,none,in progress,rejected,Triage,none,AuthoriseException +260,triage,minimal_review,non_triage,event_fail,unassigned_non_triage,no,none,1.3,triage,,none,in progress,rejected,Triage,none,AuthoriseException +261,triage,minimal_review,non_triage,event_rescind_minimal_review,assigned_non_triage,yes,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +262,triage,minimal_review,non_triage,event_rescind_minimal_review,assigned_non_triage,no,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +263,triage,minimal_review,non_triage,event_rescind_minimal_review,admin,yes,none,1.3,triage,in_progress,,in progress,in progress,Triage,Triage,no +264,triage,minimal_review,non_triage,event_rescind_minimal_review,admin,no,none,1.3,triage,in_progress,,in progress,in progress,Triage,Triage,no +265,triage,minimal_review,non_triage,event_rescind_minimal_review,unassigned_triage,yes,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +266,triage,minimal_review,non_triage,event_rescind_minimal_review,unassigned_triage,no,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +267,triage,minimal_review,non_triage,event_rescind_minimal_review,unassigned_non_triage,yes,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +268,triage,minimal_review,non_triage,event_rescind_minimal_review,unassigned_non_triage,no,none,1.3,triage,,,in progress,in progress,Triage,Triage,AuthoriseException +269,triage,minimal_review,non_triage,event_triaged,assigned_non_triage,yes,quick_fail,1.3,triage,,none,in progress,in progress,Triage,none,AuthoriseException +270,triage,minimal_review,non_triage,event_triaged,assigned_non_triage,yes,quality_review,1.3,triage,,none,in progress,in progress,Triage,none,AuthoriseException +271,triage,minimal_review,non_triage,event_triaged,admin,yes,quick_fail,1.3,triage,,none,in progress,in progress,Triage,none,AuthoriseException +272,triage,minimal_review,non_triage,event_triaged,admin,yes,quality_review,1.3,triage,,none,in progress,in progress,Triage,none,AuthoriseException +273,triage,minimal_review,non_triage,event_triaged,unassigned_triage,yes,quick_fail,1.3,triage,,none,in progress,in progress,Triage,none,AuthoriseException +274,triage,minimal_review,non_triage,event_triaged,unassigned_triage,yes,quality_review,1.3,triage,,none,in progress,in progress,Triage,none,AuthoriseException +275,triage,minimal_review,non_triage,event_triaged,unassigned_non_triage,yes,quick_fail,1.3,triage,,none,in progress,in progress,Triage,none,AuthoriseException +276,triage,minimal_review,non_triage,event_triaged,unassigned_non_triage,yes,quality_review,1.3,triage,,none,in progress,in progress,Triage,none,AuthoriseException diff --git a/doajtest/matrices/triage_workflow/triage_workflow.settings.csv b/doajtest/matrices/triage_workflow/triage_workflow.settings.csv new file mode 100644 index 0000000000..20d3d14c4c --- /dev/null +++ b/doajtest/matrices/triage_workflow/triage_workflow.settings.csv @@ -0,0 +1,78 @@ +field,test_id,module,stage,reviewer,action,actor,has_minimal_review,label,state_id,result_module,result_stage,result_reviewer,initial_legacy_status,result_legacy_status,initial_legacy_eg,result_legacy_eg,error +type,index,generated,generated,generated,generated,generated,generated,generated,conditional,conditional,conditional,conditional,conditional,conditional,conditional,conditional,conditional +default,,,,,,,,,,triage,,,,,Triage,Triage,no +,,,,,,,,,,,,,,,,, +values,,triage,in_progress,none,action_edit,assigned_triage,yes,none,1.1,triage,in_progress,none,pending,pending,Triage,Triage,no +values,,,minimal_review,triage,event_claim,assigned_non_triage,no,quick_fail,1.2,quick_fail,minimal_review,assigned,in progress,in progress,,none,AuthoriseException +values,,,,non_triage,event_assign_triage,admin,,quality_review,1.3,quality_review,,,,,,, +values,,,,,event_assign_non_triage,unassigned_triage,,,,rejected,,,,,,, +values,,,,,event_unclaim,unassigned_non_triage,,,,,,,,,,, +values,,,,,event_unassign,,,,,,,,,,,, +values,,,,,event_reassign_triage,,,,,,,,,,,, +values,,,,,event_reassign_non_triage,,,,,,,,,,,, +values,,,,,event_minimal_review,,,,,,,,,,,, +values,,,,,event_fail,,,,,,,,,,,, +values,,,,,event_rescind_minimal_review,,,,,,,,,,,, +values,,,,,event_triaged,,,,,,,,,,,, +,,,,,,,,,,,,,,,,, +constraint action,,,,!none,action_edit,,,,,,,,,,,, +constraint action,,,,none,event_claim,,,,,,,,,,,, +constraint action,,,,none,event_assign_triage,,,,,,,,,,,, +constraint action,,,,none,event_assign_non_triage,,,,,,,,,,,, +constraint action,,,,!none,event_unclaim,,,,,,,,,,,, +constraint action,,,,!none,event_unassign,,,,,,,,,,,, +constraint action,,,,!none,event_reassign_triage,,,,,,,,,,,, +constraint action,,,,!none,event_reassign_non_triage,,,,,,,,,,,, +constraint action,,,in_progress,!none,event_minimal_review,,,,,,,,,,,, +constraint action,,,,!none,event_fail,,,,,,,,,,,, +constraint action,,,minimal_review,!none,event_rescind_minimal_review,,,,,,,,,,,, +constraint action,,,minimal_review,!none,event_triaged,,yes,!none,,,,,,,,, +,,,,,,,,,,,,,,,,, +constraint actor,,,,triage,,assigned_triage,,,,,,,,,,, +constraint actor,,,,non_triage,,assigned_non_triage,,,,,,,,,,, +,,,,,,,,,,,,,,,,, +constraint label,,,,,event_triaged,,,quick_fail,,,,,,,,, +constraint label,,,,,event_triaged,,,quality_review,,,,,,,,, +,,,,,,,,,,,,,,,,, +conditional state_id,,triage,*,none,,,,,1.1,,,,,,,, +conditional state_id,,triage,in_progress,!none,,,,,1.2,,,,,,,, +conditional state_id,,triage,minimal_review,!none,,,,,1.3,,,,,,,, +,,triage,,,,,,,,,,,,,,, +conditional result_module,,triage,minimal_review,!none,event_triaged,assigned_triage,yes,quick_fail,,quick_fail,,,,,,, +conditional result_module,,triage,minimal_review,!none,event_triaged,assigned_triage,yes,quality_review,,quality_review,,,,,,, +conditional result_module,,triage,,!none,event_fail,assigned_triage,,,,rejected,,,,,,, +,,triage,,,,,,,,,,,,,,, +conditional result_stage,,triage,,none,event_claim,unassigned_triage,no,,,,in_progress,,,,,, +conditional result_stage,,triage,,none,event_assign_triage,admin,no,,,,in_progress,,,,,, +conditional result_stage,,triage,in_progress,,event_reassign_triage,admin,no,,,,in_progress,,,,,, +conditional result_stage,,triage,minimal_review,,event_rescind_minimal_review,assigned_triage|admin,,,,,in_progress,,,,,, +conditional result_stage,,triage,,none,event_claim,unassigned_triage,yes,,,,minimal_review,,,,,, +conditional result_stage,,triage,,none,event_assign_triage,admin,yes,,,,minimal_review,,,,,, +conditional result_stage,,triage,in_progress,,event_minimal_review,assigned_triage|admin,,,,,minimal_review,,,,,, +conditional result_stage,,triage,minimal_review,,event_reassign_triage,admin,yes,,,,minimal_review,,,,,, +,,,,,,,,,,,,,,,,, +conditional result_reviewer,,,,,event_unclaim|event_unassign|event_fail|event_triaged,,,,,,,none,,,,, +conditional result_reviewer,,,,,event_claim|event_assign_triage|event_reassign_triage,,,,,,,assigned,,,,, +,,,,,,,,,,,,,,,,, +conditional initial_legacy_status,,,,none,,,,,,,,,pending,,,, +conditional initial_legacy_status,,,,!none,,,,,,,,,in progress,,,, +,,,,,,,,,,,,,,,,, +conditional result_legacy_status,,,,,event_unclaim|event_unassign,,,,,,,,,pending,,, +conditional result_legacy_status,,,,,event_claim|event_assign_triage|event_reassign_triage|event_rescind_minimal_review|event_minimal_review|event_triaged,,,,,,,,,in progress,,, +conditional result_legacy_status,,,,,action_edit,,,,,,,,,in progress,,, +conditional result_legacy_status,,,,,event_fail,,,,,,,,,rejected,,, +,,,,,,,,,,,,,,,,, +conditional result_legacy_eg,,,,,event_fail|event_triaged,,,,,,,,,,,none, +,,,,,,,,,,,,,,,,, +conditional error,,,,,event_claim,unassigned_non_triage|admin,,,,,,,,,,,AuthoriseException +conditional error,,,,,event_assign_triage,!admin,,,,,,,,,,,AuthoriseException +conditional error,,,,,event_assign_non_triage,,,,,,,,,,,,AuthoriseException +conditional error,,,,,action_edit,assigned_non_triage|unassigned_triage|unassigned_non_triage,,,,,,,,,,,AuthoriseException +conditional error,,,,,event_unclaim,admin|unassigned_triage|unassigned_non_triage,,,,,,,,,,,AuthoriseException +conditional error,,,,,event_unassign,!admin,,,,,,,,,,,AuthoriseException +conditional error,,,,,event_reassign_triage,!admin,,,,,,,,,,,AuthoriseException +conditional error,,,,,event_reassign_non_triage,,,,,,,,,,,,AuthoriseException +conditional error,,,,,event_minimal_review,assigned_non_triage|unassigned_triage|unassigned_non_triage,,,,,,,,,,,AuthoriseException +conditional error,,,,,event_fail,!assigned_triage,,,,,,,,,,,AuthoriseException +conditional error,,,,,event_rescind_minimal_review,assigned_non_triage|unassigned_triage|unassigned_non_triage,,,,,,,,,,,AuthoriseException +conditional error,,,,,event_triaged,!assigned_triage,,,,,,,,,,,AuthoriseException \ No newline at end of file diff --git a/doajtest/matrices/triage_workflow/triage_workflow.settings.json b/doajtest/matrices/triage_workflow/triage_workflow.settings.json new file mode 100644 index 0000000000..09d55c90b0 --- /dev/null +++ b/doajtest/matrices/triage_workflow/triage_workflow.settings.json @@ -0,0 +1,934 @@ +{ + "parameters": [ + { + "name": "test_id", + "type": "index" + }, + { + "name": "module", + "type": "generated", + "values": { + "triage": {} + } + }, + { + "name": "stage", + "type": "generated", + "values": { + "in_progress": {}, + "minimal_review": {} + } + }, + { + "name": "reviewer", + "type": "generated", + "values": { + "none": {}, + "triage": {}, + "non_triage": {} + } + }, + { + "name": "action", + "type": "generated", + "values": { + "action_edit": { + "constraints": { + "reviewer": { + "nor": [ + "none" + ] + } + } + }, + "event_claim": { + "constraints": { + "reviewer": { + "or": [ + "none" + ] + } + } + }, + "event_assign_triage": { + "constraints": { + "reviewer": { + "or": [ + "none" + ] + } + } + }, + "event_assign_non_triage": { + "constraints": { + "reviewer": { + "or": [ + "none" + ] + } + } + }, + "event_unclaim": { + "constraints": { + "reviewer": { + "nor": [ + "none" + ] + } + } + }, + "event_unassign": { + "constraints": { + "reviewer": { + "nor": [ + "none" + ] + } + } + }, + "event_reassign_triage": { + "constraints": { + "reviewer": { + "nor": [ + "none" + ] + } + } + }, + "event_reassign_non_triage": { + "constraints": { + "reviewer": { + "nor": [ + "none" + ] + } + } + }, + "event_minimal_review": { + "constraints": { + "stage": { + "or": [ + "in_progress" + ] + }, + "reviewer": { + "nor": [ + "none" + ] + } + } + }, + "event_fail": { + "constraints": { + "reviewer": { + "nor": [ + "none" + ] + } + } + }, + "event_rescind_minimal_review": { + "constraints": { + "stage": { + "or": [ + "minimal_review" + ] + }, + "reviewer": { + "nor": [ + "none" + ] + } + } + }, + "event_triaged": { + "constraints": { + "stage": { + "or": [ + "minimal_review" + ] + }, + "reviewer": { + "nor": [ + "none" + ] + }, + "has_minimal_review": { + "or": [ + "yes" + ] + }, + "label": { + "nor": [ + "none" + ] + } + } + } + } + }, + { + "name": "actor", + "type": "generated", + "values": { + "assigned_triage": { + "constraints": { + "reviewer": { + "or": [ + "triage" + ] + } + } + }, + "assigned_non_triage": { + "constraints": { + "reviewer": { + "or": [ + "non_triage" + ] + } + } + }, + "admin": {}, + "unassigned_triage": {}, + "unassigned_non_triage": {} + } + }, + { + "name": "has_minimal_review", + "type": "generated", + "values": { + "yes": {}, + "no": {} + } + }, + { + "name": "label", + "type": "generated", + "values": { + "none": {}, + "quick_fail": { + "constraints": { + "action": { + "or": [ + "event_triaged" + ] + } + } + }, + "quality_review": { + "constraints": { + "action": { + "or": [ + "event_triaged" + ] + } + } + } + } + }, + { + "name": "state_id", + "type": "conditional", + "default": "", + "values": { + "1.1": { + "conditions": [ + { + "module": { + "or": [ + "triage" + ] + }, + "reviewer": { + "or": [ + "none" + ] + } + } + ] + }, + "1.2": { + "conditions": [ + { + "module": { + "or": [ + "triage" + ] + }, + "stage": { + "or": [ + "in_progress" + ] + }, + "reviewer": { + "nor": [ + "none" + ] + } + } + ] + }, + "1.3": { + "conditions": [ + { + "module": { + "or": [ + "triage" + ] + }, + "stage": { + "or": [ + "minimal_review" + ] + }, + "reviewer": { + "nor": [ + "none" + ] + } + } + ] + } + } + }, + { + "name": "result_module", + "type": "conditional", + "default": "triage", + "values": { + "triage": {}, + "quick_fail": { + "conditions": [ + { + "module": { + "or": [ + "triage" + ] + }, + "stage": { + "or": [ + "minimal_review" + ] + }, + "reviewer": { + "nor": [ + "none" + ] + }, + "action": { + "or": [ + "event_triaged" + ] + }, + "actor": { + "or": [ + "assigned_triage" + ] + }, + "has_minimal_review": { + "or": [ + "yes" + ] + }, + "label": { + "or": [ + "quick_fail" + ] + } + } + ] + }, + "quality_review": { + "conditions": [ + { + "module": { + "or": [ + "triage" + ] + }, + "stage": { + "or": [ + "minimal_review" + ] + }, + "reviewer": { + "nor": [ + "none" + ] + }, + "action": { + "or": [ + "event_triaged" + ] + }, + "actor": { + "or": [ + "assigned_triage" + ] + }, + "has_minimal_review": { + "or": [ + "yes" + ] + }, + "label": { + "or": [ + "quality_review" + ] + } + } + ] + }, + "rejected": { + "conditions": [ + { + "module": { + "or": [ + "triage" + ] + }, + "reviewer": { + "nor": [ + "none" + ] + }, + "action": { + "or": [ + "event_fail" + ] + }, + "actor": { + "or": [ + "assigned_triage" + ] + } + } + ] + } + } + }, + { + "name": "result_stage", + "type": "conditional", + "default": "", + "values": { + "in_progress": { + "conditions": [ + { + "module": { + "or": [ + "triage" + ] + }, + "reviewer": { + "or": [ + "none" + ] + }, + "action": { + "or": [ + "event_claim" + ] + }, + "actor": { + "or": [ + "unassigned_triage" + ] + }, + "has_minimal_review": { + "or": [ + "no" + ] + } + }, + { + "module": { + "or": [ + "triage" + ] + }, + "reviewer": { + "or": [ + "none" + ] + }, + "action": { + "or": [ + "event_assign_triage" + ] + }, + "actor": { + "or": [ + "admin" + ] + }, + "has_minimal_review": { + "or": [ + "no" + ] + } + }, + { + "module": { + "or": [ + "triage" + ] + }, + "stage": { + "or": [ + "in_progress" + ] + }, + "action": { + "or": [ + "event_reassign_triage" + ] + }, + "actor": { + "or": [ + "admin" + ] + }, + "has_minimal_review": { + "or": [ + "no" + ] + } + }, + { + "module": { + "or": [ + "triage" + ] + }, + "stage": { + "or": [ + "minimal_review" + ] + }, + "action": { + "or": [ + "event_rescind_minimal_review" + ] + }, + "actor": { + "or": [ + "assigned_triage", + "admin" + ] + } + } + ] + }, + "minimal_review": { + "conditions": [ + { + "module": { + "or": [ + "triage" + ] + }, + "reviewer": { + "or": [ + "none" + ] + }, + "action": { + "or": [ + "event_claim" + ] + }, + "actor": { + "or": [ + "unassigned_triage" + ] + }, + "has_minimal_review": { + "or": [ + "yes" + ] + } + }, + { + "module": { + "or": [ + "triage" + ] + }, + "reviewer": { + "or": [ + "none" + ] + }, + "action": { + "or": [ + "event_assign_triage" + ] + }, + "actor": { + "or": [ + "admin" + ] + }, + "has_minimal_review": { + "or": [ + "yes" + ] + } + }, + { + "module": { + "or": [ + "triage" + ] + }, + "stage": { + "or": [ + "in_progress" + ] + }, + "action": { + "or": [ + "event_minimal_review" + ] + }, + "actor": { + "or": [ + "assigned_triage", + "admin" + ] + } + }, + { + "module": { + "or": [ + "triage" + ] + }, + "stage": { + "or": [ + "minimal_review" + ] + }, + "action": { + "or": [ + "event_reassign_triage" + ] + }, + "actor": { + "or": [ + "admin" + ] + }, + "has_minimal_review": { + "or": [ + "yes" + ] + } + } + ] + } + } + }, + { + "name": "result_reviewer", + "type": "conditional", + "default": "", + "values": { + "none": { + "conditions": [ + { + "action": { + "or": [ + "event_unclaim", + "event_unassign", + "event_fail", + "event_triaged" + ] + } + } + ] + }, + "assigned": { + "conditions": [ + { + "action": { + "or": [ + "event_claim", + "event_assign_triage", + "event_reassign_triage" + ] + } + } + ] + } + } + }, + { + "name": "initial_legacy_status", + "type": "conditional", + "default": "", + "values": { + "pending": { + "conditions": [ + { + "reviewer": { + "or": [ + "none" + ] + } + } + ] + }, + "in progress": { + "conditions": [ + { + "reviewer": { + "nor": [ + "none" + ] + } + } + ] + } + } + }, + { + "name": "result_legacy_status", + "type": "conditional", + "default": "", + "values": { + "pending": { + "conditions": [ + { + "action": { + "or": [ + "event_unclaim", + "event_unassign" + ] + } + } + ] + }, + "in progress": { + "conditions": [ + { + "action": { + "or": [ + "event_claim", + "event_assign_triage", + "event_reassign_triage", + "event_rescind_minimal_review", + "event_minimal_review", + "event_triaged" + ] + } + }, + { + "action": { + "or": [ + "action_edit" + ] + } + } + ] + }, + "rejected": { + "conditions": [ + { + "action": { + "or": [ + "event_fail" + ] + } + } + ] + } + } + }, + { + "name": "initial_legacy_eg", + "type": "conditional", + "default": "Triage", + "values": { + "Triage": {} + } + }, + { + "name": "result_legacy_eg", + "type": "conditional", + "default": "Triage", + "values": { + "Triage": {}, + "none": { + "conditions": [ + { + "action": { + "or": [ + "event_fail", + "event_triaged" + ] + } + } + ] + } + } + }, + { + "name": "error", + "type": "conditional", + "default": "no", + "values": { + "no": {}, + "AuthoriseException": { + "conditions": [ + { + "action": { + "or": [ + "event_claim" + ] + }, + "actor": { + "or": [ + "unassigned_non_triage", + "admin" + ] + } + }, + { + "action": { + "or": [ + "event_assign_triage" + ] + }, + "actor": { + "nor": [ + "admin" + ] + } + }, + { + "action": { + "or": [ + "event_assign_non_triage" + ] + } + }, + { + "action": { + "or": [ + "action_edit" + ] + }, + "actor": { + "or": [ + "assigned_non_triage", + "unassigned_triage", + "unassigned_non_triage" + ] + } + }, + { + "action": { + "or": [ + "event_unclaim" + ] + }, + "actor": { + "or": [ + "admin", + "unassigned_triage", + "unassigned_non_triage" + ] + } + }, + { + "action": { + "or": [ + "event_unassign" + ] + }, + "actor": { + "nor": [ + "admin" + ] + } + }, + { + "action": { + "or": [ + "event_reassign_triage" + ] + }, + "actor": { + "nor": [ + "admin" + ] + } + }, + { + "action": { + "or": [ + "event_reassign_non_triage" + ] + } + }, + { + "action": { + "or": [ + "event_minimal_review" + ] + }, + "actor": { + "or": [ + "assigned_non_triage", + "unassigned_triage", + "unassigned_non_triage" + ] + } + }, + { + "action": { + "or": [ + "event_fail" + ] + }, + "actor": { + "nor": [ + "assigned_triage" + ] + } + }, + { + "action": { + "or": [ + "event_rescind_minimal_review" + ] + }, + "actor": { + "or": [ + "assigned_non_triage", + "unassigned_triage", + "unassigned_non_triage" + ] + } + }, + { + "action": { + "or": [ + "event_triaged" + ] + }, + "actor": { + "nor": [ + "assigned_triage" + ] + } + } + ] + } + } + } + ] +} \ No newline at end of file diff --git a/doajtest/testbook/user_management/user_management.yml b/doajtest/testbook/user_management/user_management.yml index 55795719bd..cd9f2a55b1 100644 --- a/doajtest/testbook/user_management/user_management.yml +++ b/doajtest/testbook/user_management/user_management.yml @@ -88,6 +88,7 @@ tests: - You are taken to the new user form - The "api" role and "publisher" role are pre-filled in the Roles field. - The ID box is prefilled with an alphanumeric value + - There are no user attributes options available in the form - step: Click in the "Roles" field results: - A pull-down menu appears with all the allowed roles @@ -95,14 +96,13 @@ tests: results: - It is editable - Change the ID to something memorable - - step: Enter test values into each field in the form - - step: Click "Create User" + - step: Enter test values into each remaining field in the form + - step: Click "Register" results: - You are taken back to the /account - - You see a message Debug mode - url for verify is /account/reset/f1b6b123b5f34cd0aa81807a90a096f2 - - /account/reset/f1b6b123b5f34cd0aa81807a90a096f2 is a link and is clickable DO - NOT CLICK IT YET - - 'You see a message '' Account created for dom+test5@doaj.org. View Account: + - You see a message like "Debug mode - url for verify is ..." + - The verify URL in the message is a link and is clickable DO NOT CLICK IT YET + - 'You see a message '' Account created for [some email address]. View Account: /account/testingID''' - /account/testingID is a link and is clickable DO NOT CLICK IT YET - The ID (/testerID in the example above) matches the ID you chose on line 11 @@ -145,9 +145,26 @@ tests: - Your account page is shown - Your ID and email address are displayed - You can see your user roles but you cannot edit them + - You do not have any user attribute fields available to you - include: fragment: edit_account - + +- title: Edit your own user account (editor / associate editor) + context: + role: editor + setup: + - create an editor account with some attributes set + steps: + - step: Log in to your editor account + - step: Go to Settings under My Account + results: + - Your account page is shown + - Your ID and email address are displayed + - You can see your user roles but you cannot edit them + - You can see your user attributes but you cannot edit them + - include: + fragment: edit_account + - title: Edit your own user account (admin) context: role: admin @@ -157,6 +174,12 @@ tests: results: - Your account page is shown - Your ID and email address are displayed + - You can see your user roles and you can edit them + - You can see your user attributes and you can edit them + - step: Add one or more workflow attributes + - step: Add one or more language attributes + - step: Add one or more country attributes + - step: Add one or more free text tag attributes - include: fragment: edit_account - step: Log back in to your admin account and go to Settings @@ -180,6 +203,10 @@ tests: - The user's account page is displayed - A warning alerts you 'NOTE you are editing a user account that is not your own. Be careful!' + - step: Add one or more workflow attributes + - step: Add one or more language attributes + - step: Add one or more country attributes + - step: Add one or more free text tag attributes - include: fragment: edit_account - include: @@ -192,6 +219,7 @@ tests: - step: Put the username of the account you deleted into the search box results: - There are no results to display + - title: User account with journals/applications context: role: admin diff --git a/doajtest/testdrive/workflow.py b/doajtest/testdrive/workflow.py new file mode 100644 index 0000000000..cfd2d41581 --- /dev/null +++ b/doajtest/testdrive/workflow.py @@ -0,0 +1,59 @@ +from doajtest.fixtures import ApplicationFixtureFactory +from doajtest.testdrive.factory import TestDrive +from portality import models, constants +from portality.bll import DOAJ +from portality.lib import dates + + +class Workflow(TestDrive): + + def setup(self) -> dict: + un = self.create_random_str() + pw = self.create_random_str() + acc = models.Account.make_account(un + "@example.com", un, "Admin " + un,[constants.ROLE_ADMIN]) + acc.set_password(pw) + acc.generate_api_key() + acc.save() + + svc = DOAJ.workflowService() + states = [] + for i in range(5): + source = ApplicationFixtureFactory.make_application_source() + app = models.Application(**source) + app.set_id(app.makeid()) + app.bibjson().title = "Workflow Test " + str(i) + app.set_created(dates.before_now(86400*i)) + state = svc.initialise_workflow(acc, app) + state.workflow_control.set_created(app.created_date) + state.saveall() + states.append(state) + + report = { + + } + for state in states: + t = str(type(state)) + if t not in report: + report[t] = [] + report[t].append({ + "application" : state.application.id, + "workflow_control": state.workflow_control.id + }) + + return { + "account": { + "username": acc.id, + "password": pw, + "api_key": acc.api_key + }, + "states": report + } + + def teardown(self, params) -> dict: + models.Account.remove_by_id(params["account"]["username"]) + for state, components in params["states"].items(): + for component in components: + models.Application.remove_by_id(component["application"]) + models.WorkflowControl.remove_by_id(component["workflow_control"]) + + return {"status": "success"} \ No newline at end of file diff --git a/doajtest/unit/bll_workflow/__init__.py b/doajtest/unit/bll_workflow/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/doajtest/unit/bll_workflow/helper_triage_workflow.py b/doajtest/unit/bll_workflow/helper_triage_workflow.py new file mode 100644 index 0000000000..d5a906e73d --- /dev/null +++ b/doajtest/unit/bll_workflow/helper_triage_workflow.py @@ -0,0 +1,222 @@ +""" +DO NOT EDIT THIS TEST DIRECTLY. + +Use the stub in matrices/triage_workflow and regenerate using generate_tests.py +""" + +from portality import constants +from portality.bll import DOAJ +from portality.bll.exceptions import AuthoriseException +from portality.bll.services.workflow.core import ApplicationEdit, Claim, Assign, Unclaim, Unassign, Reassign, Fail, \ + WorkflowEvent +from portality.bll.services.workflow.triage import MinimalReview, RescindMinimalReview, Triaged +from portality.lib import dates +from portality.models import WorkflowControl, Account, Application +from doajtest.fixtures import AccountFixtureFactory, ApplicationFixtureFactory + + +def reviewer_factory(reviewer_def): + if reviewer_def == "none": + return None + + if reviewer_def == "triage": + editor = Account(**AccountFixtureFactory.make_editor_source()) + editor.add_attribute(constants.USER_ATTR__WORKFLOW, constants.EWF__TRIAGE) + editor.set_id(editor.makeid()) + return editor + + if reviewer_def == "non_triage": + editor = Account(**AccountFixtureFactory.make_editor_source()) + editor.set_id(editor.makeid()) + return editor + + raise ValueError(f"Unknown reviewer definition '{reviewer_def}'") + +def actor_factory(actor_def, wfc): + if actor_def == "assigned_triage": + acc = reviewer_factory("triage") + acc.set_id(wfc.reviewer_id) + return acc + + if actor_def == "assigned_non_triage": + acc = reviewer_factory("non_triage") + acc.set_id(wfc.reviewer_id) + return acc + + if actor_def == "admin": + acc = Account(**AccountFixtureFactory.make_managing_editor_source()) + acc.set_id(acc.makeid()) + return acc + + if actor_def == "unassigned_triage": + acc = reviewer_factory("triage") + acc.set_id(acc.makeid()) + return acc + + if actor_def == "unassigned_non_triage": + acc = reviewer_factory("non_triage") + acc.set_id(acc.makeid()) + return acc + + raise ValueError(f"Unknown actor definition '{actor_def}'") + +def label_factory(label_def): + if label_def == "none": + return None + + if label_def == "quick_fail": + return constants.EWF__QUICK_FAIL + + if label_def == "quality_review": + return constants.EWF__QUALITY_REVIEW + + raise ValueError(f"Unknown label definition '{label_def}'") + +def action_factory(action_def, actor, label): + if action_def == "action_edit": + return ApplicationEdit(actor) + if action_def == "event_claim": + return Claim(actor) + if action_def == "event_assign_triage": + new_assignee = reviewer_factory("triage") + return Assign(actor, new_assignee) + if action_def == "event_assign_non_triage": + new_assignee = reviewer_factory("non_triage") + return Assign(actor, new_assignee) + if action_def == "event_unclaim": + return Unclaim(actor) + if action_def == "event_unassign": + return Unassign(actor) + if action_def == "event_reassign_triage": + new_assignee = reviewer_factory("triage") + return Reassign(actor, new_assignee) + if action_def == "event_reassign_non_triage": + new_assignee = reviewer_factory("non_triage") + return Reassign(actor, new_assignee) + if action_def == "event_minimal_review": + return MinimalReview(actor) + if action_def == "event_fail": + return Fail(actor, "A note", dates.days_after_now(180)) + if action_def == "event_rescind_minimal_review": + return RescindMinimalReview(actor) + if action_def == "event_triaged": + return Triaged(actor, label) + + raise ValueError(f"Unknown action definition '{action_def}'") + +def hmr_factory(hmr_def): + if hmr_def == "yes": + return True + + if hmr_def == "no": + return False + + raise ValueError(f"Unknown hmr definition '{hmr_def}'") + +def error_factory(error_def): + if error_def == "no": + return None + if error_def == "AuthoriseException": + return AuthoriseException + + raise ValueError(f"Unknown error definition '{error_def}'") + +def result_reviewer_factory(rr_def): + if rr_def == "none": + return False + if rr_def == "assigned": + return True + if rr_def == "": + return None + + raise ValueError(f"Unknown result reviewer definition '{rr_def}'") + +def editor_group_factory(eg_def): + if eg_def == "none": + return None + return eg_def + +def run_test(kwargs): + module = kwargs.get("module") + stage = kwargs.get("stage") + reviewer_arg = kwargs.get("reviewer") + action = kwargs.get("action") + actor_arg = kwargs.get("actor") + has_minimal_review = kwargs.get("has_minimal_review") + label_arg = kwargs.get("label") + result_module = kwargs.get("result_module") + result_stage = kwargs.get("result_stage") + result_reviewer_arg = kwargs.get("result_reviewer") + initial_legacy_status = kwargs.get("initial_legacy_status") + result_legacy_status = kwargs.get("result_legacy_status") + initial_legacy_eg = kwargs.get("initial_legacy_eg") + result_legacy_eg = kwargs.get("result_legacy_eg") + error = kwargs.get("error") + + reviewer = reviewer_factory(reviewer_arg) + label = label_factory(label_arg) + has_minimal_review = hmr_factory(has_minimal_review) + expected_error = error_factory(error) + has_reviewer_at_end = result_reviewer_factory(result_reviewer_arg) + result_editor_group = editor_group_factory(result_legacy_eg) + + application = Application(**ApplicationFixtureFactory.make_application_source({ + "id": Application.makeid() + })) + + wfc = WorkflowControl() + wfc.module = module + wfc.stage = stage + if reviewer is not None: + wfc.reviewer_id = reviewer.id + wfc._reviewer_object = reviewer # a bit cheeky, just to avoid index lookups + wfc.triage.has_minimal_review = has_minimal_review + wfc.application_id = application.id + wfc.set_id(wfc.makeid()) + + actor = actor_factory(actor_arg, wfc) + action = action_factory(action, actor, label) + + svc = DOAJ.workflowService() + state = svc.state_for_workflow_control(wfc, application) + + # in order to apply initial conditions, we also need to "enter" the state, which we can do by + # apply()ing the state's constraints + state.apply() + + assert state is not None + assert state.application.application_status == initial_legacy_status + assert state.application.editor_group == initial_legacy_eg + + if expected_error is not None: + try: + if isinstance(action, WorkflowEvent): + new_state = state.exit(action) + else: + new_state = state.do(action) + except expected_error: + pass + else: + raise AssertionError(f"Expected {expected_error} to be raised") + return + + if isinstance(action, WorkflowEvent): + new_state = state.exit(action) + else: + new_state = state.do(action) + + assert new_state.module == result_module + + if result_stage != "": + assert new_state.stage == result_stage + + if has_reviewer_at_end is not None: + assert (new_state.workflow_control.reviewer_id is not None) == has_reviewer_at_end + + assert new_state.application.application_status == result_legacy_status + + if result_editor_group is not None: + assert new_state.application.editor_group == result_editor_group + else: + assert new_state.application.editor_group is None + diff --git a/doajtest/unit/bll_workflow/test_basic.py b/doajtest/unit/bll_workflow/test_basic.py new file mode 100644 index 0000000000..14f113135f --- /dev/null +++ b/doajtest/unit/bll_workflow/test_basic.py @@ -0,0 +1,22 @@ +from doajtest.fixtures import ApplicationFixtureFactory +from doajtest.helpers import DoajTestCase +from portality import models +from portality.bll import DOAJ +from portality.bll.services.workflow import AwaitingTriage + + +class TestAnon(DoajTestCase): + def setUp(self): + pass + + def tearDown(self): + pass + + def test_01_initialise_workflow(self): + source = ApplicationFixtureFactory.make_application_source() + application = models.Application(**source) + + wfSvc = DOAJ.workflowService() + state = wfSvc.initialise_workflow(application) + + assert isinstance(state, AwaitingTriage) diff --git a/doajtest/unit/bll_workflow/test_triage_workflow.py b/doajtest/unit/bll_workflow/test_triage_workflow.py new file mode 100644 index 0000000000..98c09ea446 --- /dev/null +++ b/doajtest/unit/bll_workflow/test_triage_workflow.py @@ -0,0 +1,5802 @@ + +from doajtest.helpers import DoajTestCase +from doajtest.unit.bll_workflow.helper_triage_workflow import run_test + +class TestTriageWorkflow(DoajTestCase): + + def test_001(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_claim", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "1" +}) + + def test_002(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_claim", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "2" +}) + + def test_003(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_claim", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "minimal_review", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "3" +}) + + def test_004(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_claim", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "in_progress", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "4" +}) + + def test_005(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_claim", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "5" +}) + + def test_006(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_claim", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "6" +}) + + def test_007(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_assign_triage", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "minimal_review", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "7" +}) + + def test_008(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_assign_triage", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "in_progress", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "8" +}) + + def test_009(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_assign_triage", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "9" +}) + + def test_010(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_assign_triage", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "10" +}) + + def test_011(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_assign_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "11" +}) + + def test_012(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_assign_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "12" +}) + + def test_013(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_assign_non_triage", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "pending", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "13" +}) + + def test_014(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_assign_non_triage", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "pending", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "14" +}) + + def test_015(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_assign_non_triage", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "pending", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "15" +}) + + def test_016(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_assign_non_triage", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "pending", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "16" +}) + + def test_017(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_assign_non_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "pending", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "17" +}) + + def test_018(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "none", + "action": "event_assign_non_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "pending", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "18" +}) + + def test_019(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "action_edit", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "19" +}) + + def test_020(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "action_edit", + "actor": "assigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "20" +}) + + def test_021(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "action_edit", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "21" +}) + + def test_022(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "action_edit", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "22" +}) + + def test_023(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "action_edit", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "23" +}) + + def test_024(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "action_edit", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "24" +}) + + def test_025(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "action_edit", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "25" +}) + + def test_026(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "action_edit", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "26" +}) + + def test_027(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "27" +}) + + def test_028(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "assigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "28" +}) + + def test_029(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "29" +}) + + def test_030(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "30" +}) + + def test_031(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "31" +}) + + def test_032(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "32" +}) + + def test_033(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "33" +}) + + def test_034(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "34" +}) + + def test_035(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unassign", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "35" +}) + + def test_036(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unassign", + "actor": "assigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "36" +}) + + def test_037(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unassign", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "37" +}) + + def test_038(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unassign", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "38" +}) + + def test_039(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unassign", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "39" +}) + + def test_040(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unassign", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "40" +}) + + def test_041(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unassign", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "41" +}) + + def test_042(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_unassign", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "42" +}) + + def test_043(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "43" +}) + + def test_044(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "assigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "44" +}) + + def test_045(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "45" +}) + + def test_046(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "in_progress", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "46" +}) + + def test_047(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "47" +}) + + def test_048(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "48" +}) + + def test_049(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "49" +}) + + def test_050(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "50" +}) + + def test_051(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "51" +}) + + def test_052(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "assigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "52" +}) + + def test_053(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "53" +}) + + def test_054(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "54" +}) + + def test_055(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "55" +}) + + def test_056(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "56" +}) + + def test_057(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "57" +}) + + def test_058(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "58" +}) + + def test_059(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_minimal_review", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "minimal_review", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "59" +}) + + def test_060(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_minimal_review", + "actor": "assigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "minimal_review", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "60" +}) + + def test_061(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_minimal_review", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "minimal_review", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "61" +}) + + def test_062(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_minimal_review", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "minimal_review", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "62" +}) + + def test_063(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_minimal_review", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "63" +}) + + def test_064(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_minimal_review", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "64" +}) + + def test_065(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_minimal_review", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "65" +}) + + def test_066(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_minimal_review", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "66" +}) + + def test_067(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_fail", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "rejected", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "no", + "test_id": "67" +}) + + def test_068(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_fail", + "actor": "assigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "rejected", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "no", + "test_id": "68" +}) + + def test_069(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_fail", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "69" +}) + + def test_070(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_fail", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "70" +}) + + def test_071(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_fail", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "71" +}) + + def test_072(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_fail", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "72" +}) + + def test_073(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_fail", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "73" +}) + + def test_074(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "triage", + "action": "event_fail", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "74" +}) + + def test_075(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "75" +}) + + def test_076(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "assigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "76" +}) + + def test_077(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "77" +}) + + def test_078(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "78" +}) + + def test_079(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "79" +}) + + def test_080(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "80" +}) + + def test_081(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "81" +}) + + def test_082(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "82" +}) + + def test_083(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "83" +}) + + def test_084(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "assigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "84" +}) + + def test_085(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "85" +}) + + def test_086(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "86" +}) + + def test_087(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "87" +}) + + def test_088(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "88" +}) + + def test_089(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "89" +}) + + def test_090(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "90" +}) + + def test_091(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "91" +}) + + def test_092(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "assigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "92" +}) + + def test_093(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "93" +}) + + def test_094(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "94" +}) + + def test_095(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "95" +}) + + def test_096(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "96" +}) + + def test_097(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "97" +}) + + def test_098(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "98" +}) + + def test_099(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "99" +}) + + def test_100(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "assigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "100" +}) + + def test_101(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "101" +}) + + def test_102(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "in_progress", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "102" +}) + + def test_103(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "103" +}) + + def test_104(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "104" +}) + + def test_105(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "105" +}) + + def test_106(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "106" +}) + + def test_107(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "107" +}) + + def test_108(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "assigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "108" +}) + + def test_109(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "109" +}) + + def test_110(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "110" +}) + + def test_111(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "111" +}) + + def test_112(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "112" +}) + + def test_113(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "113" +}) + + def test_114(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "114" +}) + + def test_115(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_minimal_review", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "115" +}) + + def test_116(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_minimal_review", + "actor": "assigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "116" +}) + + def test_117(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_minimal_review", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "minimal_review", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "117" +}) + + def test_118(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_minimal_review", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "minimal_review", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "118" +}) + + def test_119(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_minimal_review", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "119" +}) + + def test_120(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_minimal_review", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "120" +}) + + def test_121(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_minimal_review", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "121" +}) + + def test_122(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_minimal_review", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "122" +}) + + def test_123(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "123" +}) + + def test_124(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "assigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "124" +}) + + def test_125(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "125" +}) + + def test_126(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "126" +}) + + def test_127(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "127" +}) + + def test_128(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "128" +}) + + def test_129(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "129" +}) + + def test_130(self): + run_test({ + "module": "triage", + "stage": "in_progress", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.2", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "130" +}) + + def test_131(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_claim", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "131" +}) + + def test_132(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_claim", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "132" +}) + + def test_133(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_claim", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "minimal_review", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "133" +}) + + def test_134(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_claim", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "in_progress", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "134" +}) + + def test_135(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_claim", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "135" +}) + + def test_136(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_claim", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "136" +}) + + def test_137(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_assign_triage", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "minimal_review", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "137" +}) + + def test_138(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_assign_triage", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "in_progress", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "138" +}) + + def test_139(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_assign_triage", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "139" +}) + + def test_140(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_assign_triage", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "140" +}) + + def test_141(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_assign_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "141" +}) + + def test_142(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_assign_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "pending", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "142" +}) + + def test_143(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_assign_non_triage", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "pending", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "143" +}) + + def test_144(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_assign_non_triage", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "pending", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "144" +}) + + def test_145(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_assign_non_triage", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "pending", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "145" +}) + + def test_146(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_assign_non_triage", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "pending", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "146" +}) + + def test_147(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_assign_non_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "pending", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "147" +}) + + def test_148(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "none", + "action": "event_assign_non_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.1", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "pending", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "148" +}) + + def test_149(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "action_edit", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "149" +}) + + def test_150(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "action_edit", + "actor": "assigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "150" +}) + + def test_151(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "action_edit", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "151" +}) + + def test_152(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "action_edit", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "152" +}) + + def test_153(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "action_edit", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "153" +}) + + def test_154(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "action_edit", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "154" +}) + + def test_155(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "action_edit", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "155" +}) + + def test_156(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "action_edit", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "156" +}) + + def test_157(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "157" +}) + + def test_158(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "assigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "158" +}) + + def test_159(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "159" +}) + + def test_160(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "160" +}) + + def test_161(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "161" +}) + + def test_162(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "162" +}) + + def test_163(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "163" +}) + + def test_164(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unclaim", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "164" +}) + + def test_165(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unassign", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "165" +}) + + def test_166(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unassign", + "actor": "assigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "166" +}) + + def test_167(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unassign", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "167" +}) + + def test_168(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unassign", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "168" +}) + + def test_169(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unassign", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "169" +}) + + def test_170(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unassign", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "170" +}) + + def test_171(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unassign", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "171" +}) + + def test_172(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_unassign", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "172" +}) + + def test_173(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "173" +}) + + def test_174(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "assigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "174" +}) + + def test_175(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "minimal_review", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "175" +}) + + def test_176(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "176" +}) + + def test_177(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "177" +}) + + def test_178(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "178" +}) + + def test_179(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "179" +}) + + def test_180(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "180" +}) + + def test_181(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "181" +}) + + def test_182(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "assigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "182" +}) + + def test_183(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "183" +}) + + def test_184(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "184" +}) + + def test_185(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "185" +}) + + def test_186(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "186" +}) + + def test_187(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "187" +}) + + def test_188(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "188" +}) + + def test_189(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_fail", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "rejected", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "no", + "test_id": "189" +}) + + def test_190(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_fail", + "actor": "assigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "rejected", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "no", + "test_id": "190" +}) + + def test_191(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_fail", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "191" +}) + + def test_192(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_fail", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "192" +}) + + def test_193(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_fail", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "193" +}) + + def test_194(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_fail", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "194" +}) + + def test_195(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_fail", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "195" +}) + + def test_196(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_fail", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "196" +}) + + def test_197(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_rescind_minimal_review", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "in_progress", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "197" +}) + + def test_198(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_rescind_minimal_review", + "actor": "assigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "in_progress", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "198" +}) + + def test_199(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_rescind_minimal_review", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "in_progress", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "199" +}) + + def test_200(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_rescind_minimal_review", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "in_progress", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "200" +}) + + def test_201(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_rescind_minimal_review", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "201" +}) + + def test_202(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_rescind_minimal_review", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "202" +}) + + def test_203(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_rescind_minimal_review", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "203" +}) + + def test_204(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_rescind_minimal_review", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "204" +}) + + def test_205(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_triaged", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "quick_fail", + "state_id": "1.3", + "result_module": "quick_fail", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "no", + "test_id": "205" +}) + + def test_206(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_triaged", + "actor": "assigned_triage", + "has_minimal_review": "yes", + "label": "quality_review", + "state_id": "1.3", + "result_module": "quality_review", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "no", + "test_id": "206" +}) + + def test_207(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_triaged", + "actor": "admin", + "has_minimal_review": "yes", + "label": "quick_fail", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "207" +}) + + def test_208(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_triaged", + "actor": "admin", + "has_minimal_review": "yes", + "label": "quality_review", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "208" +}) + + def test_209(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_triaged", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "quick_fail", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "209" +}) + + def test_210(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_triaged", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "quality_review", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "210" +}) + + def test_211(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_triaged", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "quick_fail", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "211" +}) + + def test_212(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "triage", + "action": "event_triaged", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "quality_review", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "212" +}) + + def test_213(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "213" +}) + + def test_214(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "assigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "214" +}) + + def test_215(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "215" +}) + + def test_216(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "216" +}) + + def test_217(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "217" +}) + + def test_218(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "218" +}) + + def test_219(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "219" +}) + + def test_220(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "action_edit", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "220" +}) + + def test_221(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "221" +}) + + def test_222(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "assigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "222" +}) + + def test_223(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "223" +}) + + def test_224(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "224" +}) + + def test_225(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "225" +}) + + def test_226(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "226" +}) + + def test_227(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "227" +}) + + def test_228(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unclaim", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "228" +}) + + def test_229(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "229" +}) + + def test_230(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "assigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "230" +}) + + def test_231(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "231" +}) + + def test_232(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "232" +}) + + def test_233(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "233" +}) + + def test_234(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "234" +}) + + def test_235(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "235" +}) + + def test_236(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_unassign", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "pending", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "236" +}) + + def test_237(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "237" +}) + + def test_238(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "assigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "238" +}) + + def test_239(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "minimal_review", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "239" +}) + + def test_240(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "240" +}) + + def test_241(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "241" +}) + + def test_242(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "242" +}) + + def test_243(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "243" +}) + + def test_244(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "assigned", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "244" +}) + + def test_245(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "245" +}) + + def test_246(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "assigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "246" +}) + + def test_247(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "247" +}) + + def test_248(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "248" +}) + + def test_249(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "249" +}) + + def test_250(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "250" +}) + + def test_251(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "251" +}) + + def test_252(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_reassign_non_triage", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "252" +}) + + def test_253(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "253" +}) + + def test_254(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "assigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "254" +}) + + def test_255(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "255" +}) + + def test_256(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "256" +}) + + def test_257(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "257" +}) + + def test_258(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "258" +}) + + def test_259(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "259" +}) + + def test_260(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_fail", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "rejected", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "260" +}) + + def test_261(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_rescind_minimal_review", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "261" +}) + + def test_262(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_rescind_minimal_review", + "actor": "assigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "262" +}) + + def test_263(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_rescind_minimal_review", + "actor": "admin", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "in_progress", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "263" +}) + + def test_264(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_rescind_minimal_review", + "actor": "admin", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "in_progress", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "no", + "test_id": "264" +}) + + def test_265(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_rescind_minimal_review", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "265" +}) + + def test_266(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_rescind_minimal_review", + "actor": "unassigned_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "266" +}) + + def test_267(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_rescind_minimal_review", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "267" +}) + + def test_268(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_rescind_minimal_review", + "actor": "unassigned_non_triage", + "has_minimal_review": "no", + "label": "none", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "Triage", + "error": "AuthoriseException", + "test_id": "268" +}) + + def test_269(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_triaged", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "quick_fail", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "269" +}) + + def test_270(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_triaged", + "actor": "assigned_non_triage", + "has_minimal_review": "yes", + "label": "quality_review", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "270" +}) + + def test_271(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_triaged", + "actor": "admin", + "has_minimal_review": "yes", + "label": "quick_fail", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "271" +}) + + def test_272(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_triaged", + "actor": "admin", + "has_minimal_review": "yes", + "label": "quality_review", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "272" +}) + + def test_273(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_triaged", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "quick_fail", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "273" +}) + + def test_274(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_triaged", + "actor": "unassigned_triage", + "has_minimal_review": "yes", + "label": "quality_review", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "274" +}) + + def test_275(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_triaged", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "quick_fail", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "275" +}) + + def test_276(self): + run_test({ + "module": "triage", + "stage": "minimal_review", + "reviewer": "non_triage", + "action": "event_triaged", + "actor": "unassigned_non_triage", + "has_minimal_review": "yes", + "label": "quality_review", + "state_id": "1.3", + "result_module": "triage", + "result_stage": "", + "result_reviewer": "none", + "initial_legacy_status": "in progress", + "result_legacy_status": "in progress", + "initial_legacy_eg": "Triage", + "result_legacy_eg": "none", + "error": "AuthoriseException", + "test_id": "276" +}) + \ No newline at end of file diff --git a/doajtest/unit/test_models.py b/doajtest/unit/test_models.py index 348eb1bd8b..91a983fdff 100644 --- a/doajtest/unit/test_models.py +++ b/doajtest/unit/test_models.py @@ -585,13 +585,15 @@ def test_08_iterate(self): def test_09_account(self): # Make a new account acc = models.Account.make_account(email='user@example.com', username='mrs_user', - roles=['api', 'associate_editor']) + roles=['api', 'associate_editor'], + attributes={constants.USER_ATTR__WORKFLOW: ["triage"]}) # Check the new user has the right roles assert acc.has_role('api') assert acc.has_role('associate_editor') assert not acc.has_role('admin') assert acc.marketing_consent is None + assert acc.has_attribute(constants.USER_ATTR__WORKFLOW, "triage") # check the api key has been generated assert acc.api_key is not None @@ -624,6 +626,58 @@ def test_09_account(self): acc2.save() assert acc2.api_key is not None + def test_09a_account_attributes(self): + acc = models.Account.make_account(email='user@example.com', username='mrs_user', + roles=['api', 'associate_editor'], + attributes={constants.USER_ATTR__WORKFLOW: ["triage"]}) + assert acc.has_attribute(constants.USER_ATTR__WORKFLOW, "triage") + + acc.add_attribute(constants.USER_ATTR__WORKFLOW, "quality") + acc.add_attribute(constants.USER_ATTR__LANGUAGE, "FR") + acc.add_attribute(constants.USER_ATTR__LANGUAGE, "EN") + acc.add_attribute(constants.USER_ATTR__COUNTRY, "DE") + acc.add_attribute(constants.USER_ATTR__COUNTRY, "ES") + acc.add_attribute(constants.USER_ATTR__TAG, "test") + + raw = acc.attributes + assert raw.get(constants.USER_ATTR__WORKFLOW) == ["triage", "quality"] + assert raw.get(constants.USER_ATTR__LANGUAGE) == ["FR", "EN"] + assert raw.get(constants.USER_ATTR__COUNTRY) == ["DE", "ES"] + assert raw.get(constants.USER_ATTR__TAG) == ["test"] + + assert acc.attribute_workflow == ["triage", "quality"] + assert acc.attribute_language == ["FR", "EN"] + assert acc.attribute_country == ["DE", "ES"] + assert acc.attribute_tag == ["test"] + + assert acc.has_attribute(constants.USER_ATTR__WORKFLOW, "triage") + assert acc.has_attribute(constants.USER_ATTR__WORKFLOW, "quality") + assert acc.has_attribute(constants.USER_ATTR__LANGUAGE, "FR") + assert acc.has_attribute(constants.USER_ATTR__LANGUAGE, "EN") + assert acc.has_attribute(constants.USER_ATTR__COUNTRY, "DE") + assert acc.has_attribute(constants.USER_ATTR__COUNTRY, "ES") + assert acc.has_attribute(constants.USER_ATTR__TAG, "test") + + assert acc.get_attributes(constants.USER_ATTR__WORKFLOW) == ["triage", "quality"] + assert acc.get_attributes(constants.USER_ATTR__LANGUAGE) == ["FR", "EN"] + assert acc.get_attributes(constants.USER_ATTR__COUNTRY) == ["DE", "ES"] + assert acc.get_attributes(constants.USER_ATTR__TAG) == ["test"] + + del acc.attributes + raw = acc.attributes + assert raw is None + + # try some error cases + with self.assertRaises(ValueError): + acc.add_attribute("whatever", "something") + + with self.assertRaises(ValueError): + acc.has_attribute("whatever", "something") + + with self.assertRaises(ValueError): + acc.get_attributes("whatever") + + def test_10_block(self): a = models.Article() a.save() diff --git a/modules/formulaic b/modules/formulaic new file mode 160000 index 0000000000..84b58a1e18 --- /dev/null +++ b/modules/formulaic @@ -0,0 +1 @@ +Subproject commit 84b58a1e1849b915466ad68a916692327b0f1859 diff --git a/portality/app.py b/portality/app.py index cfd4a008e2..d6d63ff5db 100644 --- a/portality/app.py +++ b/portality/app.py @@ -50,6 +50,7 @@ from portality.lib.normalise import normalise_doi from portality.view.dashboard import blueprint as dashboard from portality.view.tours import blueprint as tours +from portality.view.workflow import blueprint as workflow if app.config.get("DEBUG", False) and app.config.get("TESTDRIVE_ENABLED", False): from portality.view.testdrive import blueprint as testdrive @@ -90,6 +91,7 @@ app.register_blueprint(jct, url_prefix="/jct") # ~~-> JCT:Blueprint~~ app.register_blueprint(dashboard, url_prefix="/dashboard") #~~-> Dashboard:Blueprint~~ app.register_blueprint(tours, url_prefix="/tours") # ~~-> Tours:Blueprint~~ +app.register_blueprint(workflow, url_prefix="/workflow") # ~~-> Workflow:Blueprint~~ app.register_blueprint(oaipmh) # ~~-> OAIPMH:Blueprint~~ app.register_blueprint(openurl) # ~~-> OpenURL:Blueprint~~ diff --git a/portality/bll/doaj.py b/portality/bll/doaj.py index d6dc8453ef..f68b78fbdc 100644 --- a/portality/bll/doaj.py +++ b/portality/bll/doaj.py @@ -1,4 +1,5 @@ # ~~DOAJ:Service~~ + class DOAJ(object): """ Primary entry point to the services which back up the DOAJ Business Logic Layer. @@ -178,4 +179,9 @@ def adminAlertsService(cls): :return: AdminAlertsService """ from portality.bll.services import admin_alerts - return admin_alerts.AdminAlertsService() \ No newline at end of file + return admin_alerts.AdminAlertsService() + + @classmethod + def workflowService(cls): + from portality.bll.services.workflow import service + return service.WorkflowService() \ No newline at end of file diff --git a/portality/bll/exceptions.py b/portality/bll/exceptions.py index fd3851f882..2eab245929 100644 --- a/portality/bll/exceptions.py +++ b/portality/bll/exceptions.py @@ -9,6 +9,7 @@ class AuthoriseException(Exception): # standardised reasons why an action might not be allowed NOT_OWNER = "not_owner" WRONG_ROLE = "wrong_role" + WRONG_ATTRIBUTE = "wrong_attribute" WRONG_STATUS = "wrong_status" NOT_AUTHORISED = "not_authorised" diff --git a/portality/bll/services/application.py b/portality/bll/services/application.py index 34eb25fdc0..1d45319089 100644 --- a/portality/bll/services/application.py +++ b/portality/bll/services/application.py @@ -193,10 +193,11 @@ def reject_application(self, application, account, provenance=True, note=None, m # ~~->Journal:Service~~ journalService = DOAJ.journalService() + authSvc = DOAJ.authorisationService() # check we're allowed to carry out this action - if not account.has_role("reject_application"): - raise exceptions.AuthoriseException(message="This user is not allowed to reject applications", reason=exceptions.AuthoriseException.WRONG_ROLE) + # (raises an AuthoriseException if not) + can_reject = authSvc.can_reject_application(account, application) # ensure the application status is "rejected" if application.application_status != constants.APPLICATION_STATUS_REJECTED: diff --git a/portality/bll/services/authorisation.py b/portality/bll/services/authorisation.py index 5be4e65c77..17012d2002 100644 --- a/portality/bll/services/authorisation.py +++ b/portality/bll/services/authorisation.py @@ -80,8 +80,6 @@ def can_edit_application(self, account, application): raise exceptions.AuthoriseException(reason=no_auth_reason) - - def can_view_application(self, account, application): """ Is the given account allowed to view the update request application @@ -137,4 +135,31 @@ def can_edit_journal(self, account: models.Account, journal: models.Journal): if passed: return True - raise exceptions.AuthoriseException(reason=exceptions.AuthoriseException.WRONG_ROLE) \ No newline at end of file + raise exceptions.AuthoriseException(reason=exceptions.AuthoriseException.WRONG_ROLE) + + def can_reject_application(self, account: models.Account, application: models.Application): + """ + Is the given account allowed to reject the application + + :param account: the account doing the action + :param application: the application the account wants to reject + :return: + """ + # if this is the super user, they have all rights + if account.is_super: + return True + + # check for explicit role (no one really has this atm) + role = account.has_role("reject_application") + if role: + return True + + # triage users can reject if the item is in triage + triage = account.has_attribute(constants.USER_ATTR__WORKFLOW, constants.EWF__TRIAGE) + in_progress = application.application_status == constants.APPLICATION_STATUS_IN_PROGRESS + attr = triage & in_progress + if attr: + return True + + raise exceptions.AuthoriseException(message="This user is not allowed to reject applications", + reason=exceptions.AuthoriseException.WRONG_ROLE) diff --git a/portality/bll/services/workflow/__init__.py b/portality/bll/services/workflow/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/portality/bll/services/workflow/core.py b/portality/bll/services/workflow/core.py new file mode 100644 index 0000000000..f7e55387d4 --- /dev/null +++ b/portality/bll/services/workflow/core.py @@ -0,0 +1,247 @@ +from typing import Union + +from portality.models import Account, WorkflowControl, Application, WorkflowControlStateQuery + + +##################################### +## Base Workflow Event and all shared events + +class WorkflowEvent: + def __init__(self, actor:Union[str, Account]): + self._actor = actor + + @property + def actor(self) -> Account: + if isinstance(self._actor, str): + self._actor = Account.pull(self._actor) + return self._actor + + @property + def actor_id(self) -> str: + if isinstance(self._actor, str): + return self._actor + return self._actor.id + +class ReviewerAssignment(WorkflowEvent): + def __init__(self, actor:Union[str, Account], reviewer:Union[str, Account]): + super().__init__(actor) + self._reviewer = reviewer + + @property + def reviewer(self) -> Account: + if isinstance(self._reviewer, str): + self._reviewer = Account.pull(self._reviewer) + return self._reviewer + + @property + def reviewer_id(self) -> str: + if isinstance(self._reviewer, str): + return self._reviewer + return self._reviewer.id + +class Assign(ReviewerAssignment): pass + +class Reassign(ReviewerAssignment): pass + +class Claim(WorkflowEvent): pass + +class Unclaim(WorkflowEvent): pass + +class Unassign(WorkflowEvent): pass + +class Fail(WorkflowEvent): + def __init__(self, actor:Union[str, Account], note:str=None, embargo_end:str=None): + super().__init__(actor) + self._note = note + self._embargo_end = embargo_end + + @property + def note(self): + return self._note + + @property + def embargo_end(self): + return self._embargo_end + +##################################### +## Base Workflow Action and all shared actions + +class WorkflowAction: + def __init__(self, actor: Union[str, Account]): + self._actor = actor + + @property + def actor(self) -> Account: + if isinstance(self._actor, str): + self._actor = Account.pull(self._actor) + return self._actor + + @property + def actor_id(self) -> str: + if isinstance(self._actor, str): + return self._actor + return self._actor.id + +class ApplicationEdit(WorkflowAction): pass + +###################################### +## Base State object + +class State: + module = None + stage = None + reviewer = None + + legacy_application_status = None + legacy_editor_group = None + + events = [] + actions = [] + + def __init__(self, wf_control:WorkflowControl, application:Application=None): + self._wf_control = wf_control + self._application = application + + @classmethod + def query(cls): + return WorkflowControlStateQuery(cls.module, cls.stage, cls.reviewer) + + @classmethod + def enter(cls, actor:Union[str, Account], + wf_control:WorkflowControl, + application:Application=None, + from_state: "State"=None): + instance = cls(wf_control, application) + instance.apply() + instance.audit(actor) + return instance + + @classmethod + def matches(cls, wf_control:WorkflowControl): + # Check the module. + # If the wfc has no module, and the state definition requires a specific module, then it doesn't match. + # If the wfc has a module, and the state definition requires a specifc module, and it isn't this one, then it doesn't match + if wf_control.module is None: + if not (cls.module == WorkflowControl.ANY): + return False + else: + if not (cls.module == WorkflowControl.ANY or cls.module == wf_control.module): + return False + + # if we get to here, module matches + + # check the stage + # If the wfc has no stage, and the state definition requires a specific stage, then it doesn't match. + # If the wfc has a stage, and the state definition requires a specifc stage, and it isn't this one, then it doesn't match + if wf_control.stage is None: + if not (cls.stage == WorkflowControl.ANY): + return False + else: + if not (cls.stage == WorkflowControl.ANY or cls.stage == wf_control.stage): + return False + + # by here, module and stage match + + if wf_control.reviewer_id is None: + if not (cls.reviewer == WorkflowControl.ANY or cls.reviewer == WorkflowControl.UNASSIGNED): + return False + else: + if not (cls.reviewer == WorkflowControl.ANY or cls.reviewer == WorkflowControl.ASSIGNED or cls.reviewer == wf_control.reviewer_id): + return False + + return True + + @property + def workflow_control(self): + return self._wf_control + + @property + def application(self): + if self._application is None: + app_id = self.workflow_control.application_id + self._application = Application.pull(app_id) + return self._application + + ######################################## + ## methods applied at state entry by enter() + + def apply_module(self): + if self.module is not None and self.module not in WorkflowControl.META_STATES: + if self.workflow_control.module != self.module: + self.workflow_control.module = self.module + + def apply_stage(self): + if self.stage is not None and self.stage not in WorkflowControl.META_STATES: + if self.workflow_control.stage != self.stage: + self.workflow_control.stage = self.stage + + def apply_reviewer(self): + if self.workflow_control.reviewer_id is None and self.reviewer == WorkflowControl.ASSIGNED: + raise ValueError(f"Reviewer must be set for '{type(self).__name__}' state") + + if self.workflow_control.reviewer_id is not None and self.reviewer == WorkflowControl.UNASSIGNED: + del self.workflow_control.reviewer_id + + def apply_legacy_application_status(self): + # back-compatibility for the original workflow + if self.legacy_application_status is not None: + application = self.application + if application.application_status != self.legacy_application_status: + application.set_application_status(self.legacy_application_status) + + def apply_legacy_application_reviewer(self): + # back-compatibility for the original workflow + application = self.application + application.set_editor_group(self.legacy_editor_group) + if self.workflow_control.reviewer_id is not None: + if application.editor != self.workflow_control.reviewer_id: + application.set_editor(self.workflow_control.reviewer_id) + else: + application.remove_editor() + + def apply(self): + # apply all the appropriate workflow state properties + self.apply_module() + self.apply_stage() + self.apply_reviewer() + + # take the state properties, and propagate any back-compatibility changes to the old workflow + self.apply_legacy_application_status() + self.apply_legacy_application_reviewer() + + ########################################## + + def transition(self, target_class, actor): + return target_class.enter(actor, self._wf_control, self._application, self) + + def exit(self, event:WorkflowEvent): + return self + + def dispatch_event(self, event: WorkflowEvent, handlers: dict): + """Dispatch an event to the appropriate handler based on isinstance checks. + + handlers: mapping of EventClass -> handler callable + """ + for ev_cls, handler in handlers.items(): + if isinstance(event, ev_cls): + return handler(event) + raise ValueError(f"Unknown event '{event}' for state '{type(self).__name__}'") + + def do(self, action:WorkflowAction): + return self + + def get_audit_record(self): + return { + "module": self.module, + "stage": self.stage, + "reviewer": self.workflow_control.reviewer_id + } + + def audit(self, actor, date=None): + target_data = self.get_audit_record() + self.workflow_control.add_audit(actor, target_data, date) + + def saveall(self, *args, **kwargs): + self.workflow_control.save(*args, **kwargs) + if self._application: + self._application.save(*args, **kwargs) \ No newline at end of file diff --git a/portality/bll/services/workflow/quality_review.py b/portality/bll/services/workflow/quality_review.py new file mode 100644 index 0000000000..91dc9bae98 --- /dev/null +++ b/portality/bll/services/workflow/quality_review.py @@ -0,0 +1,25 @@ +from portality import constants +from portality.bll.services.workflow.core import State +from portality.models import WorkflowControl + +MODULE_QUALITY_REVIEW = "quality_review" +MODULE_QUALITY_REVIEW_STAGE_PENDING = "pending" + +MODULE_QUALITY_REVIEW_STAGES = [ + MODULE_QUALITY_REVIEW_STAGE_PENDING +] + +LEGACY_EDITOR_GROUP = None + + +class QualityReviewAwaitingAssignment(State): + module = MODULE_QUALITY_REVIEW + stage = MODULE_QUALITY_REVIEW_STAGE_PENDING + reviewer = WorkflowControl.UNASSIGNED + + legacy_application_status = constants.APPLICATION_STATUS_IN_PROGRESS + legacy_editor_group = LEGACY_EDITOR_GROUP + + +class QualityReviewAssessment(State): + pass diff --git a/portality/bll/services/workflow/quick_fail.py b/portality/bll/services/workflow/quick_fail.py new file mode 100644 index 0000000000..80c6f2abbc --- /dev/null +++ b/portality/bll/services/workflow/quick_fail.py @@ -0,0 +1,24 @@ +from portality import constants +from portality.bll.services.workflow.core import State +from portality.models import WorkflowControl + +MODULE_QUICK_FAIL = "quick_fail" +MODULE_QUICK_FAIL_STAGE_PENDING = "pending" + +MODULE_QUICK_FAIL_STAGES = [ + MODULE_QUICK_FAIL_STAGE_PENDING +] + +LEGACY_EDITOR_GROUP = None + +class QuickFailAwaitingAssignment(State): + module = MODULE_QUICK_FAIL + stage = MODULE_QUICK_FAIL_STAGE_PENDING + reviewer = WorkflowControl.UNASSIGNED + + legacy_application_status = constants.APPLICATION_STATUS_IN_PROGRESS + legacy_editor_group = None + + +class QuickFailCriteriaCheck(State): + pass diff --git a/portality/bll/services/workflow/rejected.py b/portality/bll/services/workflow/rejected.py new file mode 100644 index 0000000000..b4b7b6bf1d --- /dev/null +++ b/portality/bll/services/workflow/rejected.py @@ -0,0 +1,48 @@ +from portality import constants +from portality.bll import DOAJ +from portality.bll.services.workflow.core import State +from portality.models import Account, WorkflowControl + +################################## +## Rejected state definition values + +MODULE_REJECTED = "rejected" +MODULE_REJECTED_STAGE_REJECTED = "rejected" + +################################## +## Rejected state definition(s) + +class Rejected(State): + module = MODULE_REJECTED + stage = MODULE_REJECTED_STAGE_REJECTED + reviewer = WorkflowControl.ANY + + def apply(self): + # Ensure the workflow control object is in the right state + wf_control = self.workflow_control + if wf_control.module != self.module: + wf_control.module = self.module + + if wf_control.stage != self.stage: + wf_control.stage = self.stage + + # back-compatibility for the original workflow + application = self.application + + if application.application_status != constants.APPLICATION_STATUS_REJECTED: + appSvc = DOAJ.applicationService() + acc = None + if wf_control.reviewer_id is not None: + acc = Account.pull(wf_control.reviewer_id) + if acc is None: + # FIXME: what's the way to do this? + acc = Account.pull("system") + appSvc.reject_application(application, acc) + + application.remove_editor_group() + + if wf_control.reviewer_id is not None: + if application.editor != wf_control.reviewer_id: + application.set_editor(wf_control.reviewer_id) + else: + application.remove_editor() \ No newline at end of file diff --git a/portality/bll/services/workflow/service.py b/portality/bll/services/workflow/service.py new file mode 100644 index 0000000000..7199190848 --- /dev/null +++ b/portality/bll/services/workflow/service.py @@ -0,0 +1,100 @@ +from typing import Type, Union + +from portality.bll.services.workflow.quality_review import QualityReviewAwaitingAssignment, QualityReviewAssessment +from portality.bll.services.workflow.quick_fail import QuickFailAwaitingAssignment, QuickFailCriteriaCheck +from portality.bll.services.workflow.rejected import Rejected +from portality.bll.services.workflow.triage import AwaitingTriage, TriageAssessmentInProgress, \ + TriageAssessmentMinimalReview +from portality.bll.services.workflow.core import State, WorkflowEvent, WorkflowAction +from portality.models import WorkflowControl, Account, Application + + +class WorkflowService: + STATES = [ + # Triage States + AwaitingTriage, + TriageAssessmentInProgress, + TriageAssessmentMinimalReview, + + # Quick Fail States + QuickFailAwaitingAssignment, + QuickFailCriteriaCheck, + + # Quality Review States + QualityReviewAwaitingAssignment, + QualityReviewAssessment, + + # Rejected State + Rejected + ] + + def iterate_state(self, state:Type[State]): + query = state.query() + for wfc in WorkflowControl.iterate_unstable(q=query.query()): + yield state(wfc) + + def first_n_in_state(self, state:Type[State], n:int) -> list[State]: + query = state.query() + query.size = n + return [state(x) for x in WorkflowControl.object_query(q=query.query())] + + def apply_action(self, wfc:Union[str, WorkflowControl], action:WorkflowAction, save=True) -> State: + if isinstance(wfc, str): + wfc = WorkflowControl.pull(wfc) + + state_instance = self.state_for_workflow_control(wfc) + if state_instance is None: + raise ValueError(f"No state found for workflow control with id '{wfc.id}'") + + new_state = self.action(state_instance, action) + if save: + new_state.saveall() + return new_state + + def apply_event(self, wfc:Union[str, WorkflowControl], event:WorkflowEvent, save=True) -> State: + if isinstance(wfc, str): + wfc = WorkflowControl.pull(wfc) + + state_instance = self.state_for_workflow_control(wfc) + if state_instance is None: + raise ValueError(f"No state found for workflow control with id '{wfc.id}'") + + new_state = self.event(state_instance, event) + if save: + new_state.saveall() + return new_state + + def state_for_workflow_control(self, wfc:Union[str, WorkflowControl], application:Application=None) -> Union[State, None]: + if isinstance(wfc, str): + wfc = WorkflowControl.pull(wfc) + + if wfc is None: + return None + + for state in self.STATES: + if state.matches(wfc): + return state(wfc, application) + + return None + + def event(self, state_instance:State, event:WorkflowEvent) -> State: + if event.__class__ not in state_instance.events: + raise ValueError(f"Invalid event '{event}' for state '{type(state_instance).__name__}'") + + new_state = state_instance.exit(event) + return new_state + + def action(self, state_instance:State, action:WorkflowAction) -> State: + if action.__class__ not in state_instance.actions: + raise ValueError(f"Invalid action '{action}' on state '{type(state_instance).__name__}'") + + new_state = state_instance.do(action) + return new_state + + def initialise_workflow(self, actor:Union[str, Account], application:Application) -> State: + wfc = WorkflowControl() + wfc.application_id = application.id + wfc.original_application = application + wfc.application_title = application.bibjson().title + initial_state = AwaitingTriage.enter(actor, wfc, application) + return initial_state diff --git a/portality/bll/services/workflow/triage.py b/portality/bll/services/workflow/triage.py new file mode 100644 index 0000000000..5ece2a2be2 --- /dev/null +++ b/portality/bll/services/workflow/triage.py @@ -0,0 +1,301 @@ +from typing import Union + +from portality import constants +from portality.bll import DOAJ +from portality.bll.exceptions import AuthoriseException + +from portality.bll.services.workflow.core import WorkflowEvent, State, Claim, Assign, Unclaim, Reassign, Unassign, \ + Fail, ApplicationEdit, WorkflowAction +from portality.bll.services.workflow.rejected import Rejected +from portality.models import Account, WorkflowControl + +######################################## +# Triage module state definition values + +MODULE_TRIAGE = "triage" +MODULE_TRIAGE_STAGE_IN_PROGRESS = "in_progress" +MODULE_TRIAGE_STAGE_MINIMAL_REVIEW = "minimal_review" +MODULE_TRIAGE_STAGES = [ + MODULE_TRIAGE_STAGE_IN_PROGRESS, + MODULE_TRIAGE_STAGE_MINIMAL_REVIEW +] + +LEGACY_EDITOR_GROUP = "Triage" + +###################################### +## Workflow events specific to Triage + +class MinimalReview(WorkflowEvent): pass + +class RescindMinimalReview(WorkflowEvent): pass + +class Triaged(WorkflowEvent): + def __init__(self, actor:Union[str, Account], label:str): + super().__init__(actor) + self._label = label + + @property + def label(self): + return self._label + +###################################### +## Triage Workflow States + +class AwaitingTriage(State): + module = MODULE_TRIAGE + stage = WorkflowControl.ANY + reviewer = WorkflowControl.UNASSIGNED + + legacy_application_status = constants.APPLICATION_STATUS_PENDING + legacy_editor_group = LEGACY_EDITOR_GROUP + + events = [Claim, Assign] + + def apply_stage(self): + wf_control = self.workflow_control + if wf_control.stage not in MODULE_TRIAGE_STAGES: + if wf_control.triage.has_minimal_review: + wf_control.stage = MODULE_TRIAGE_STAGE_MINIMAL_REVIEW + else: + wf_control.stage = MODULE_TRIAGE_STAGE_IN_PROGRESS + + def exit(self, event:WorkflowEvent) -> State: + return self.dispatch_event(event, { + Claim: self.event_claim, + Assign: self.event_assign + }) + + def event_claim(self, event:Claim) -> State: + return self._assign_and_transition(event.actor, event.actor) + + def event_assign(self, event:Assign) -> State: + if not event.actor.has_role(constants.ROLE_ADMIN): + raise AuthoriseException(reason=AuthoriseException.WRONG_ROLE) + return self._assign_and_transition(event.actor, event.reviewer) + + def _assign_and_transition(self, actor, reviewer) -> Union["TriageAssessmentInProgress", "TriageAssessmentMinimalReview"]: + if not reviewer.has_attribute(constants.USER_ATTR__WORKFLOW, constants.EWF__TRIAGE): + raise AuthoriseException(reason=AuthoriseException.WRONG_ATTRIBUTE) + + wfc = self.workflow_control + wfc.reviewer_id = reviewer.id + + # legacy bindings + if self.application is None: + raise ValueError("WorkflowControl is not bound to an application, cannot apply legacy bindings") + self.application.set_editor_group(self.legacy_editor_group) + self.application.set_editor(reviewer.id) + + if wfc.triage.has_minimal_review: + return self.transition(TriageAssessmentMinimalReview, actor) + else: + return self.transition(TriageAssessmentInProgress, actor) + + +class TriageWorkingState(State): + def do(self, action:WorkflowAction) -> State: + if isinstance(action, ApplicationEdit): + return self.do_edit(action) + else: + raise ValueError(f"Unknown action '{action}' for state '{type(self).__name__}'") + + def do_edit(self, action:ApplicationEdit) -> State: + raise NotImplementedError("do_edit must be implemented by subclasses of TriageWorkingState") + + def event_unclaim(self, event:Unclaim) -> AwaitingTriage: + wfc = self.workflow_control + if wfc.reviewer_id != event.actor_id: + raise AuthoriseException(reason=AuthoriseException.NOT_AUTHORISED) + + del wfc.reviewer_id + + # legacy bindings + if self.application is None: + raise ValueError("WorkflowControl is not bound to an application, cannot apply legacy bindings") + self.application.set_editor_group(self.legacy_editor_group) + self.application.remove_editor() + + return self.transition(AwaitingTriage, event.actor) + + def event_unassign(self, event:Unassign) -> AwaitingTriage: + wfc = self.workflow_control + if not event.actor.has_role(constants.ROLE_ADMIN): + raise AuthoriseException(reason=AuthoriseException.WRONG_ROLE) + + del wfc.reviewer_id + + # legacy bindings + if self.application is None: + raise ValueError("WorkflowControl is not bound to an application, cannot apply legacy bindings") + self.application.set_editor_group(self.legacy_editor_group) + self.application.remove_editor() + + return self.transition(AwaitingTriage, event.actor) + + def event_reassign(self, event:Reassign) -> "TriageWorkingState": + wfc = self.workflow_control + if not event.actor.has_role(constants.ROLE_ADMIN): + raise AuthoriseException(reason=AuthoriseException.WRONG_ROLE) + + if not event.reviewer.has_attribute(constants.USER_ATTR__WORKFLOW, constants.EWF__TRIAGE): + raise AuthoriseException(reason=AuthoriseException.WRONG_ATTRIBUTE) + + wfc.reviewer_id = event.reviewer_id + + # legacy bindings + if self.application is None: + raise ValueError("WorkflowControl is not bound to an application, cannot apply legacy bindings") + self.application.set_editor_group(self.legacy_editor_group) + self.application.set_editor(event.reviewer_id) + + return self.enter(event.actor, self._wf_control, self._application, self) + + def event_fail(self, event: Fail) -> "Rejected": + wfc = self.workflow_control + reviewer_permission = wfc.reviewer_id == event.actor_id and wfc.reviewer.has_attribute( + constants.USER_ATTR__WORKFLOW, constants.EWF__TRIAGE) + if not reviewer_permission: + raise AuthoriseException(reason=AuthoriseException.NOT_AUTHORISED) + + # remove the editor + del wfc.reviewer_id + + # legacy bindings + if self.application is None: + raise ValueError("WorkflowControl is not bound to an application, cannot apply legacy bindings") + self.application.remove_editor() + self.application.remove_editor_group() + + appSvc = DOAJ.applicationService() + appSvc.reject_application(self.application, event.actor, note=event.note) + + # TODO: not clear what to do with application embargoes, perhaps these are a new type? + + from portality.bll.services.workflow.rejected import Rejected + return self.transition(Rejected, event.actor) + + +class TriageAssessmentInProgress(TriageWorkingState): + module = MODULE_TRIAGE + stage = MODULE_TRIAGE_STAGE_IN_PROGRESS + reviewer = WorkflowControl.ASSIGNED + + legacy_application_status = constants.APPLICATION_STATUS_IN_PROGRESS + legacy_editor_group = LEGACY_EDITOR_GROUP + + events = [Unclaim, Reassign, Unassign, Fail, MinimalReview] + actions = [ApplicationEdit] + + def apply(self): + super(TriageAssessmentInProgress, self).apply() + self.workflow_control.triage.has_minimal_review = False + + def do_edit(self, action:ApplicationEdit) -> Union["TriageAssessmentInProgress", "TriageAssessmentMinimalReview"]: + wfc = self.workflow_control + reviewer_permission = wfc.reviewer_id == action.actor_id and wfc.reviewer.has_attribute(constants.USER_ATTR__WORKFLOW, constants.EWF__TRIAGE) + if not (reviewer_permission or action.actor.has_role(constants.ROLE_ADMIN)): + raise AuthoriseException(reason=AuthoriseException.NOT_AUTHORISED) + + # FIXME: where does has_minimal_review get calculated? + if self.workflow_control.triage.has_minimal_review: + return self.event_minimal_review(MinimalReview(action.actor_id)) + else: + return self + + def exit(self, event:WorkflowEvent) -> State: + return self.dispatch_event(event, { + Unclaim: self.event_unclaim, + Unassign: self.event_unassign, + Reassign: self.event_reassign, + Fail: self.event_fail, + MinimalReview: self.event_minimal_review + }) + + def event_minimal_review(self, event: MinimalReview) -> "TriageAssessmentMinimalReview": + wfc = self.workflow_control + reviewer_permission = wfc.reviewer_id == event.actor_id and wfc.reviewer.has_attribute( + constants.USER_ATTR__WORKFLOW, constants.EWF__TRIAGE) + + if not (reviewer_permission or event.actor.has_role(constants.ROLE_ADMIN)): + raise AuthoriseException(reason=AuthoriseException.NOT_AUTHORISED) + + wfc.triage.has_minimal_review = True + return self.transition(TriageAssessmentMinimalReview, event.actor) + + +class TriageAssessmentMinimalReview(TriageWorkingState): + module = MODULE_TRIAGE + stage = MODULE_TRIAGE_STAGE_MINIMAL_REVIEW + reviewer = WorkflowControl.ASSIGNED + + legacy_application_status = constants.APPLICATION_STATUS_IN_PROGRESS + legacy_editor_group = LEGACY_EDITOR_GROUP + + events = [Triaged, Unclaim, Reassign, Unassign, Fail, RescindMinimalReview] + actions = [ApplicationEdit] + + def apply(self): + super(TriageAssessmentMinimalReview, self).apply() + self.workflow_control.triage.has_minimal_review = True + + def do_edit(self, action: ApplicationEdit) -> Union["TriageAssessmentInProgress", "TriageAssessmentMinimalReview"]: + wfc = self.workflow_control + reviewer_permission = wfc.reviewer_id == action.actor_id and wfc.reviewer.has_attribute( + constants.USER_ATTR__WORKFLOW, constants.EWF__TRIAGE) + if not (reviewer_permission or action.actor.has_role(constants.ROLE_ADMIN)): + raise AuthoriseException(reason=AuthoriseException.NOT_AUTHORISED) + + # FIXME: where does has_minimal_review get calculated? + if self.workflow_control.triage.has_minimal_review: + return self + else: + return self.event_rescind_minimal_review(RescindMinimalReview(action.actor_id)) + + def exit(self, event: WorkflowEvent) -> State: + return self.dispatch_event(event, { + Unclaim: self.event_unclaim, + Unassign: self.event_unassign, + Reassign: self.event_reassign, + RescindMinimalReview: self.event_rescind_minimal_review, + Fail: self.event_fail, + Triaged: self.event_triaged + }) + + def event_rescind_minimal_review(self, event: RescindMinimalReview) -> TriageAssessmentInProgress: + wfc = self.workflow_control + reviewer_permission = wfc.reviewer_id == event.actor_id and wfc.reviewer.has_attribute( + constants.USER_ATTR__WORKFLOW, constants.EWF__TRIAGE) + if not (reviewer_permission or event.actor.has_role(constants.ROLE_ADMIN)): + raise AuthoriseException(reason=AuthoriseException.NOT_AUTHORISED) + + wfc.triage.has_minimal_review = False + return self.transition(TriageAssessmentInProgress, event.actor) + + def event_triaged(self, event: Triaged) -> Union["QuickFailAwaitingAssignment", "QualityReviewAwaitingAssignment"]: + wfc = self.workflow_control + reviewer_permission = wfc.reviewer_id == event.actor_id and wfc.reviewer.has_attribute( + constants.USER_ATTR__WORKFLOW, constants.EWF__TRIAGE) + if not reviewer_permission: + raise AuthoriseException(reason=AuthoriseException.NOT_AUTHORISED) + + # add the triage label(s) + wfc.add_label(event.label) + + # unassign the reviewer + del wfc.reviewer_id + + # legacy bindings + if self.application is None: + raise ValueError("WorkflowControl is not bound to an application, cannot apply legacy bindings") + self.application.remove_editor() + self.application.remove_editor_group() + + if event.label == constants.EWF__QUICK_FAIL: + from portality.bll.services.workflow.quick_fail import QuickFailAwaitingAssignment + return self.transition(QuickFailAwaitingAssignment, event.actor) + elif event.label == constants.EWF__QUALITY_REVIEW: + from portality.bll.services.workflow.quality_review import QualityReviewAwaitingAssignment + return self.transition(QualityReviewAwaitingAssignment, event.actor) + else: + raise ValueError(f"Unknown triage label '{event.label}'") + diff --git a/portality/constants.py b/portality/constants.py index 4ed8d7c3a5..a8569d71f3 100644 --- a/portality/constants.py +++ b/portality/constants.py @@ -113,6 +113,27 @@ # TODO add ultra_bulk_delete and refactor view to use constants ROLE_ADMIN_REPORT_WITH_NOTES = "ultra_admin_reports_with_notes" # MUST start with ultra_ so that superusers don't gain +USER_ATTR__WORKFLOW = "workflow" +USER_ATTR__LANGUAGE = "language" +USER_ATTR__COUNTRY = "country" +USER_ATTR__TAG = "tag" + +USER_ATTR__ALL = [ + USER_ATTR__WORKFLOW, + USER_ATTR__LANGUAGE, + USER_ATTR__COUNTRY, + USER_ATTR__TAG +] + +EWF__TRIAGE = "Triage" +EWF__QUICK_FAIL = "Quick Fail" +EWF__QUALITY_REVIEW = "Quality Review" + +EWF__ALL_STAGES = [ + EWF__TRIAGE, + EWF__QUICK_FAIL, + EWF__QUALITY_REVIEW +] CRON_NEVER = {"month": "2", "day": "31", "day_of_week": "*", "hour": "*", "minute": "*"} diff --git a/portality/forms/validate.py b/portality/forms/validate.py index 228ca2b803..e3afc275c3 100644 --- a/portality/forms/validate.py +++ b/portality/forms/validate.py @@ -670,9 +670,13 @@ def __init__(self, message=None): def __call__(self, form, field): if field.data is not None and field.data != '': - check = get_currency_code(field.data, fail_if_not_found=True) - if check is None: - raise validators.ValidationError(self.message) + value = field.data + if not isinstance(value, list): + value = [value] + for v in value: + check = get_currency_code(v, fail_if_not_found=True) + if check is None: + raise validators.ValidationError(self.message) class CurrentISOLanguage(object): @@ -683,6 +687,10 @@ def __init__(self, message=None): def __call__(self, form, field): if field.data is not None and field.data != '': - check = isolang.find(field.data) - if check is None: - raise validators.ValidationError(self.message) + value = field.data + if not isinstance(value, list): + value = [value] + for v in value: + check = isolang.find(v) + if check is None: + raise validators.ValidationError(self.message) diff --git a/portality/migrate/4317_user_attributes/__init__.py b/portality/migrate/4317_user_attributes/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/portality/migrate/4317_user_attributes/apply_user_attributes.py b/portality/migrate/4317_user_attributes/apply_user_attributes.py new file mode 100644 index 0000000000..dde8fd1a38 --- /dev/null +++ b/portality/migrate/4317_user_attributes/apply_user_attributes.py @@ -0,0 +1,185 @@ +"""Migration script to add user attributes (country and language) based on Editor Group CSVs. + +Usage: + python -m portality.migrate.4317_user_attributes /path/to/countries.csv /path/to/languages.csv + +The first CSV should have two columns with headers: the first is the country name, the second the Editor Group name. +The second CSV should have two columns with headers: the first is the language name, the second the Editor Group name. + +For each row this script finds the EditorGroup by name, collects the accounts attached to the group +(maned, editor, associates) and schedules the appropriate ISO code to be added to each user's attributes +('country' or 'language'). All validations are done against the portality datasets (pycountry/isolang). + +The script collates all labels for each user and performs a single save per user at the end. +""" + +import csv +import sys +import argparse +from collections import defaultdict + +from portality.models.editors import EditorGroup +from portality.models.account import Account +from portality import datasets, constants +from portality.lib import isolang +from portality.core import app + + +def resolve_country_code(name: str): + """Return a 2-character country code for a given country name, or None if not found.""" + if not name: + return None + code = datasets.get_country_code(name, fail_if_not_found=True) + return code + + +def resolve_language_code(name: str): + """Return a 2-character language code (alpha2) for a given language name, or None if not found.""" + if not name: + return None + lang = isolang.find(name) + if not lang: + return None + # isolang.find returns a dict with 'alpha2' key + return lang.get('alpha2') + + +def read_pairs_from_csv(path): + """Read CSV and return list of (label, editor_group_name) pairs using the first two columns. + + Expects two columns with headers; will take the first and second header values. + """ + pairs = [] + with open(path, newline='') as fh: + reader = csv.DictReader(fh) + headers = reader.fieldnames + if not headers or len(headers) < 2: + raise ValueError(f"CSV at {path} must have at least two columns with headers") + col_label = headers[0] + col_group = headers[1] + for row in reader: + label = (row.get(col_label) or '').strip() + group = (row.get(col_group) or '').strip() + if label and group: + pairs.append((label, group)) + return pairs + + +def collate_attributes(country_pairs, language_pairs): + """Process pairs and collate desired attributes per account id. + + Returns mapping: account_id -> { 'country': set(...), 'language': set(...) } + """ + account_attrs = defaultdict(lambda: {'country': set(), 'language': set()}) + + def _collect_for_group(group_name, code, attr_type): + eg = EditorGroup.group_by_name(group_name) + if eg is None: + app.logger.warning(f"EditorGroup not found: '{group_name}'") + print(f"WARNING: EditorGroup not found: '{group_name}'") + return + + # collect maned, editor, associates + acct_ids = set() + if eg.maned: + acct_ids.add(eg.maned) + if eg.editor: + acct_ids.add(eg.editor) + for a in eg.associates or []: + acct_ids.add(a) + + for aid in acct_ids: + if not aid: + continue + account_attrs[aid][attr_type].add(code) + + # countries + for country_name, group_name in country_pairs: + code = resolve_country_code(country_name) + if code is None: + app.logger.warning(f"Unable to resolve country '{country_name}'") + print(f"WARNING: Unable to resolve country '{country_name}'") + continue + _collect_for_group(group_name, code.upper(), 'country') + + # languages + for lang_name, group_name in language_pairs: + code = resolve_language_code(lang_name) + if code is None: + app.logger.warning(f"Unable to resolve language '{lang_name}'") + print(f"WARNING: Unable to resolve language '{lang_name}'") + continue + _collect_for_group(group_name, code.upper(), 'language') + + return account_attrs + + +def apply_attributes(account_attrs, dry_run=False): + """Apply collated attributes to Account objects and save them once each. + + Returns a summary dict. + """ + summary = {'updated': 0, 'skipped_missing_account': 0} + for aid, attrs in account_attrs.items(): + acc = Account.pull(aid) + if acc is None: + summary['skipped_missing_account'] += 1 + app.logger.warning(f"Account not found: {aid}") + print(f"WARNING: Account not found: {aid}") + continue + + changed = False + # countries + for c in sorted(attrs.get('country', [])): + try: + if not acc.has_attribute(constants.USER_ATTR__COUNTRY, c): + acc.add_attribute(constants.USER_ATTR__COUNTRY, c) + changed = True + except Exception: + app.logger.exception(f"Failed to add country attribute '{c}' to account {aid}") + + for l in sorted(attrs.get('language', [])): + try: + if not acc.has_attribute(constants.USER_ATTR__LANGUAGE, l): + acc.add_attribute(constants.USER_ATTR__LANGUAGE, l) + changed = True + except Exception: + app.logger.exception(f"Failed to add language attribute '{l}' to account {aid}") + + if changed: + if dry_run: + print(f"DRY RUN: Would save account {aid} with new attributes: {attrs}") + else: + acc.save() + print(f"Saved account {aid} (added {len(attrs.get('country', []))} country(s), {len(attrs.get('language', []))} language(s))") + summary['updated'] += 1 + + return summary + + +def main(): + parser = argparse.ArgumentParser(description='Add user attributes from Editor Group CSVs') + parser.add_argument('countries_csv', help='CSV: first col country name, second col Editor Group name') + parser.add_argument('languages_csv', help='CSV: first col language name, second col Editor Group name') + parser.add_argument('--dry-run', action='store_true', help='Do not save changes, just report') + + args = parser.parse_args() + + country_pairs = read_pairs_from_csv(args.countries_csv) + language_pairs = read_pairs_from_csv(args.languages_csv) + + print(f"Read {len(country_pairs)} country rows and {len(language_pairs)} language rows") + + account_attrs = collate_attributes(country_pairs, language_pairs) + + print(f"Collated attributes for {len(account_attrs)} accounts") + + summary = apply_attributes(account_attrs, dry_run=args.dry_run) + + print("Done. Summary:") + print(summary) + + +if __name__ == '__main__': + main() + diff --git a/portality/models/__init__.py b/portality/models/__init__.py index 90ff003185..00a0abc676 100644 --- a/portality/models/__init__.py +++ b/portality/models/__init__.py @@ -35,6 +35,7 @@ from portality.models.data_dump import DataDump from portality.models.journal_csv import JournalCSV from portality.models.ris_export import RISExport +from portality.models.workflow import WorkflowControl, WorkflowControlStateQuery import sys diff --git a/portality/models/account.py b/portality/models/account.py index bd733d98f2..4db0956c14 100644 --- a/portality/models/account.py +++ b/portality/models/account.py @@ -19,7 +19,7 @@ def __init__(self, **kwargs): super(Account, self).__init__(**kwargs) @classmethod - def make_account(cls, email, username=None, name=None, roles=None, associated_journal_ids=None): + def make_account(cls, email, username=None, name=None, roles=None, associated_journal_ids=None, attributes:dict[str, list]=None): if roles is None: roles = [] @@ -39,9 +39,17 @@ def make_account(cls, email, username=None, name=None, roles=None, associated_jo for role in roles: a.add_role(role) + for jid in associated_journal_ids: a.add_journal(jid) + if attributes is not None: + for attr_type, value in attributes.items(): + if not isinstance(value, list): + value = [value] + for v in value: + a.add_attribute(attr_type, v) + # New accounts don't have passwords set - create a reset token for password. reset_token = uuid.uuid4().hex # give them 14 days to create their first password if timeout not specified in config @@ -219,6 +227,56 @@ def set_role(self, role): role = [role] self.data["role"] = role + ############################### + ## user attributes + + @property + def attributes(self): + return self.data.get("attributes") + + @attributes.deleter + def attributes(self): + if "attributes" in self.data: + del self.data["attributes"] + + @property + def attribute_workflow(self): + return self.data.get("attributes", {}).get(constants.USER_ATTR__WORKFLOW, []) + + @property + def attribute_language(self): + return self.data.get("attributes", {}).get(constants.USER_ATTR__LANGUAGE, []) + + @property + def attribute_country(self): + return self.data.get("attributes", {}).get(constants.USER_ATTR__COUNTRY, []) + + @property + def attribute_tag(self): + return self.data.get("attributes", {}).get(constants.USER_ATTR__TAG, []) + + def add_attribute(self, attribute_type, value): + if attribute_type not in constants.USER_ATTR__ALL: + raise ValueError("Unknown user attribute type: {}".format(attribute_type)) + if "attributes" not in self.data: + self.data["attributes"] = {} + if attribute_type not in self.data["attributes"]: + self.data["attributes"][attribute_type] = [] + if value not in self.data["attributes"][attribute_type]: + self.data["attributes"][attribute_type].append(value) + + def has_attribute(self, attribute_type, value): + if attribute_type not in constants.USER_ATTR__ALL: + raise ValueError("Unknown user attribute type: {}".format(attribute_type)) + return value in self.data.get("attributes", {}).get(attribute_type, []) + + def get_attributes(self, attribute_type): + if attribute_type not in constants.USER_ATTR__ALL: + raise ValueError("Unknown user attribute type: {}".format(attribute_type)) + return self.data.get("attributes", {}).get(attribute_type, []) + + ####################### + def prep(self): self.data['last_updated'] = dates.now_str() @@ -273,3 +331,32 @@ def is_enable_publisher_email(cls) -> bool: # TODO: in the long run this needs to move out to the user's email preferences but for now it # is here to replicate the behaviour in the code it replaces return app.config.get("ENABLE_PUBLISHER_EMAIL", False) + + @classmethod + def find_by_attributes(cls, attribute_types_and_values:list[tuple[str, str]], limit=1000): + q = AttributesQuery(attribute_types_and_values, limit) + return cls.object_query(q.query()) + + +class AttributesQuery: + def __init__(self, attribute_types_and_values, page_size): + self._tup = attribute_types_and_values + self._size = page_size + + def query(self): + musts = [] + for t, v in self._tup.items(): + if not isinstance(v, list): + v = [v] + f = {"terms": {f"attribute.{t}.exact": v}} + musts.append(f) + + q = { + "query": { + "bool": { + "must": musts + } + }, + "size": self._size + } + return q diff --git a/portality/models/workflow.py b/portality/models/workflow.py new file mode 100644 index 0000000000..c17e14e4a5 --- /dev/null +++ b/portality/models/workflow.py @@ -0,0 +1,558 @@ +from copy import deepcopy +from datetime import datetime +from typing import Union + +from portality.dao import DomainObject +from portality.lib import es_data_mapping, dates +from portality.lib.coerce import COERCE_MAP +from portality.lib.seamless import SeamlessMixin +from portality.core import app +from portality.models import Application, Account + +import json + +TRIAGE_FIELD = { + "fields": { + "compliant": {"coerce": "bool"}, + "sv": {"coerce": "integer"}, + }, + "lists": { + "note_ids": {"contains": "field", "coerce": "unicode"}, + "changes": {"contains": "object"}, + }, + "objects": [ + "changes" + ], + "structs": { + "changes": { + "audit_id": {"coerce": "unicode"}, + "note_id": {"coerce": "unicode"}, + } + } +} + +TRIAGE_FIELD_WITH_EXCEPTIONS = deepcopy(TRIAGE_FIELD) +TRIAGE_FIELD_WITH_EXCEPTIONS["objects"].append("exceptions") +TRIAGE_FIELD_WITH_EXCEPTIONS["structs"]["exceptions"] = {} + +DATABASE_NOT_REMOVED_NO_EMBARGO_FIELD = deepcopy(TRIAGE_FIELD_WITH_EXCEPTIONS) +DATABASE_NOT_REMOVED_NO_EMBARGO_FIELD["structs"]["exceptions"] = { + "fields": { + "ignore_embargo": {"coerce": "bool"},#b1a + "website_unavailable": {"coerce": "bool"},#b1b + "content_volume": {"coerce": "bool"} #b1c + } +} + +DATABASE_NO_ACTIVE_EMBARGO_FIELD = deepcopy(TRIAGE_FIELD_WITH_EXCEPTIONS) +DATABASE_NO_ACTIVE_EMBARGO_FIELD["structs"]["exceptions"] = { + "fields": { + "confirmed_issn": {"coerce": "bool"},#b2a + "ignore_embargo": {"coerce": "bool"},#b2b + "website_unavailable": {"coerce": "bool"},#b2c + "content_volume": {"coerce": "bool"}#b2d + } +} + +CONTENT_NOT_NEW_OR_FLIPPED = deepcopy(TRIAGE_FIELD_WITH_EXCEPTIONS) +CONTENT_NOT_NEW_OR_FLIPPED["structs"]["exceptions"] = { + "fields": { + "publishing_history": {"coerce": "bool"} #e6a + } +} + + +TRIAGE_STRUCT = { + "fields": { + "has_minimal_review": {"coerce": "bool"}, + "total_sv": {"coerce": "integer"}, + "last_visited_question": {"coerce": "unicode"}, + }, + "objects": ["questions"], + "structs": { + "questions": { + "fields": { + "admin_special_exception": {"coerce": "unicode"} + }, + "objects": [ + "ethics_not_excluded", #a1 + "ethics_no_nonstandard_metrics", #a2 + "ethics_no_fake_impact", #a3 + "ethics_no_false_doaj_claim", #a4 + "ethics_ttp_gt_3wk", #a5 + "ethics_no_suspicious_ties", #a6 + + "database_not_removed_no_embargo", #b1 + "database_no_active_embargo", #b2 + "database_not_listed", #b3 + "database_not_duplicate", #b4 + + "issn_confirmed", #c1 + "issn_journal_name_match", #c2 + "issn_no_continuation", #c3 + + "website_working", #d1 + "website_distinct_urls", #d2 + "website_oa_policy", #d3 + "website_copyright_terms", #d4 + + "content_no_registration", #e1 + "content_no_barrier", #e2 + "content_sufficient_volume", #e3 + "content_unique_article_urls", #e4 + "content_html_pdf", #e5 + "content_not_new_or_flipped", #e6 + + "admin_metadata_accurate", #f1 + "admin_special_exception", #f2 + ], + "structs": { + "ethics_not_excluded": TRIAGE_FIELD, + "ethics_no_nonstandard_metrics": TRIAGE_FIELD, + "ethics_no_fake_impact": TRIAGE_FIELD, + "ethics_no_false_doaj_claim": TRIAGE_FIELD, + "ethics_ttp_gt_3wk": TRIAGE_FIELD, + "ethics_no_suspicious_ties": TRIAGE_FIELD, + + "database_not_removed_no_embargo": DATABASE_NOT_REMOVED_NO_EMBARGO_FIELD, + "database_no_active_embargo": DATABASE_NO_ACTIVE_EMBARGO_FIELD, + "database_not_listed": TRIAGE_FIELD, + "database_not_duplicate": TRIAGE_FIELD, + + "issn_confirmed": TRIAGE_FIELD, + "issn_journal_name_match": TRIAGE_FIELD, + "issn_no_continuation": TRIAGE_FIELD, + + "website_working": TRIAGE_FIELD, + "website_distinct_urls": TRIAGE_FIELD, + "website_oa_policy": TRIAGE_FIELD, + "website_copyright_terms": TRIAGE_FIELD, + + "content_no_registration": TRIAGE_FIELD, + "content_no_barrier": TRIAGE_FIELD, + "content_sufficient_volume": TRIAGE_FIELD, + "content_unique_article_urls": TRIAGE_FIELD, + "content_html_pdf": TRIAGE_FIELD, + "content_not_new_or_flipped": CONTENT_NOT_NEW_OR_FLIPPED, + + "admin_metadata_accurate": TRIAGE_FIELD + } + } + } +} + +STRUCT = { + "fields": { + "id": {"coerce": "unicode"}, + "created_date": {"coerce": "utcdatetime"}, + "last_updated": {"coerce": "utcdatetime"}, + "es_type": {"coerce": "unicode"}, + }, + "lists": { + "audit": {"contains": "object"}, + "labels": {"contains": "field", "coerce": "unicode"} + }, + "objects": ["application", "state", "modules"], + "structs": { + "application": { + "fields": { + "id": {"coerce": "unicode"}, + "title": {"coerce": "unicode"}, + "original": {"coerce": "unicode"}, + } + }, + "audit": { + "fields": { + "user": {"coerce": "unicode"}, + "date": {"coerce": "utcdatetime"}, + "new_state": {"coerce": "unicode"} + }, + "objects": ["new_state"], + "structs": { + "new_state": { + "fields": { + "module": {"coerce": "unicode"}, + "stage": {"coerce": "unicode"}, + "reviewer": {"coerce": "unicode"} + } + } + } + }, + "modules": { + "objects": ["triage", "quick_fail"], + "structs": { + "triage": TRIAGE_STRUCT, + "quick_fail": {} + } + }, + "state": { + "fields": { + "module": {"coerce": "unicode"}, + "stage": {"coerce": "unicode"}, + "reviewer": {"coerce": "unicode"} + } + } + } +} + +MAPPING_OPTS = { + "dynamic": None, + "coerces": app.config["DATAOBJ_TO_MAPPING_DEFAULTS"], + "exceptions": { + "application.original": { + "type": "text" + } + } +} + +class WorkflowControl(SeamlessMixin, DomainObject): + __type__ = "workflow_control" + + __SEAMLESS_STRUCT__ = STRUCT + __SEAMLESS_COERCE__ = COERCE_MAP + + # Generic state definition values + ANY = "*" + UNASSIGNED = "-" + ASSIGNED = "+" + META_STATES = [ANY, UNASSIGNED, ASSIGNED] + + def __init__(self, **kwargs): + # FIXME: hack, to deal with ES integration layer being improperly abstracted + if "_source" in kwargs: + kwargs = kwargs["_source"] + super(WorkflowControl, self).__init__(raw=kwargs) + self._reviewer_object = None + + #################################### + ## Class methods for locating WorkflowControl objects + + @classmethod + def find_by_application(cls, app_id): + q = WorkflowControlQuery(application_id=app_id) + objs = cls.object_query(q.query()) + if len(objs) > 1: + raise ValueError("Multiple WorkflowControl objects found for application id: {}".format(app_id)) + elif len(objs) == 0: + return None + else: + return objs[0] + + #################################### + + def mappings(self): + return es_data_mapping.create_mapping(self.__seamless_struct__.raw, MAPPING_OPTS) + + @property + def data(self): + return self.__seamless__.data + + #################################### + ## state properties + + @property + def module(self): + return self.__seamless__.get_single("state.module") + + @module.setter + def module(self, val): + self.__seamless__.set_single("state.module", val) + + @property + def stage(self): + return self.__seamless__.get_single("state.stage") + + @stage.setter + def stage(self, val): + self.__seamless__.set_single("state.stage", val) + + @property + def reviewer_id(self): + return self.__seamless__.get_single("state.reviewer") + + @reviewer_id.setter + def reviewer_id(self, val): + self.__seamless__.set_single("state.reviewer", val) + + @reviewer_id.deleter + def reviewer_id(self): + self.__seamless__.delete("state.reviewer") + + @property + def reviewer(self): + rid = self.reviewer_id + if rid is None: + self._reviewer_object = None + return None + + if self._reviewer_object is not None: + if self._reviewer_object.id == rid: + return self._reviewer_object + else: + self._reviewer_object = None + + self._reviewer_object = Account.pull(rid) + return self._reviewer_object + + ################################## + ## Application properties + + @property + def application_id(self): + return self.__seamless__.get_single("application.id") + + @application_id.setter + def application_id(self, val): + self.__seamless__.set_single("application.id", val) + + @property + def application_title(self): + return self.__seamless__.get_single("application.title") + + @application_title.setter + def application_title(self, val): + self.__seamless__.set_single("application.title", val) + + @property + def original_application_raw(self): + return self.__seamless__.get_single("application.original") + + @original_application_raw.setter + def original_application_raw(self, val): + self.__seamless__.set_single("application.original", val) + + @property + def original_application_json(self): + return json.loads(self.original_application_raw) + + @property + def original_application(self): + j = self.original_application_json + return Application(**j) + + @original_application.setter + def original_application(self, val): + raw = json.dumps(val.data) + self.original_application_raw = raw + + ################################## + ## Module specifics + + @property + def triage(self): + t = self.__seamless__.get_single("modules.triage") + if t is None: + self.__seamless__.set_single("modules.triage", {}) + t = self.__seamless__.get_single("modules.triage") + return Triage(t) + + ################################## + ## Audit + + def add_audit(self, actor:Union[str, Account], new_state:dict, date:Union[str, datetime]=None): + if date is None: + date = dates.now() + if isinstance(actor, Account): + actor = actor.id + + audit_entry = { + "user": actor, + "date": date, + "new_state": new_state + } + + self.__seamless__.add_to_list_with_struct("audit", audit_entry) + + @property + def audit(self): + return self.__seamless__.get_list("audit") + + ################################## + ## labelling + + @property + def labels(self): + return self.__seamless__.get_list("labels") + + @labels.setter + def labels(self, val): + self.__seamless__.set_with_struct("labels", val) + + def add_label(self, label:str): + self.__seamless__.add_to_list("labels", label, unique=True) + + def remove_label(self, label:str): + self.__seamless__.delete_from_list("labels", label) + + +class TriageField(SeamlessMixin): + __SEAMLESS_STRUCT__ = TRIAGE_FIELD + __SEAMLESS_COERCE__ = COERCE_MAP + + def __init__(self, raw=None, **kwargs): + super(TriageField, self).__init__(raw=raw, **kwargs) + + @property + def compliant(self) -> bool: + return self.__seamless__.get_single("compliant") + + @property + def severity_value(self) -> int: + return self.__seamless__.get_single("sv") + + @property + def note_ids(self): + return self.__seamless__.get_list("note_ids") + + @property + def changes(self): + return self.__seamless__.get_list("changes") + +class DatabaseNotRemovedNoEmbargoField(TriageField): + __SEAMLESS_STRUCT__ = DATABASE_NOT_REMOVED_NO_EMBARGO_FIELD + + @property + def ignore_embargo(self): + return self.__seamless__.get_single("exceptions.ignore_embargo") + + @ignore_embargo.setter + def ignore_embargo(self, val): + self.__seamless__.set_with_struct("exceptions.ignore_embargo", val) + +class Triage(SeamlessMixin): + __SEAMLESS_STRUCT__ = TRIAGE_STRUCT + __SEAMLESS_COERCE__ = COERCE_MAP + + def __init__(self, raw=None, **kwargs): + super(Triage, self).__init__(raw=raw, **kwargs) + + @property + def data(self): + return self.__seamless__.data + + @property + def has_minimal_review(self): + return self.__seamless__.get_single("has_minimal_review") + + @has_minimal_review.setter + def has_minimal_review(self, val): + self.__seamless__.set_single("has_minimal_review", val) + + def _get_triage_field(self, field): + t = self.__seamless__.get_single(f"questions.{field}") + if t is None: + self.__seamless__.set_single(f"questions.{field}", {}) + t = self.__seamless__.get_single(f"questions.{field}") + return TriageField(t) + + def _calculate_severity_value(self): + total = 0 + for k, v in self.__seamless__.get_single("questions", []).items(): + if "sv" in v: + total += v["sv"] + self.__seamless__.set_with_struct("total_sv", total) + + @property + def total_severity_value(self): + return self.__seamless__.get_single("total_sv") + + def _set_question(self, field:str, value:bool, sv:int=None, exception:int=None, note:"Note"=None): + obj = { + "value": value, + } + if sv is not None: + obj["sv"] = sv + if exception is not None: + obj["exception"] = exception + if note is not None: + obj["note"] = note.id + + self.__seamless__.set_with_struct(f"questions.{field}", obj) + self._calculate_severity_value() + + @property + def ethics_not_excluded(self) -> TriageField: + return self._get_triage_field("ethics_not_excluded") + + @property + def database_not_removed_no_embargo(self): + pass + + +########################################## + +class WorkflowControlQuery: + def __init__(self, application_id=None): + self._application_id = application_id + + def query(self): + return { + "query": { + "bool": { + "must": [ + {"term": {"application.id.exact": self._application_id}} + ] + } + } + } + +class WorkflowControlStateQuery: + def __init__(self, + module:str=None, + stage:str=None, + reviewer:str=None, + size:int=100): + self._module = module + self._stage = stage + self._reviewer = reviewer + self._size = size + + @property + def size(self): + return self._size + + @size.setter + def size(self, size:int): + self._size = size + + def query(self): + must = [] + must_not = [] + + if self._module is not None: + if self._module != WorkflowControl.ANY: + if self._module == WorkflowControl.UNASSIGNED: + must_not.append({"exists": {"field": "state.module"}}) + elif self._module == WorkflowControl.ASSIGNED: + must.append({"exists": {"field": "state.module"}}) + else: + must.append({"term": {"state.module.exact": self._module}}) + + if self._stage is not None: + if self._stage != WorkflowControl.ANY: + if self._stage == WorkflowControl.UNASSIGNED: + must_not.append({"exists": {"field": "state.stage"}}) + elif self._stage == WorkflowControl.ASSIGNED: + must.append({"exists": {"field": "state.stage"}}) + else: + must.append({"term": {"state.stage.exact": self._stage}}) + + if self._reviewer is not None: + if self._reviewer != WorkflowControl.ANY: + if self._reviewer == WorkflowControl.UNASSIGNED: + must_not.append({"exists": {"field": "state.reviewer"}}) + elif self._reviewer == WorkflowControl.ASSIGNED: + must.append({"exists": {"field": "state.reviewer"}}) + else: + must.append({"term": {"state.reviewer.exact": self._reviewer}}) + + bool = {} + if len(must) > 0: + bool["must"] = must + if len(must_not) > 0: + bool["must_not"] = must_not + q = {"query": {"bool": bool}} + + q["sort"] = {"created_date": {"order": "asc"}} + + return q \ No newline at end of file diff --git a/portality/settings.py b/portality/settings.py index 4ff8dcc711..64c297ce1f 100644 --- a/portality/settings.py +++ b/portality/settings.py @@ -511,6 +511,7 @@ "portality.models.ur_review_route.URReviewRoute", # ~~-> URReviewRoute:Model~~ "portality.models.admin_alert.AdminAlert", # ~~-> AdminAlert:Model~~ "portality.models.ris_export.RISExport", + "portality.models.workflow.WorkflowControl" ] # Map from dataobj coercion declarations to ES mappings diff --git a/portality/templates-v2/_account/includes/_edit_form_js.html b/portality/templates-v2/_account/includes/_edit_form_js.html index bb6cf3ebfe..d313f79361 100644 --- a/portality/templates-v2/_account/includes/_edit_form_js.html +++ b/portality/templates-v2/_account/includes/_edit_form_js.html @@ -2,8 +2,71 @@