2
2
3
3
from django .db import models
4
4
5
+ from django_fsm import GET_STATE
6
+ from django_fsm import RETURN_VALUE
5
7
from django_fsm import FSMField
6
8
from django_fsm import FSMKeyField
7
9
from django_fsm import transition
@@ -15,28 +17,69 @@ class Application(models.Model):
15
17
16
18
state = FSMField (default = "new" )
17
19
18
- @transition (field = state , source = "new" , target = "draft " )
19
- def draft (self ):
20
+ @transition (field = state , source = "new" , target = "published " )
21
+ def standard (self ):
20
22
pass
21
23
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 ):
24
34
pass
25
35
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 ):
28
45
pass
29
46
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 ):
32
56
pass
33
57
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 ):
36
67
pass
37
68
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 ):
40
83
pass
41
84
42
85
@@ -61,28 +104,69 @@ class FKApplication(models.Model):
61
104
62
105
state = FSMKeyField (DbState , default = "new" , on_delete = models .CASCADE )
63
106
64
- @transition (field = state , source = "new" , target = "draft " )
65
- def draft (self ):
107
+ @transition (field = state , source = "new" , target = "published " )
108
+ def standard (self ):
66
109
pass
67
110
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 ):
70
121
pass
71
122
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 ):
74
132
pass
75
133
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 ):
78
143
pass
79
144
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 ):
82
154
pass
83
155
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 ):
86
170
pass
87
171
88
172
0 commit comments