11import graphviz
2- from optparse import make_option
32from itertools import chain
43
4+ from django .apps import apps
55from django .core .management .base import BaseCommand
6- try :
7- from django .utils .encoding import force_str
8- _requires_system_checks = True
9- except ImportError : # Django >= 4.0
10- from django .utils .encoding import force_str
11- from django .core .management .base import ALL_CHECKS
12- _requires_system_checks = ALL_CHECKS
6+ from django .utils .encoding import force_str
137
148from django_fsm import FSMFieldMixin , GET_STATE , RETURN_VALUE
159
16- try :
17- from django .db .models import get_apps , get_app , get_models , get_model
18-
19- NEW_META_API = False
20- except ImportError :
21- from django .apps import apps
22-
23- NEW_META_API = True
24-
25- from django import VERSION
26-
27- HAS_ARGPARSE = VERSION >= (1 , 10 )
28-
2910
3011def all_fsm_fields_data (model ):
31- if NEW_META_API :
32- return [(field , model ) for field in model ._meta .get_fields () if isinstance (field , FSMFieldMixin )]
33- else :
34- return [(field , model ) for field in model ._meta .fields if isinstance (field , FSMFieldMixin )]
12+ return [(field , model ) for field in model ._meta .get_fields () if isinstance (field , FSMFieldMixin )]
3513
3614
3715def node_name (field , state ):
@@ -40,7 +18,7 @@ def node_name(field, state):
4018
4119
4220def node_label (field , state ):
43- if type (state ) == int or (type (state ) == bool and hasattr (field , "choices" )):
21+ if isinstance (state , int ) or (isinstance (state , bool ) and hasattr (field , "choices" )):
4422 return force_str (dict (field .choices ).get (state ))
4523 else :
4624 return state
@@ -137,54 +115,26 @@ def get_graphviz_layouts():
137115
138116
139117class Command (BaseCommand ):
140- requires_system_checks = _requires_system_checks
141-
142- if not HAS_ARGPARSE :
143- option_list = BaseCommand .option_list + (
144- make_option (
145- "--output" ,
146- "-o" ,
147- action = "store" ,
148- dest = "outputfile" ,
149- help = (
150- "Render output file. Type of output dependent on file extensions. " "Use png or jpg to render graph to image."
151- ),
152- ),
153- # NOQA
154- make_option (
155- "--layout" ,
156- "-l" ,
157- action = "store" ,
158- dest = "layout" ,
159- default = "dot" ,
160- help = ("Layout to be used by GraphViz for visualization. " "Layouts: %s." % " " .join (get_graphviz_layouts ())),
161- ),
162- )
163- args = "[appname[.model[.field]]]"
164- else :
165-
166- def add_arguments (self , parser ):
167- parser .add_argument (
168- "--output" ,
169- "-o" ,
170- action = "store" ,
171- dest = "outputfile" ,
172- help = (
173- "Render output file. Type of output dependent on file extensions. " "Use png or jpg to render graph to image."
174- ),
175- )
176- parser .add_argument (
177- "--layout" ,
178- "-l" ,
179- action = "store" ,
180- dest = "layout" ,
181- default = "dot" ,
182- help = ("Layout to be used by GraphViz for visualization. " "Layouts: %s." % " " .join (get_graphviz_layouts ())),
183- )
184- parser .add_argument ("args" , nargs = "*" , help = ("[appname[.model[.field]]]" ))
185-
186118 help = "Creates a GraphViz dot file with transitions for selected fields"
187119
120+ def add_arguments (self , parser ):
121+ parser .add_argument (
122+ "--output" ,
123+ "-o" ,
124+ action = "store" ,
125+ dest = "outputfile" ,
126+ help = ("Render output file. Type of output dependent on file extensions. " "Use png or jpg to render graph to image." ),
127+ )
128+ parser .add_argument (
129+ "--layout" ,
130+ "-l" ,
131+ action = "store" ,
132+ dest = "layout" ,
133+ default = "dot" ,
134+ help = ("Layout to be used by GraphViz for visualization. " "Layouts: %s." % " " .join (get_graphviz_layouts ())),
135+ )
136+ parser .add_argument ("args" , nargs = "*" , help = ("[appname[.model[.field]]]" ))
137+
188138 def render_output (self , graph , ** options ):
189139 filename , format = options ["outputfile" ].rsplit ("." , 1 )
190140
@@ -199,35 +149,19 @@ def handle(self, *args, **options):
199149 field_spec = arg .split ("." )
200150
201151 if len (field_spec ) == 1 :
202- if NEW_META_API :
203- app = apps .get_app (field_spec [0 ])
204- models = apps .get_models (app )
205- else :
206- app = get_app (field_spec [0 ])
207- models = get_models (app )
152+ app = apps .get_app (field_spec [0 ])
153+ models = apps .get_models (app )
208154 for model in models :
209155 fields_data += all_fsm_fields_data (model )
210156 elif len (field_spec ) == 2 :
211- if NEW_META_API :
212- model = apps .get_model (field_spec [0 ], field_spec [1 ])
213- else :
214- model = get_model (field_spec [0 ], field_spec [1 ])
157+ model = apps .get_model (field_spec [0 ], field_spec [1 ])
215158 fields_data += all_fsm_fields_data (model )
216159 elif len (field_spec ) == 3 :
217- if NEW_META_API :
218- model = apps .get_model (field_spec [0 ], field_spec [1 ])
219- else :
220- model = get_model (field_spec [0 ], field_spec [1 ])
160+ model = apps .get_model (field_spec [0 ], field_spec [1 ])
221161 fields_data += all_fsm_fields_data (model )
222162 else :
223- if NEW_META_API :
224- for model in apps .get_models ():
225- fields_data += all_fsm_fields_data (model )
226- else :
227- for app in get_apps ():
228- for model in get_models (app ):
229- fields_data += all_fsm_fields_data (model )
230-
163+ for model in apps .get_models ():
164+ fields_data += all_fsm_fields_data (model )
231165 dotdata = generate_dot (fields_data )
232166
233167 if options ["outputfile" ]:
0 commit comments