mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-25 13:24:54 +01:00
Merge branch 'develop' into feature/workfile_start_at_launch
This commit is contained in:
commit
a2cbdcf766
10 changed files with 215 additions and 53 deletions
35
CHANGELOG.md
35
CHANGELOG.md
|
|
@ -1,13 +1,18 @@
|
|||
# Changelog
|
||||
|
||||
## [3.3.0-nightly.4](https://github.com/pypeclub/OpenPype/tree/HEAD)
|
||||
## [3.3.0-nightly.5](https://github.com/pypeclub/OpenPype/tree/HEAD)
|
||||
|
||||
[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.2.0...HEAD)
|
||||
|
||||
**🚀 Enhancements**
|
||||
|
||||
- Anatomy schema validation [\#1864](https://github.com/pypeclub/OpenPype/pull/1864)
|
||||
- Ftrack prepare project structure [\#1861](https://github.com/pypeclub/OpenPype/pull/1861)
|
||||
- Independent general environments [\#1853](https://github.com/pypeclub/OpenPype/pull/1853)
|
||||
- TVPaint Start Frame [\#1844](https://github.com/pypeclub/OpenPype/pull/1844)
|
||||
- Ftrack push attributes action adds traceback to job [\#1843](https://github.com/pypeclub/OpenPype/pull/1843)
|
||||
- Prepare project action enhance [\#1838](https://github.com/pypeclub/OpenPype/pull/1838)
|
||||
- Standalone Publish of textures family [\#1834](https://github.com/pypeclub/OpenPype/pull/1834)
|
||||
- nuke: settings create missing default subsets [\#1829](https://github.com/pypeclub/OpenPype/pull/1829)
|
||||
- Update poetry lock [\#1823](https://github.com/pypeclub/OpenPype/pull/1823)
|
||||
- Settings: settings for plugins [\#1819](https://github.com/pypeclub/OpenPype/pull/1819)
|
||||
|
|
@ -15,17 +20,23 @@
|
|||
|
||||
**🐛 Bug fixes**
|
||||
|
||||
- imageio: fix grouping [\#1856](https://github.com/pypeclub/OpenPype/pull/1856)
|
||||
- publisher: missing version in subset prop [\#1849](https://github.com/pypeclub/OpenPype/pull/1849)
|
||||
- Ftrack type error fix in sync to avalon event handler [\#1845](https://github.com/pypeclub/OpenPype/pull/1845)
|
||||
- Nuke: updating effects subset fail [\#1841](https://github.com/pypeclub/OpenPype/pull/1841)
|
||||
- nuke: write render node skipped with crop [\#1836](https://github.com/pypeclub/OpenPype/pull/1836)
|
||||
- Project folder structure overrides [\#1813](https://github.com/pypeclub/OpenPype/pull/1813)
|
||||
- Maya: fix yeti settings path in extractor [\#1809](https://github.com/pypeclub/OpenPype/pull/1809)
|
||||
- Failsafe for cross project containers. [\#1806](https://github.com/pypeclub/OpenPype/pull/1806)
|
||||
- nuke: fixing wrong name of family folder when `used existing frames` [\#1803](https://github.com/pypeclub/OpenPype/pull/1803)
|
||||
- Houdini colector formatting keys fix [\#1802](https://github.com/pypeclub/OpenPype/pull/1802)
|
||||
|
||||
**Merged pull requests:**
|
||||
|
||||
- Ftrack push attributes action adds traceback to job [\#1842](https://github.com/pypeclub/OpenPype/pull/1842)
|
||||
- Add support for pyenv-win on windows [\#1822](https://github.com/pypeclub/OpenPype/pull/1822)
|
||||
- PS, AE - send actual context when another webserver is running [\#1811](https://github.com/pypeclub/OpenPype/pull/1811)
|
||||
- Build: don't add Poetry to `PATH` [\#1808](https://github.com/pypeclub/OpenPype/pull/1808)
|
||||
|
||||
## [3.2.0](https://github.com/pypeclub/OpenPype/tree/3.2.0) (2021-07-13)
|
||||
|
||||
|
|
@ -47,11 +58,9 @@
|
|||
- Settings Hosts enum [\#1739](https://github.com/pypeclub/OpenPype/pull/1739)
|
||||
- Validate containers settings [\#1736](https://github.com/pypeclub/OpenPype/pull/1736)
|
||||
- PS - added loader from sequence [\#1726](https://github.com/pypeclub/OpenPype/pull/1726)
|
||||
- Toggle Ftrack upload in StandalonePublisher [\#1708](https://github.com/pypeclub/OpenPype/pull/1708)
|
||||
|
||||
**🐛 Bug fixes**
|
||||
|
||||
- nuke: fixing wrong name of family folder when `used existing frames` [\#1803](https://github.com/pypeclub/OpenPype/pull/1803)
|
||||
- Collect ftrack family bugs [\#1801](https://github.com/pypeclub/OpenPype/pull/1801)
|
||||
- Invitee email can be None which break the Ftrack commit. [\#1788](https://github.com/pypeclub/OpenPype/pull/1788)
|
||||
- Fix: staging and `--use-version` option [\#1786](https://github.com/pypeclub/OpenPype/pull/1786)
|
||||
|
|
@ -73,9 +82,9 @@
|
|||
|
||||
**Merged pull requests:**
|
||||
|
||||
- Build: don't add Poetry to `PATH` [\#1808](https://github.com/pypeclub/OpenPype/pull/1808)
|
||||
- Bump prismjs from 1.23.0 to 1.24.0 in /website [\#1773](https://github.com/pypeclub/OpenPype/pull/1773)
|
||||
- Bc/fix/docs [\#1771](https://github.com/pypeclub/OpenPype/pull/1771)
|
||||
- Expose write attributes to config [\#1770](https://github.com/pypeclub/OpenPype/pull/1770)
|
||||
- TVPaint ftrack family [\#1755](https://github.com/pypeclub/OpenPype/pull/1755)
|
||||
|
||||
## [2.18.4](https://github.com/pypeclub/OpenPype/tree/2.18.4) (2021-06-24)
|
||||
|
|
@ -95,10 +104,6 @@
|
|||
|
||||
- Tools names forwards compatibility [\#1727](https://github.com/pypeclub/OpenPype/pull/1727)
|
||||
|
||||
**⚠️ Deprecations**
|
||||
|
||||
- global: removing obsolete ftrack validator plugin [\#1710](https://github.com/pypeclub/OpenPype/pull/1710)
|
||||
|
||||
## [2.18.2](https://github.com/pypeclub/OpenPype/tree/2.18.2) (2021-06-16)
|
||||
|
||||
[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.1.0...2.18.2)
|
||||
|
|
@ -107,24 +112,10 @@
|
|||
|
||||
- Maya: Extract review hotfix - 2.x backport [\#1713](https://github.com/pypeclub/OpenPype/pull/1713)
|
||||
|
||||
**Merged pull requests:**
|
||||
|
||||
- 1698 Nuke: Prerender Frame Range by default [\#1709](https://github.com/pypeclub/OpenPype/pull/1709)
|
||||
|
||||
## [3.1.0](https://github.com/pypeclub/OpenPype/tree/3.1.0) (2021-06-15)
|
||||
|
||||
[Full Changelog](https://github.com/pypeclub/OpenPype/compare/CI/3.1.0-nightly.4...3.1.0)
|
||||
|
||||
**🚀 Enhancements**
|
||||
|
||||
- Log Viewer with OpenPype style [\#1703](https://github.com/pypeclub/OpenPype/pull/1703)
|
||||
- Scrolling in OpenPype info widget [\#1702](https://github.com/pypeclub/OpenPype/pull/1702)
|
||||
|
||||
**🐛 Bug fixes**
|
||||
|
||||
- Nuke: broken publishing rendered frames [\#1707](https://github.com/pypeclub/OpenPype/pull/1707)
|
||||
- Standalone publisher Thumbnail export args [\#1705](https://github.com/pypeclub/OpenPype/pull/1705)
|
||||
|
||||
# Changelog
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ class CopyTemplateWorkfile(PreLaunchHook):
|
|||
))
|
||||
return
|
||||
|
||||
self.log.info("Last workfile does not exits.")
|
||||
self.log.info("Last workfile does not exist.")
|
||||
|
||||
project_name = self.data["project_name"]
|
||||
asset_name = self.data["asset_name"]
|
||||
|
|
|
|||
|
|
@ -1743,3 +1743,68 @@ def process_workfile_builder():
|
|||
log.info("Opening last workfile...")
|
||||
# open workfile
|
||||
open_file(last_workfile_path)
|
||||
|
||||
|
||||
def recreate_instance(origin_node, avalon_data=None):
|
||||
"""Recreate input instance to different data
|
||||
|
||||
Args:
|
||||
origin_node (nuke.Node): Nuke node to be recreating from
|
||||
avalon_data (dict, optional): data to be used in new node avalon_data
|
||||
|
||||
Returns:
|
||||
nuke.Node: newly created node
|
||||
"""
|
||||
knobs_wl = ["render", "publish", "review", "ypos",
|
||||
"use_limit", "first", "last"]
|
||||
# get data from avalon knobs
|
||||
data = anlib.get_avalon_knob_data(
|
||||
origin_node)
|
||||
|
||||
# add input data to avalon data
|
||||
if avalon_data:
|
||||
data.update(avalon_data)
|
||||
|
||||
# capture all node knobs allowed in op_knobs
|
||||
knobs_data = {k: origin_node[k].value()
|
||||
for k in origin_node.knobs()
|
||||
for key in knobs_wl
|
||||
if key in k}
|
||||
|
||||
# get node dependencies
|
||||
inputs = origin_node.dependencies()
|
||||
outputs = origin_node.dependent()
|
||||
|
||||
# remove the node
|
||||
nuke.delete(origin_node)
|
||||
|
||||
# create new node
|
||||
# get appropriate plugin class
|
||||
creator_plugin = None
|
||||
for Creator in api.discover(api.Creator):
|
||||
if Creator.__name__ == data["creator"]:
|
||||
creator_plugin = Creator
|
||||
break
|
||||
|
||||
# create write node with creator
|
||||
new_node_name = data["subset"]
|
||||
new_node = creator_plugin(new_node_name, data["asset"]).process()
|
||||
|
||||
# white listed knobs to the new node
|
||||
for _k, _v in knobs_data.items():
|
||||
try:
|
||||
print(_k, _v)
|
||||
new_node[_k].setValue(_v)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
# connect to original inputs
|
||||
for i, n in enumerate(inputs):
|
||||
new_node.setInput(i, n)
|
||||
|
||||
# connect to outputs
|
||||
if len(outputs) > 0:
|
||||
for dn in outputs:
|
||||
dn.setInput(0, new_node)
|
||||
|
||||
return new_node
|
||||
|
|
|
|||
|
|
@ -92,15 +92,16 @@ class RepairSelectInvalidInstances(pyblish.api.Action):
|
|||
|
||||
context_asset = context.data["assetEntity"]["name"]
|
||||
for instance in instances:
|
||||
self.set_attribute(instance, context_asset)
|
||||
if "nuke" in pyblish.api.registered_hosts():
|
||||
import openpype.hosts.nuke.api as nuke_api
|
||||
origin_node = instance[0]
|
||||
nuke_api.lib.recreate_instance(
|
||||
origin_node, avalon_data={"asset": context_asset}
|
||||
)
|
||||
else:
|
||||
self.set_attribute(instance, context_asset)
|
||||
|
||||
def set_attribute(self, instance, context_asset):
|
||||
if "nuke" in pyblish.api.registered_hosts():
|
||||
import nuke
|
||||
nuke.toNode(
|
||||
instance.data.get("name")
|
||||
)["avalon:asset"].setValue(context_asset)
|
||||
|
||||
if "maya" in pyblish.api.registered_hosts():
|
||||
from maya import cmds
|
||||
cmds.setAttr(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
from .dict_immutable_keys_entity import DictImmutableKeysEntity
|
||||
from .lib import OverrideState
|
||||
from .exceptions import EntitySchemaError
|
||||
|
||||
|
||||
class AnatomyEntity(DictImmutableKeysEntity):
|
||||
|
|
@ -23,3 +24,25 @@ class AnatomyEntity(DictImmutableKeysEntity):
|
|||
if not child_obj.has_project_override:
|
||||
child_obj.add_to_project_override()
|
||||
return super(AnatomyEntity, self).on_child_change(child_obj)
|
||||
|
||||
def schema_validations(self):
|
||||
non_group_children = []
|
||||
for key, child_obj in self.non_gui_children.items():
|
||||
if not child_obj.is_group:
|
||||
non_group_children.append(key)
|
||||
|
||||
if non_group_children:
|
||||
_non_group_children = [
|
||||
"project_anatomy/{}".format(key)
|
||||
for key in non_group_children
|
||||
]
|
||||
reason = (
|
||||
"Anatomy must have all children as groups."
|
||||
" Set 'is_group' to `true` on > {}"
|
||||
).format(", ".join([
|
||||
'"{}"'.format(item)
|
||||
for item in _non_group_children
|
||||
]))
|
||||
raise EntitySchemaError(self, reason)
|
||||
|
||||
return super(AnatomyEntity, self).schema_validations()
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
import copy
|
||||
from .input_entities import InputEntity
|
||||
from .exceptions import EntitySchemaError
|
||||
from .lib import (
|
||||
|
|
@ -118,30 +119,43 @@ class HostsEnumEntity(BaseEnumEntity):
|
|||
implementation instead of application name.
|
||||
"""
|
||||
schema_types = ["hosts-enum"]
|
||||
all_host_names = [
|
||||
"aftereffects",
|
||||
"blender",
|
||||
"celaction",
|
||||
"fusion",
|
||||
"harmony",
|
||||
"hiero",
|
||||
"houdini",
|
||||
"maya",
|
||||
"nuke",
|
||||
"photoshop",
|
||||
"resolve",
|
||||
"tvpaint",
|
||||
"unreal",
|
||||
"standalonepublisher"
|
||||
]
|
||||
|
||||
def _item_initalization(self):
|
||||
self.multiselection = self.schema_data.get("multiselection", True)
|
||||
self.use_empty_value = self.schema_data.get(
|
||||
"use_empty_value", not self.multiselection
|
||||
)
|
||||
use_empty_value = False
|
||||
if not self.multiselection:
|
||||
use_empty_value = self.schema_data.get(
|
||||
"use_empty_value", use_empty_value
|
||||
)
|
||||
self.use_empty_value = use_empty_value
|
||||
|
||||
hosts_filter = self.schema_data.get("hosts_filter") or []
|
||||
self.hosts_filter = hosts_filter
|
||||
|
||||
custom_labels = self.schema_data.get("custom_labels") or {}
|
||||
|
||||
host_names = [
|
||||
"aftereffects",
|
||||
"blender",
|
||||
"celaction",
|
||||
"fusion",
|
||||
"harmony",
|
||||
"hiero",
|
||||
"houdini",
|
||||
"maya",
|
||||
"nuke",
|
||||
"photoshop",
|
||||
"resolve",
|
||||
"tvpaint",
|
||||
"unreal",
|
||||
"standalonepublisher"
|
||||
]
|
||||
host_names = copy.deepcopy(self.all_host_names)
|
||||
if hosts_filter:
|
||||
for host_name in tuple(host_names):
|
||||
if host_name not in hosts_filter:
|
||||
host_names.remove(host_name)
|
||||
|
||||
if self.use_empty_value:
|
||||
host_names.insert(0, "")
|
||||
# Add default label for empty value if not available
|
||||
|
|
@ -173,6 +187,44 @@ class HostsEnumEntity(BaseEnumEntity):
|
|||
# GUI attribute
|
||||
self.placeholder = self.schema_data.get("placeholder")
|
||||
|
||||
def schema_validations(self):
|
||||
if self.hosts_filter:
|
||||
enum_len = len(self.enum_items)
|
||||
if (
|
||||
enum_len == 0
|
||||
or (enum_len == 1 and self.use_empty_value)
|
||||
):
|
||||
joined_filters = ", ".join([
|
||||
'"{}"'.format(item)
|
||||
for item in self.hosts_filter
|
||||
])
|
||||
reason = (
|
||||
"All host names were removed after applying"
|
||||
" host filters. {}"
|
||||
).format(joined_filters)
|
||||
raise EntitySchemaError(self, reason)
|
||||
|
||||
invalid_filters = set()
|
||||
for item in self.hosts_filter:
|
||||
if item not in self.all_host_names:
|
||||
invalid_filters.add(item)
|
||||
|
||||
if invalid_filters:
|
||||
joined_filters = ", ".join([
|
||||
'"{}"'.format(item)
|
||||
for item in self.hosts_filter
|
||||
])
|
||||
expected_hosts = ", ".join([
|
||||
'"{}"'.format(item)
|
||||
for item in self.all_host_names
|
||||
])
|
||||
self.log.warning((
|
||||
"Host filters containt invalid host names:"
|
||||
" \"{}\" Expected values are {}"
|
||||
).format(joined_filters, expected_hosts))
|
||||
|
||||
super(HostsEnumEntity, self).schema_validations()
|
||||
|
||||
|
||||
class AppsEnumEntity(BaseEnumEntity):
|
||||
schema_types = ["apps-enum"]
|
||||
|
|
|
|||
|
|
@ -379,6 +379,9 @@ How output of the schema could look like on save:
|
|||
- multiselection can be allowed with setting key `"multiselection"` to `True` (Default: `False`)
|
||||
- it is possible to add empty value (represented with empty string) with setting `"use_empty_value"` to `True` (Default: `False`)
|
||||
- it is possible to set `"custom_labels"` for host names where key `""` is empty value (Default: `{}`)
|
||||
- to filter host names it is required to define `"hosts_filter"` which is list of host names that will be available
|
||||
- do not pass empty string if `use_empty_value` is enabled
|
||||
- ignoring host names would be more dangerous in some cases
|
||||
```
|
||||
{
|
||||
"key": "host",
|
||||
|
|
@ -389,7 +392,10 @@ How output of the schema could look like on save:
|
|||
"custom_labels": {
|
||||
"": "N/A",
|
||||
"nuke": "Nuke"
|
||||
}
|
||||
},
|
||||
"hosts_filter": [
|
||||
"nuke"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
|
|
@ -577,6 +583,15 @@ How output of the schema could look like on save:
|
|||
}
|
||||
```
|
||||
|
||||
## Anatomy
|
||||
Anatomy represents data stored on project document.
|
||||
|
||||
### anatomy
|
||||
- entity works similarly to `dict`
|
||||
- anatomy has always all keys overriden with overrides
|
||||
- overrides are not applied as all anatomy data must be available from project document
|
||||
- all children must be groups
|
||||
|
||||
## Proxy wrappers
|
||||
- should wraps multiple inputs only visually
|
||||
- these does not have `"key"` key and do not allow to have `"is_file"` or `"is_group"` modifiers enabled
|
||||
|
|
|
|||
|
|
@ -78,7 +78,22 @@
|
|||
"type": "hosts-enum",
|
||||
"key": "hosts",
|
||||
"label": "Hosts",
|
||||
"multiselection": true
|
||||
"multiselection": true,
|
||||
"hosts_filter": [
|
||||
"aftereffects",
|
||||
"blender",
|
||||
"celaction",
|
||||
"fusion",
|
||||
"harmony",
|
||||
"hiero",
|
||||
"houdini",
|
||||
"maya",
|
||||
"nuke",
|
||||
"photoshop",
|
||||
"resolve",
|
||||
"tvpaint",
|
||||
"unreal"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "tasks",
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
"""Package declaring Pype version."""
|
||||
__version__ = "3.3.0-nightly.4"
|
||||
__version__ = "3.3.0-nightly.5"
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit d8be0bdb37961e32243f1de0eb9696e86acf7443
|
||||
Subproject commit cfd4191e364b47de7364096f45d9d9d9a901692a
|
||||
Loading…
Add table
Add a link
Reference in a new issue