1
1
import graphviz
2
- from optparse import make_option
3
2
from itertools import chain
4
3
4
+ from django .apps import apps
5
5
from 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
13
7
14
8
from django_fsm import FSMFieldMixin , GET_STATE , RETURN_VALUE
15
9
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
-
29
10
30
11
def 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 )]
35
13
36
14
37
15
def node_name (field , state ):
@@ -40,7 +18,7 @@ def node_name(field, state):
40
18
41
19
42
20
def 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" )):
44
22
return force_str (dict (field .choices ).get (state ))
45
23
else :
46
24
return state
@@ -137,54 +115,26 @@ def get_graphviz_layouts():
137
115
138
116
139
117
class 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
-
186
118
help = "Creates a GraphViz dot file with transitions for selected fields"
187
119
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
+
188
138
def render_output (self , graph , ** options ):
189
139
filename , format = options ["outputfile" ].rsplit ("." , 1 )
190
140
@@ -199,35 +149,19 @@ def handle(self, *args, **options):
199
149
field_spec = arg .split ("." )
200
150
201
151
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 )
208
154
for model in models :
209
155
fields_data += all_fsm_fields_data (model )
210
156
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 ])
215
158
fields_data += all_fsm_fields_data (model )
216
159
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 ])
221
161
fields_data += all_fsm_fields_data (model )
222
162
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 )
231
165
dotdata = generate_dot (fields_data )
232
166
233
167
if options ["outputfile" ]:
0 commit comments