class WorkflowJobOptions(BaseModel): class Meta: abstract = True extra_vars = accepts_json( prevent_search(models.TextField( blank=True, default='', ))) allow_simultaneous = models.BooleanField(default=False) extra_vars_dict = VarsDictProperty('extra_vars', True) @property def workflow_nodes(self): raise NotImplementedError() @classmethod def _get_unified_job_field_names(cls): return set(f.name for f in WorkflowJobOptions._meta.fields) | set( # NOTE: if other prompts are added to WFJT, put fields in WJOptions, remove inventory [ 'name', 'description', 'schedule', 'survey_passwords', 'labels', 'inventory' ]) def _create_workflow_nodes(self, old_node_list, user=None): node_links = {} for old_node in old_node_list: if user: new_node = old_node.create_wfjt_node_copy( user, workflow_job_template=self) else: new_node = old_node.create_workflow_job_node(workflow_job=self) node_links[old_node.pk] = new_node return node_links def _inherit_node_relationships(self, old_node_list, node_links): for old_node in old_node_list: new_node = node_links[old_node.pk] for relationship in [ 'always_nodes', 'success_nodes', 'failure_nodes' ]: old_manager = getattr(old_node, relationship) for old_child_node in old_manager.all(): new_child_node = node_links[old_child_node.pk] new_manager = getattr(new_node, relationship) new_manager.add(new_child_node) def copy_nodes_from_original(self, original=None, user=None): old_node_list = original.workflow_nodes.prefetch_related( 'always_nodes', 'success_nodes', 'failure_nodes').all() node_links = self._create_workflow_nodes(old_node_list, user=user) self._inherit_node_relationships(old_node_list, node_links) def create_relaunch_workflow_job(self): new_workflow_job = self.copy_unified_job() if self.unified_job_template_id is None: new_workflow_job.copy_nodes_from_original(original=self) return new_workflow_job
class WorkflowJobOptions(BaseModel): class Meta: abstract = True extra_vars = prevent_search(models.TextField( blank=True, default='', )) allow_simultaneous = models.BooleanField(default=False) extra_vars_dict = VarsDictProperty('extra_vars', True) @property def workflow_nodes(self): raise NotImplementedError() def _create_workflow_nodes(self, old_node_list, user=None): node_links = {} for old_node in old_node_list: if user: new_node = old_node.create_wfjt_node_copy( user, workflow_job_template=self) else: new_node = old_node.create_workflow_job_node(workflow_job=self) node_links[old_node.pk] = new_node return node_links def _inherit_node_relationships(self, old_node_list, node_links): for old_node in old_node_list: new_node = node_links[old_node.pk] for relationship in [ 'always_nodes', 'success_nodes', 'failure_nodes' ]: old_manager = getattr(old_node, relationship) for old_child_node in old_manager.all(): new_child_node = node_links[old_child_node.pk] new_manager = getattr(new_node, relationship) new_manager.add(new_child_node) def copy_nodes_from_original(self, original=None, user=None): old_node_list = original.workflow_nodes.prefetch_related( 'always_nodes', 'success_nodes', 'failure_nodes').all() node_links = self._create_workflow_nodes(old_node_list, user=user) self._inherit_node_relationships(old_node_list, node_links) def create_relaunch_workflow_job(self): new_workflow_job = self.copy_unified_job() if self.workflow_job_template is None: new_workflow_job.copy_nodes_from_original(original=self) return new_workflow_job