@@ -16,58 +16,64 @@ def convert_timer_expressions(dct):
1616
1717 message = "Unable to convert time specifications for {spec}. This most likely because the values are set during workflow execution."
1818
19+ # Moving this code into helper functions to make sonarcloud STFU about this file.
20+ # Don't really consider this better but whatever.
21+
22+ def convert_timedate (spec ):
23+ expr = spec ['event_definition' ].pop ('dateTime' )
24+ try :
25+ dt = eval (expr )
26+ if isinstance (dt , datetime ):
27+ spec ['event_definition' ]['expression' ] = f"'{ dt .isoformat ()} '"
28+ spec ['event_definition' ]['typename' ] = 'TimeDateEventDefinition'
29+ elif isinstance (dt , timedelta ):
30+ spec ['event_definition' ]['expression' ] = f"'{ td_to_iso (dt )} '"
31+ spec ['event_definition' ]['typename' ] = 'DurationTimerEventDefinition'
32+ except :
33+ raise VersionMigrationError (message .format (spec = spec ['name' ]))
34+
35+ def convert_cycle (spec , task ):
36+ expr = spec ['event_definition' ].pop ('cycle_definition' )
37+ try :
38+ repeat , duration = eval (expr )
39+ spec ['event_definition' ]['expression' ] = f"'R{ repeat } /{ td_to_iso (duration )} '"
40+ if task is not None :
41+ cycles_complete = task ['data' ].pop ('repeat_count' , 0 )
42+ start_time = task ['internal_data' ].pop ('start_time' , None )
43+ if start_time is not None :
44+ dt = datetime .fromisoformat (start_time )
45+ task ['internal_data' ]['event_value' ] = {
46+ 'cycles' : repeat - cycles_complete ,
47+ 'next' : datetime .combine (dt .date (), dt .time (), LOCALTZ ).isoformat (),
48+ 'duration' : duration .total_seconds (),
49+ }
50+ except :
51+ raise VersionMigrationError (message .format (spec = spec ['name' ]))
52+
53+ if spec ['typename' ] == 'StartEvent' :
54+ spec ['outputs' ].remove (spec ['name' ])
55+ if task is not None :
56+ children = [ dct ['tasks' ][c ] for c in task ['children' ] ]
57+ # Formerly cycles were handled by looping back and reusing the tasks so this removes the extra tasks
58+ remove = [ c for c in children if c ['task_spec' ] == task ['task_spec' ]][0 ]
59+ for task_id in remove ['children' ]:
60+ child = dct ['tasks' ][task_id ]
61+ if child ['task_spec' ].startswith ('return' ) or child ['state' ] != TaskState .COMPLETED :
62+ dct ['tasks' ].pop (task_id )
63+ else :
64+ task ['children' ].append (task_id )
65+ task ['children' ].remove (remove ['id' ])
66+ dct ['tasks' ].pop (remove ['id' ])
67+
1968 has_timer = lambda ts : 'event_definition' in ts and ts ['event_definition' ]['typename' ] in [ 'CycleTimerEventDefinition' , 'TimerEventDefinition' ]
2069 for spec in [ ts for ts in dct ['spec' ]['task_specs' ].values () if has_timer (ts ) ]:
2170 spec ['event_definition' ]['name' ] = spec ['event_definition' ].pop ('label' )
2271 if spec ['event_definition' ]['typename' ] == 'TimerEventDefinition' :
23- expr = spec ['event_definition' ].pop ('dateTime' )
24- try :
25- dt = eval (expr )
26- if isinstance (dt , datetime ):
27- spec ['event_definition' ]['expression' ] = f"'{ dt .isoformat ()} '"
28- spec ['event_definition' ]['typename' ] = 'TimeDateEventDefinition'
29- elif isinstance (dt , timedelta ):
30- spec ['event_definition' ]['expression' ] = f"'{ td_to_iso (dt )} '"
31- spec ['event_definition' ]['typename' ] = 'DurationTimerEventDefinition'
32- except :
33- raise VersionMigrationError (message .format (spec = spec ['name' ]))
34-
72+ convert_timedate (spec )
3573 if spec ['event_definition' ]['typename' ] == 'CycleTimerEventDefinition' :
36-
3774 tasks = [ t for t in dct ['tasks' ].values () if t ['task_spec' ] == spec ['name' ] ]
3875 task = tasks [0 ] if len (tasks ) > 0 else None
39-
40- expr = spec ['event_definition' ].pop ('cycle_definition' )
41- try :
42- repeat , duration = eval (expr )
43- spec ['event_definition' ]['expression' ] = f"'R{ repeat } /{ td_to_iso (duration )} '"
44- if task is not None :
45- cycles_complete = task ['data' ].pop ('repeat_count' , 0 )
46- start_time = task ['internal_data' ].pop ('start_time' , None )
47- if start_time is not None :
48- dt = datetime .fromisoformat (start_time )
49- task ['internal_data' ]['event_value' ] = {
50- 'cycles' : repeat - cycles_complete ,
51- 'next' : datetime .combine (dt .date (), dt .time (), LOCALTZ ).isoformat (),
52- 'duration' : duration .total_seconds (),
53- }
54- except :
55- raise VersionMigrationError (message .format (spec = spec ['name' ]))
56-
57- if spec ['typename' ] == 'StartEvent' :
58- spec ['outputs' ].remove (spec ['name' ])
59- if task is not None :
60- children = [ dct ['tasks' ][c ] for c in task ['children' ] ]
61- # Formerly cycles were handled by looping back and reusing the tasks so this removes the extra tasks
62- remove = [ c for c in children if c ['task_spec' ] == task ['task_spec' ]][0 ]
63- for task_id in remove ['children' ]:
64- child = dct ['tasks' ][task_id ]
65- if child ['task_spec' ].startswith ('return' ) or child ['state' ] != TaskState .COMPLETED :
66- dct ['tasks' ].pop (task_id )
67- else :
68- task ['children' ].append (task_id )
69- task ['children' ].remove (remove ['id' ])
70- dct ['tasks' ].pop (remove ['id' ])
76+ convert_cycle (spec , task )
7177
7278def add_default_condition_to_cond_task_specs (dct ):
7379
@@ -122,3 +128,18 @@ def remove_loop_reset(dct):
122128 parent = dct ['tasks' ].get (task ['parent' ])
123129 parent ['children' ] = [c for c in parent ['children' ] if c != task ['id' ]]
124130 dct ['spec' ]['task_specs' ].pop (spec ['name' ])
131+
132+ def update_task_states (dct ):
133+
134+ def update (process ):
135+ for task in process ['tasks' ].values ():
136+ if task ['state' ] == 32 :
137+ task ['state' ] = TaskState .COMPLETED
138+ elif task ['state' ] == 64 :
139+ task ['state' ] = TaskState .CANCELLED
140+
141+ root = dct ['tasks' ].get (dct ['root' ])
142+ if root ['state' ] == 32 :
143+ update (dct )
144+ for sp in dct ['subprocesses' ].values ():
145+ update (sp )
0 commit comments