@@ -27,14 +27,18 @@ def node_label(field, state):
27
27
return state
28
28
29
29
30
- def generate_dot (fields_data ): # noqa: C901, PLR0912
30
+ def generate_dot (fields_data , ignore_transitions : list [str ] | None = None ): # noqa: C901, PLR0912
31
+ ignore_transitions = ignore_transitions or []
31
32
result = graphviz .Digraph ()
32
33
33
34
for field , model in fields_data :
34
35
sources , targets , edges , any_targets , any_except_targets = set (), set (), set (), set (), set ()
35
36
36
37
# dump nodes and edges
37
38
for transition in field .get_all_transitions (model ):
39
+ if transition .name in ignore_transitions :
40
+ continue
41
+
38
42
_targets = list (
39
43
(state for state in transition .target .allowed_states )
40
44
if isinstance (transition .target , (GET_STATE , RETURN_VALUE ))
@@ -127,7 +131,7 @@ def add_arguments(self, parser):
127
131
"-o" ,
128
132
action = "store" ,
129
133
dest = "outputfile" ,
130
- help = ( "Render output file. Type of output dependent on file extensions. Use png or jpg to render graph to image." ) ,
134
+ help = "Render output file. Type of output dependent on file extensions. Use png or jpg to render graph to image." ,
131
135
)
132
136
parser .add_argument (
133
137
"--layout" ,
@@ -137,6 +141,14 @@ def add_arguments(self, parser):
137
141
default = "dot" ,
138
142
help = f"Layout to be used by GraphViz for visualization. Layouts: { get_graphviz_layouts ()} ." ,
139
143
)
144
+ parser .add_argument (
145
+ "--exclude" ,
146
+ "-e" ,
147
+ action = "store" ,
148
+ dest = "exclude" ,
149
+ default = "" ,
150
+ help = "Ignore transitions with this name." ,
151
+ )
140
152
parser .add_argument ("args" , nargs = "*" , help = ("[appname[.model[.field]]]" ))
141
153
142
154
def render_output (self , graph , ** options ):
@@ -153,9 +165,8 @@ def handle(self, *args, **options):
153
165
field_spec = arg .split ("." )
154
166
155
167
if len (field_spec ) == 1 :
156
- app = apps .get_app (field_spec [0 ])
157
- models = apps .get_models (app )
158
- for model in models :
168
+ app = apps .get_app_config (field_spec [0 ])
169
+ for model in apps .get_models (app ):
159
170
fields_data += all_fsm_fields_data (model )
160
171
if len (field_spec ) == 2 : # noqa: PLR2004
161
172
model = apps .get_model (field_spec [0 ], field_spec [1 ])
@@ -166,7 +177,8 @@ def handle(self, *args, **options):
166
177
else :
167
178
for model in apps .get_models ():
168
179
fields_data += all_fsm_fields_data (model )
169
- dotdata = generate_dot (fields_data )
180
+
181
+ dotdata = generate_dot (fields_data , ignore_transitions = options ["exclude" ].split ("," ))
170
182
171
183
if options ["outputfile" ]:
172
184
self .render_output (dotdata , ** options )
0 commit comments