@@ -170,12 +170,23 @@ def on_error(self):
170170 pass
171171
172172
173+ class BlogPostState (models .IntegerChoices ):
174+ NEW = 0 , "New"
175+ PUBLISHED = 1 , "Published"
176+ HIDDEN = 2 , "Hidden"
177+ REMOVED = 3 , "Removed"
178+ RESTORED = 4 , "Restored"
179+ MODERATED = 5 , "Moderated"
180+ STOLEN = 6 , "Stolen"
181+ FAILED = 7 , "Failed"
182+
183+
173184class BlogPost (models .Model ):
174185 """
175186 Test workflow
176187 """
177188
178- state = FSMField (default = "new" , protected = True )
189+ state = FSMField (choices = BlogPostState . choices , default = BlogPostState . NEW , protected = True )
179190
180191 class Meta :
181192 permissions = [
@@ -186,41 +197,53 @@ class Meta:
186197 def can_restore (self , user ):
187198 return user .is_superuser or user .is_staff
188199
189- @transition (field = state , source = "new" , target = "published" , on_error = "failed" , permission = "testapp.can_publish_post" )
200+ @transition (
201+ field = state ,
202+ source = BlogPostState .NEW ,
203+ target = BlogPostState .PUBLISHED ,
204+ on_error = BlogPostState .FAILED ,
205+ permission = "testapp.can_publish_post" ,
206+ )
190207 def publish (self ):
191208 pass
192209
193- @transition (field = state , source = "published" )
210+ @transition (field = state , source = BlogPostState . PUBLISHED )
194211 def notify_all (self ):
195212 pass
196213
197214 @transition (
198215 field = state ,
199- source = "published" ,
200- target = "hidden" ,
201- on_error = "failed" ,
216+ source = BlogPostState . PUBLISHED ,
217+ target = BlogPostState . HIDDEN ,
218+ on_error = BlogPostState . FAILED ,
202219 )
203220 def hide (self ):
204221 pass
205222
206223 @transition (
207224 field = state ,
208- source = "new" ,
209- target = "removed" ,
210- on_error = "failed" ,
225+ source = BlogPostState . NEW ,
226+ target = BlogPostState . REMOVED ,
227+ on_error = BlogPostState . FAILED ,
211228 permission = lambda _ , u : u .has_perm ("testapp.can_remove_post" ),
212229 )
213230 def remove (self ):
214231 raise Exception (f"No rights to delete { self } " )
215232
216- @transition (field = state , source = "new" , target = "restored" , on_error = "failed" , permission = can_restore )
233+ @transition (
234+ field = state ,
235+ source = BlogPostState .NEW ,
236+ target = BlogPostState .RESTORED ,
237+ on_error = BlogPostState .FAILED ,
238+ permission = can_restore ,
239+ )
217240 def restore (self ):
218241 pass
219242
220- @transition (field = state , source = ["published" , "hidden" ], target = "stolen" )
243+ @transition (field = state , source = [BlogPostState . PUBLISHED , BlogPostState . HIDDEN ], target = BlogPostState . STOLEN )
221244 def steal (self ):
222245 pass
223246
224- @transition (field = state , source = "*" , target = "moderated" )
247+ @transition (field = state , source = "*" , target = BlogPostState . MODERATED )
225248 def moderate (self ):
226249 pass
0 commit comments