22
33from django .db import models
44
5+ from django_fsm import GET_STATE
6+ from django_fsm import RETURN_VALUE
57from django_fsm import FSMField
68from django_fsm import FSMKeyField
79from django_fsm import transition
@@ -15,28 +17,69 @@ class Application(models.Model):
1517
1618 state = FSMField (default = "new" )
1719
18- @transition (field = state , source = "new" , target = "draft " )
19- def draft (self ):
20+ @transition (field = state , source = "new" , target = "published " )
21+ def standard (self ):
2022 pass
2123
22- @transition (field = state , source = ["new" , "draft" ], target = "dept" )
23- def submitted (self ):
24+ @transition (field = state , source = "published" )
25+ def no_target (self ):
26+ pass
27+
28+ @transition (field = state , source = "*" , target = "blocked" )
29+ def any_source (self ):
30+ pass
31+
32+ @transition (field = state , source = "+" , target = "hidden" )
33+ def any_source_except_target (self ):
2434 pass
2535
26- @transition (field = state , source = "dept" , target = "dean" )
27- def dept_approved (self ):
36+ @transition (
37+ field = state ,
38+ source = "new" ,
39+ target = GET_STATE (
40+ lambda _ , allowed : "published" if allowed else "rejected" ,
41+ states = ["published" , "rejected" ],
42+ ),
43+ )
44+ def get_state (self , * , allowed : bool ):
2845 pass
2946
30- @transition (field = state , source = "dept" , target = "new" )
31- def dept_rejected (self ):
47+ @transition (
48+ field = state ,
49+ source = "*" ,
50+ target = GET_STATE (
51+ lambda _ , allowed : "published" if allowed else "rejected" ,
52+ states = ["published" , "rejected" ],
53+ ),
54+ )
55+ def get_state_any_source (self , * , allowed : bool ):
3256 pass
3357
34- @transition (field = state , source = "dean" , target = "done" )
35- def dean_approved (self ):
58+ @transition (
59+ field = state ,
60+ source = "+" ,
61+ target = GET_STATE (
62+ lambda _ , allowed : "published" if allowed else "rejected" ,
63+ states = ["published" , "rejected" ],
64+ ),
65+ )
66+ def get_state_any_source_except_target (self , * , allowed : bool ):
3667 pass
3768
38- @transition (field = state , source = "dean" , target = "dept" )
39- def dean_rejected (self ):
69+ @transition (field = state , source = "new" , target = RETURN_VALUE ("moderated" , "blocked" ))
70+ def return_value (self ):
71+ return "published"
72+
73+ @transition (field = state , source = "*" , target = RETURN_VALUE ("moderated" , "blocked" ))
74+ def return_value_any_source (self ):
75+ return "published"
76+
77+ @transition (field = state , source = "+" , target = RETURN_VALUE ("moderated" , "blocked" ))
78+ def return_value_any_source_except_target (self ):
79+ return "published"
80+
81+ @transition (field = state , source = "new" , target = "published" , on_error = "failed" )
82+ def on_error (self ):
4083 pass
4184
4285
@@ -61,28 +104,69 @@ class FKApplication(models.Model):
61104
62105 state = FSMKeyField (DbState , default = "new" , on_delete = models .CASCADE )
63106
64- @transition (field = state , source = "new" , target = "draft " )
65- def draft (self ):
107+ @transition (field = state , source = "new" , target = "published " )
108+ def standard (self ):
66109 pass
67110
68- @transition (field = state , source = ["new" , "draft" ], target = "dept" )
69- def submitted (self ):
111+ @transition (field = state , source = "published" )
112+ def no_target (self ):
113+ pass
114+
115+ @transition (field = state , source = "*" , target = "blocked" )
116+ def any_source (self ):
117+ pass
118+
119+ @transition (field = state , source = "+" , target = "hidden" )
120+ def any_source_except_target (self ):
70121 pass
71122
72- @transition (field = state , source = "dept" , target = "dean" )
73- def dept_approved (self ):
123+ @transition (
124+ field = state ,
125+ source = "new" ,
126+ target = GET_STATE (
127+ lambda _ , allowed : "published" if allowed else "rejected" ,
128+ states = ["published" , "rejected" ],
129+ ),
130+ )
131+ def get_state (self , * , allowed : bool ):
74132 pass
75133
76- @transition (field = state , source = "dept" , target = "new" )
77- def dept_rejected (self ):
134+ @transition (
135+ field = state ,
136+ source = "*" ,
137+ target = GET_STATE (
138+ lambda _ , allowed : "published" if allowed else "rejected" ,
139+ states = ["published" , "rejected" ],
140+ ),
141+ )
142+ def get_state_any_source (self , * , allowed : bool ):
78143 pass
79144
80- @transition (field = state , source = "dean" , target = "done" )
81- def dean_approved (self ):
145+ @transition (
146+ field = state ,
147+ source = "+" ,
148+ target = GET_STATE (
149+ lambda _ , allowed : "published" if allowed else "rejected" ,
150+ states = ["published" , "rejected" ],
151+ ),
152+ )
153+ def get_state_any_source_except_target (self , * , allowed : bool ):
82154 pass
83155
84- @transition (field = state , source = "dean" , target = "dept" )
85- def dean_rejected (self ):
156+ @transition (field = state , source = "new" , target = RETURN_VALUE ("moderated" , "blocked" ))
157+ def return_value (self ):
158+ return "published"
159+
160+ @transition (field = state , source = "*" , target = RETURN_VALUE ("moderated" , "blocked" ))
161+ def return_value_any_source (self ):
162+ return "published"
163+
164+ @transition (field = state , source = "+" , target = RETURN_VALUE ("moderated" , "blocked" ))
165+ def return_value_any_source_except_target (self ):
166+ return "published"
167+
168+ @transition (field = state , source = "new" , target = "published" , on_error = "failed" )
169+ def on_error (self ):
86170 pass
87171
88172
0 commit comments