diff --git a/openpype/pipeline/create/context.py b/openpype/pipeline/create/context.py index 574d514251..5131ccb8eb 100644 --- a/openpype/pipeline/create/context.py +++ b/openpype/pipeline/create/context.py @@ -672,7 +672,8 @@ class CreateContext: self.plugins_with_defs = [] self._attr_plugins_by_family = {} - self._ignore_added_instances = False + self._bulk_counter = 0 + self._bulk_instances_to_process = [] if reset: self.reset(discover_publish_plugins) @@ -703,12 +704,10 @@ class CreateContext: self.reset_plugins(discover_publish_plugins) self.reset_context_data() - with self.ignore_added_instances(): + with self.bulk_instances_collection(): self.reset_instances() self.execute_autocreators() - self.validate_instances_context() - def reset_plugins(self, discover_publish_plugins=True): import avalon.api import pyblish.logic @@ -806,19 +805,41 @@ class CreateContext: def creator_adds_instance(self, instance): self.instances.append(instance) - if not self._ignore_added_instances: - self.validate_instances_context([instance]) + attr_plugins = self._get_publish_plugins_with_attr_for_family( + instance.creator.family + ) + instance.set_publish_plugins(attr_plugins) + + with self.bulk_instances_collection(): + self._bulk_instances_to_process.append(instance) def creator_removed_instance(self, instance): self.instances.remove(instance) @contextmanager - def ignore_added_instances(self): - self._ignore_added_instances = True + def bulk_instances_collection(self): + """Validate context of instances in bulk. + + This can be used for single instance or for adding multiple instances + which is helpfull on reset. + """ + self._bulk_counter += 1 try: yield finally: - self._ignore_added_instances = False + self._bulk_counter -= 1 + + # Trigger validation if there is no more context manager for bulk + # instance validation + if self._bulk_counter == 0: + ( + self._bulk_instances_to_process, + instances_to_validate + ) = ( + [], + self._bulk_instances_to_process + ) + self.validate_instances_context(instances_to_validate) def reset_instances(self): self.instances = [] diff --git a/openpype/tools/new_publisher/control.py b/openpype/tools/new_publisher/control.py index 0d92a5f516..508d0c01b6 100644 --- a/openpype/tools/new_publisher/control.py +++ b/openpype/tools/new_publisher/control.py @@ -536,10 +536,9 @@ class PublisherController: self._resetting_instances = True self.create_context.reset_context_data() - with self.create_context.ignore_added_instances(): + with self.create_context.bulk_instances_collection(): self.create_context.reset_instances() self.create_context.execute_autocreators() - self.create_context.validate_instances_context() self._resetting_instances = False