Merge branch 'develop' into feature/remove-server-addons

This commit is contained in:
Jakub Trllo 2024-07-10 10:06:11 +02:00 committed by GitHub
commit d88caa38c6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 86 additions and 15 deletions

View file

@ -13,6 +13,7 @@ import pyblish.api
import ayon_api
from ayon_core.settings import get_project_settings
from ayon_core.lib import is_func_signature_supported
from ayon_core.lib.attribute_definitions import (
UnknownDef,
serialize_attr_defs,
@ -1404,6 +1405,7 @@ class CreateContext:
self._current_workfile_path = None
self._current_project_settings = None
self._current_project_entity = _NOT_SET
self._current_folder_entity = _NOT_SET
self._current_task_entity = _NOT_SET
self._current_task_type = _NOT_SET
@ -1592,6 +1594,22 @@ class CreateContext:
self._current_task_type = task_type
return self._current_task_type
def get_current_project_entity(self):
"""Project entity for current context project.
Returns:
Union[dict[str, Any], None]: Folder entity.
"""
if self._current_project_entity is not _NOT_SET:
return copy.deepcopy(self._current_project_entity)
project_entity = None
project_name = self.get_current_project_name()
if project_name:
project_entity = ayon_api.get_project(project_name)
self._current_project_entity = project_entity
return copy.deepcopy(self._current_project_entity)
def get_current_folder_entity(self):
"""Folder entity for current context folder.
@ -1788,6 +1806,7 @@ class CreateContext:
self._current_task_name = task_name
self._current_workfile_path = workfile_path
self._current_project_entity = _NOT_SET
self._current_folder_entity = _NOT_SET
self._current_task_entity = _NOT_SET
self._current_task_type = _NOT_SET
@ -2083,13 +2102,22 @@ class CreateContext:
# TODO validate types
_pre_create_data.update(pre_create_data)
product_name = creator.get_product_name(
project_entity = self.get_current_project_entity()
args = (
project_name,
folder_entity,
task_entity,
variant,
self.host_name,
)
kwargs = {"project_entity": project_entity}
# Backwards compatibility for 'project_entity' argument
# - 'get_product_name' signature changed 24/07/08
if not is_func_signature_supported(
creator.get_product_name, *args, **kwargs
):
kwargs.pop("project_entity")
product_name = creator.get_product_name(*args, **kwargs)
instance_data = {
"folderPath": folder_entity["path"],

View file

@ -297,7 +297,6 @@ class BaseCreator:
))
setattr(self, key, value)
@property
def identifier(self):
"""Identifier of creator (must be unique).
@ -493,7 +492,8 @@ class BaseCreator:
task_entity,
variant,
host_name=None,
instance=None
instance=None,
project_entity=None,
):
"""Return product name for passed context.
@ -510,8 +510,9 @@ class BaseCreator:
instance (Optional[CreatedInstance]): Object of 'CreatedInstance'
for which is product name updated. Passed only on product name
update.
"""
project_entity (Optional[dict[str, Any]]): Project entity.
"""
if host_name is None:
host_name = self.create_context.host_name
@ -537,7 +538,8 @@ class BaseCreator:
self.product_type,
variant,
dynamic_data=dynamic_data,
project_settings=self.project_settings
project_settings=self.project_settings,
project_entity=project_entity,
)
def get_instance_attr_defs(self):

View file

@ -1,3 +1,5 @@
import ayon_api
from ayon_core.settings import get_project_settings
from ayon_core.lib import filter_profiles, prepare_template_data
@ -88,6 +90,7 @@ def get_product_name(
dynamic_data=None,
project_settings=None,
product_type_filter=None,
project_entity=None,
):
"""Calculate product name based on passed context and AYON settings.
@ -120,12 +123,18 @@ def get_product_name(
product_type_filter (Optional[str]): Use different product type for
product template filtering. Value of `product_type` is used when
not passed.
project_entity (Optional[Dict[str, Any]]): Project entity used when
task short name is required by template.
Returns:
str: Product name.
Raises:
TaskNotSetError: If template requires task which is not provided.
TemplateFillError: If filled template contains placeholder key which
is not collected.
"""
"""
if not product_type:
return ""
@ -150,6 +159,16 @@ def get_product_name(
if "{task}" in template.lower():
task_value = task_name
elif "{task[short]}" in template.lower():
if project_entity is None:
project_entity = ayon_api.get_project(project_name)
task_types_by_name = {
task["name"]: task for task in
project_entity["taskTypes"]
}
task_short = task_types_by_name.get(task_type, {}).get("shortName")
task_value["short"] = task_short
fill_pairs = {
"variant": variant,
"family": product_type,

View file

@ -3,7 +3,7 @@
Build templates are manually prepared using plugin definitions which create
placeholders inside the template which are populated on import.
This approach is very explicit to achive very specific build logic that can be
This approach is very explicit to achieve very specific build logic that can be
targeted by task types and names.
Placeholders are created using placeholder plugins which should care about
@ -87,7 +87,7 @@ class AbstractTemplateBuilder(object):
"""Abstraction of Template Builder.
Builder cares about context, shared data, cache, discovery of plugins
and trigger logic. Provides public api for host workfile build systen.
and trigger logic. Provides public api for host workfile build system.
Rest of logic is based on plugins that care about collection and creation
of placeholder items.
@ -806,7 +806,7 @@ class AbstractTemplateBuilder(object):
)
def get_template_preset(self):
"""Unified way how template preset is received usign settings.
"""Unified way how template preset is received using settings.
Method is dependent on '_get_build_profiles' which should return filter
profiles to resolve path to a template. Default implementation looks
@ -1427,7 +1427,7 @@ class PlaceholderLoadMixin(object):
placeholder='{"camera":"persp", "lights":True}',
tooltip=(
"Loader"
"\nDefines a dictionnary of arguments used to load assets."
"\nDefines a dictionary of arguments used to load assets."
"\nUseable arguments depend on current placeholder Loader."
"\nField should be a valid python dict."
" Anything else will be ignored."
@ -1472,7 +1472,7 @@ class PlaceholderLoadMixin(object):
]
def parse_loader_args(self, loader_args):
"""Helper function to parse string of loader arugments.
"""Helper function to parse string of loader arguments.
Empty dictionary is returned if conversion fails.
@ -1872,7 +1872,7 @@ class PlaceholderCreateMixin(object):
creator_plugin.identifier,
create_variant,
folder_entity,
task_name=task_name,
task_entity,
pre_create_data=pre_create_data
)

View file

@ -166,6 +166,12 @@ class AbstractPublisherBackend(AbstractPublisherCommon):
) -> Union[TaskItem, None]:
pass
@abstractmethod
def get_project_entity(
self, project_name: str
) -> Union[Dict[str, Any], None]:
pass
@abstractmethod
def get_folder_entity(
self, project_name: str, folder_id: str

View file

@ -193,6 +193,9 @@ class PublisherController(
def get_convertor_items(self):
return self._create_model.get_convertor_items()
def get_project_entity(self, project_name):
return self._projects_model.get_project_entity(project_name)
def get_folder_type_items(self, project_name, sender=None):
return self._projects_model.get_folder_type_items(
project_name, sender

View file

@ -9,6 +9,7 @@ from ayon_core.lib.attribute_definitions import (
)
from ayon_core.lib.profiles_filtering import filter_profiles
from ayon_core.lib.attribute_definitions import UIDef
from ayon_core.lib import is_func_signature_supported
from ayon_core.pipeline.create import (
BaseCreator,
AutoCreator,
@ -26,6 +27,7 @@ from ayon_core.tools.publisher.abstract import (
AbstractPublisherBackend,
CardMessageTypes,
)
CREATE_EVENT_SOURCE = "publisher.create.model"
@ -356,13 +358,24 @@ class CreateModel:
project_name, task_item.task_id
)
return creator.get_product_name(
project_entity = self._controller.get_project_entity(project_name)
args = (
project_name,
folder_entity,
task_entity,
variant,
instance=instance
variant
)
kwargs = {
"instance": instance,
"project_entity": project_entity,
}
# Backwards compatibility for 'project_entity' argument
# - 'get_product_name' signature changed 24/07/08
if not is_func_signature_supported(
creator.get_product_name, *args, **kwargs
):
kwargs.pop("project_entity")
return creator.get_product_name(*args, **kwargs)
def create(
self,