Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

Commit

Permalink
Merge pull request #2179 from pypeclub/feature/OP-1661_Expect-asset-d…
Browse files Browse the repository at this point in the history
…ocument-instead-of-asset-id-in-get_subset_name

Subset name: Be able to pass asset document to get subset name
  • Loading branch information
iLLiCiTiT authored Nov 1, 2021
2 parents c6b2788 + 2b7115c commit a3ba023
Show file tree
Hide file tree
Showing 5 changed files with 97 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import pyblish.api

from avalon import io
from openpype.lib import get_subset_name
from openpype.lib import get_subset_name_with_asset_doc


class CollectBulkMovInstances(pyblish.api.InstancePlugin):
Expand All @@ -26,16 +26,10 @@ def process(self, instance):
context = instance.context
asset_name = instance.data["asset"]

asset_doc = io.find_one(
{
"type": "asset",
"name": asset_name
},
{
"_id": 1,
"data.tasks": 1
}
)
asset_doc = io.find_one({
"type": "asset",
"name": asset_name
})
if not asset_doc:
raise AssertionError((
"Couldn't find Asset document with name \"{}\""
Expand All @@ -53,11 +47,11 @@ def process(self, instance):
task_name = available_task_names[_task_name_low]
break

subset_name = get_subset_name(
subset_name = get_subset_name_with_asset_doc(
self.new_instance_family,
self.subset_name_variant,
task_name,
asset_doc["_id"],
asset_doc,
io.Session["AVALON_PROJECT"]
)
instance_name = f"{asset_name}_{subset_name}"
Expand Down
20 changes: 7 additions & 13 deletions openpype/hosts/tvpaint/plugins/publish/collect_instances.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import pyblish.api
from avalon import io

from openpype.lib import get_subset_name
from openpype.lib import get_subset_name_with_asset_doc


class CollectInstances(pyblish.api.ContextPlugin):
Expand Down Expand Up @@ -70,16 +70,10 @@ def process(self, context):
# - not sure if it's good idea to require asset id in
# get_subset_name?
asset_name = context.data["workfile_context"]["asset"]
asset_doc = io.find_one(
{
"type": "asset",
"name": asset_name
},
{"_id": 1}
)
asset_id = None
if asset_doc:
asset_id = asset_doc["_id"]
asset_doc = io.find_one({
"type": "asset",
"name": asset_name
})

# Project name from workfile context
project_name = context.data["workfile_context"]["project"]
Expand All @@ -88,11 +82,11 @@ def process(self, context):
# Use empty variant value
variant = ""
task_name = io.Session["AVALON_TASK"]
new_subset_name = get_subset_name(
new_subset_name = get_subset_name_with_asset_doc(
family,
variant,
task_name,
asset_id,
asset_doc,
project_name,
host_name
)
Expand Down
20 changes: 7 additions & 13 deletions openpype/hosts/tvpaint/plugins/publish/collect_workfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import pyblish.api
from avalon import io

from openpype.lib import get_subset_name
from openpype.lib import get_subset_name_with_asset_doc


class CollectWorkfile(pyblish.api.ContextPlugin):
Expand All @@ -28,16 +28,10 @@ def process(self, context):
# get_subset_name?
family = "workfile"
asset_name = context.data["workfile_context"]["asset"]
asset_doc = io.find_one(
{
"type": "asset",
"name": asset_name
},
{"_id": 1}
)
asset_id = None
if asset_doc:
asset_id = asset_doc["_id"]
asset_doc = io.find_one({
"type": "asset",
"name": asset_name
})

# Project name from workfile context
project_name = context.data["workfile_context"]["project"]
Expand All @@ -46,11 +40,11 @@ def process(self, context):
# Use empty variant value
variant = ""
task_name = io.Session["AVALON_TASK"]
subset_name = get_subset_name(
subset_name = get_subset_name_with_asset_doc(
family,
variant,
task_name,
asset_id,
asset_doc,
project_name,
host_name
)
Expand Down
2 changes: 2 additions & 0 deletions openpype/lib/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@
from .plugin_tools import (
TaskNotSetError,
get_subset_name,
get_subset_name_with_asset_doc,
prepare_template_data,
filter_pyblish_plugins,
set_plugin_attributes_from_settings,
Expand Down Expand Up @@ -249,6 +250,7 @@

"TaskNotSetError",
"get_subset_name",
"get_subset_name_with_asset_doc",
"filter_pyblish_plugins",
"set_plugin_attributes_from_settings",
"source_hash",
Expand Down
97 changes: 74 additions & 23 deletions openpype/lib/plugin_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,44 @@ def __init__(self, msg=None):
super(TaskNotSetError, self).__init__(msg)


def get_subset_name(
def get_subset_name_with_asset_doc(
family,
variant,
task_name,
asset_id,
asset_doc,
project_name=None,
host_name=None,
default_template=None,
dynamic_data=None,
dbcon=None
dynamic_data=None
):
"""Calculate subset name based on passed context and OpenPype settings.
Subst name templates are defined in `project_settings/global/tools/creator
/subset_name_profiles` where are profiles with host name, family, task name
and task type filters. If context does not match any profile then
`DEFAULT_SUBSET_TEMPLATE` is used as default template.
That's main reason why so many arguments are required to calculate subset
name.
Args:
family (str): Instance family.
variant (str): In most of cases it is user input during creation.
task_name (str): Task name on which context is instance created.
asset_doc (dict): Queried asset document with it's tasks in data.
Used to get task type.
project_name (str): Name of project on which is instance created.
Important for project settings that are loaded.
host_name (str): One of filtering criteria for template profile
filters.
default_template (str): Default template if any profile does not match
passed context. Constant 'DEFAULT_SUBSET_TEMPLATE' is used if
is not passed.
dynamic_data (dict): Dynamic data specific for a creator which creates
instance.
dbcon (AvalonMongoDB): Mongo connection to be able query asset document
if 'asset_doc' is not passed.
"""
if not family:
return ""

Expand All @@ -53,25 +80,6 @@ def get_subset_name(

project_name = avalon.api.Session["AVALON_PROJECT"]

# Function should expect asset document instead of asset id
# - that way `dbcon` is not needed
if dbcon is None:
from avalon.api import AvalonMongoDB

dbcon = AvalonMongoDB()
dbcon.Session["AVALON_PROJECT"] = project_name

dbcon.install()

asset_doc = dbcon.find_one(
{
"type": "asset",
"_id": asset_id
},
{
"data.tasks": True
}
)
asset_tasks = asset_doc.get("data", {}).get("tasks") or {}
task_info = asset_tasks.get(task_name) or {}
task_type = task_info.get("type")
Expand Down Expand Up @@ -113,6 +121,49 @@ def get_subset_name(
return template.format(**prepare_template_data(fill_pairs))


def get_subset_name(
family,
variant,
task_name,
asset_id,
project_name=None,
host_name=None,
default_template=None,
dynamic_data=None,
dbcon=None
):
"""Calculate subset name using OpenPype settings.
This variant of function expects asset id as argument.
This is legacy function should be replaced with
`get_subset_name_with_asset_doc` where asset document is expected.
"""
if dbcon is None:
from avalon.api import AvalonMongoDB

dbcon = AvalonMongoDB()
dbcon.Session["AVALON_PROJECT"] = project_name

dbcon.install()

asset_doc = dbcon.find_one(
{"_id": asset_id},
{"data.tasks": True}
) or {}

return get_subset_name_with_asset_doc(
family,
variant,
task_name,
asset_doc,
project_name,
host_name,
default_template,
dynamic_data
)


def prepare_template_data(fill_pairs):
"""
Prepares formatted data for filling template.
Expand Down

0 comments on commit a3ba023

Please sign in to comment.