Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
e74b344
some preliminary thoughts about state machine implementation
richard-jones Dec 15, 2025
8f3a659
Merge branch 'develop' into feature/4076_state_machine_prototype
richard-jones Feb 5, 2026
b7399dc
full working prototype of the state machine
richard-jones Apr 3, 2026
a4b11ad
pretty complete implementation of the triage workflow back-end, and p…
richard-jones Apr 9, 2026
8efbde6
merge up from develop
richard-jones Apr 9, 2026
2854a9a
add latest changes to workflow definition from planning meeting
richard-jones Apr 9, 2026
a477016
refactor workflow service for improved structure and scaleability of …
richard-jones Apr 9, 2026
e094d8c
add support for user attributes on user accounts
richard-jones Apr 30, 2026
5a99d30
updated user test scripts and minor ui changes associated
richard-jones May 6, 2026
24c048a
partial update of state machine for latest layout
richard-jones May 6, 2026
4311e39
Merge branch 'feature/4317_user_attributes' into feature/4076_state_m…
richard-jones May 6, 2026
dc5875b
implement full triage workflow without editor groups, and with full b…
richard-jones May 7, 2026
80ce913
full set of parameterised tests for state transitions
richard-jones May 8, 2026
bd9fa3f
outline of triage question storage model
richard-jones May 12, 2026
c9ac0fd
placeholder for hanging method impl
richard-jones May 19, 2026
640ecaf
signature updates
richard-jones May 22, 2026
226acd1
Merge branch 'develop' into feature/ewp_main
richard-jones May 22, 2026
92779a3
bind formulaic submodule, at least for duration of development
richard-jones May 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
[submodule "portality/static/vendor/edges"]
path = portality/static/vendor/edges
url = https://github.com/CottageLabs/edges.git
url = https://github.com/CottageLabs/edges.git
[submodule "modules/formulaic"]
path = modules/formulaic
url = git@github.com:CottageLabs/formulaic.git
66 changes: 50 additions & 16 deletions doajtest/generate_tests.py
Original file line number Diff line number Diff line change
@@ -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)
if __name__ == "__main__":
main()
2 changes: 1 addition & 1 deletion doajtest/matrices/tasks.public_data_dump/stub.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
277 changes: 277 additions & 0 deletions doajtest/matrices/triage_workflow/triage_workflow.matrix.csv

Large diffs are not rendered by default.

78 changes: 78 additions & 0 deletions doajtest/matrices/triage_workflow/triage_workflow.settings.csv
Original file line number Diff line number Diff line change
@@ -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
Loading
Loading