mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 21:04:40 +01:00
added 'AYONPyblishPluginMixin' as replacement for 'OpenPypePyblishPluginMixin'
This commit is contained in:
parent
b17815dc1b
commit
ab8d384715
31 changed files with 59 additions and 54 deletions
|
|
@ -3,11 +3,11 @@
|
|||
import hou # noqa
|
||||
import pyblish.api
|
||||
from ayon_core.lib import BoolDef
|
||||
from ayon_core.pipeline import OpenPypePyblishPluginMixin
|
||||
from ayon_core.pipeline import AYONPyblishPluginMixin
|
||||
|
||||
|
||||
class CollectAssetHandles(pyblish.api.InstancePlugin,
|
||||
OpenPypePyblishPluginMixin):
|
||||
AYONPyblishPluginMixin):
|
||||
"""Apply asset handles.
|
||||
|
||||
If instance does not have:
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
import pyblish.api
|
||||
from ayon_core.lib import NumberDef
|
||||
from ayon_core.pipeline import OpenPypePyblishPluginMixin
|
||||
from ayon_core.pipeline import AYONPyblishPluginMixin
|
||||
|
||||
|
||||
class CollectChunkSize(pyblish.api.InstancePlugin,
|
||||
OpenPypePyblishPluginMixin):
|
||||
AYONPyblishPluginMixin):
|
||||
"""Collect chunk size for cache submission to Deadline."""
|
||||
|
||||
order = pyblish.api.CollectorOrder + 0.05
|
||||
|
|
|
|||
|
|
@ -6,13 +6,13 @@ from pymxs import runtime as rt
|
|||
from ayon_core.lib import BoolDef
|
||||
from ayon_core.hosts.max.api.lib import get_max_version
|
||||
from ayon_core.pipeline.publish import (
|
||||
OpenPypePyblishPluginMixin,
|
||||
AYONPyblishPluginMixin,
|
||||
KnownPublishError
|
||||
)
|
||||
|
||||
|
||||
class CollectReview(pyblish.api.InstancePlugin,
|
||||
OpenPypePyblishPluginMixin):
|
||||
AYONPyblishPluginMixin):
|
||||
"""Collect Review Data for Preview Animation"""
|
||||
|
||||
order = pyblish.api.CollectorOrder + 0.02
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
import pyblish.api
|
||||
|
||||
from ayon_core.lib import EnumDef, TextDef
|
||||
from ayon_core.pipeline.publish import OpenPypePyblishPluginMixin
|
||||
from ayon_core.pipeline.publish import AYONPyblishPluginMixin
|
||||
|
||||
|
||||
class CollectTyCacheData(pyblish.api.InstancePlugin,
|
||||
OpenPypePyblishPluginMixin):
|
||||
AYONPyblishPluginMixin):
|
||||
"""Collect Channel Attributes for TyCache Export"""
|
||||
|
||||
order = pyblish.api.CollectorOrder + 0.02
|
||||
|
|
|
|||
|
|
@ -6,11 +6,11 @@ from maya import cmds
|
|||
|
||||
from ayon_core.hosts.maya.api.lib import maintained_selection
|
||||
from ayon_core.pipeline import AVALON_CONTAINER_ID, publish
|
||||
from ayon_core.pipeline.publish import OpenPypePyblishPluginMixin
|
||||
from ayon_core.pipeline.publish import AYONPyblishPluginMixin
|
||||
from ayon_core.lib import BoolDef
|
||||
|
||||
|
||||
class ExtractMayaSceneRaw(publish.Extractor, OpenPypePyblishPluginMixin):
|
||||
class ExtractMayaSceneRaw(publish.Extractor, AYONPyblishPluginMixin):
|
||||
"""Extract as Maya Scene (raw).
|
||||
|
||||
This will preserve all references, construction history, etc.
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ from ayon_core.pipeline import colorspace
|
|||
|
||||
|
||||
class CollectColorspaceLook(pyblish.api.InstancePlugin,
|
||||
publish.OpenPypePyblishPluginMixin):
|
||||
publish.AYONPyblishPluginMixin):
|
||||
"""Collect OCIO colorspace look from LUT file
|
||||
"""
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ from ayon_core.pipeline.publish import KnownPublishError
|
|||
|
||||
|
||||
class CollectColorspace(pyblish.api.InstancePlugin,
|
||||
publish.OpenPypePyblishPluginMixin,
|
||||
publish.AYONPyblishPluginMixin,
|
||||
publish.ColormanagedPyblishPluginMixin):
|
||||
"""Collect explicit user defined representation colorspaces"""
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
import os
|
||||
|
||||
import pyblish.api
|
||||
from ayon_core.pipeline import OpenPypePyblishPluginMixin
|
||||
from ayon_core.pipeline import AYONPyblishPluginMixin
|
||||
|
||||
|
||||
class CollectMovieBatch(
|
||||
pyblish.api.InstancePlugin, OpenPypePyblishPluginMixin
|
||||
pyblish.api.InstancePlugin, AYONPyblishPluginMixin
|
||||
):
|
||||
"""Collect file url for batch movies and create representation.
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ from ayon_core.pipeline import publish
|
|||
|
||||
|
||||
class ExtractColorspaceLook(publish.Extractor,
|
||||
publish.OpenPypePyblishPluginMixin):
|
||||
publish.AYONPyblishPluginMixin):
|
||||
"""Extract OCIO colorspace look from LUT file
|
||||
"""
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ from ayon_core.pipeline.colorspace import (
|
|||
|
||||
|
||||
class ValidateColorspace(pyblish.api.InstancePlugin,
|
||||
publish.OpenPypePyblishPluginMixin,
|
||||
publish.AYONPyblishPluginMixin,
|
||||
publish.ColormanagedPyblishPluginMixin):
|
||||
"""Validate representation colorspaces"""
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ from ayon_core.pipeline import (
|
|||
|
||||
|
||||
class ValidateColorspaceLook(pyblish.api.InstancePlugin,
|
||||
publish.OpenPypePyblishPluginMixin):
|
||||
publish.AYONPyblishPluginMixin):
|
||||
"""Validate colorspace look attributes"""
|
||||
|
||||
label = "Validate colorspace look attributes"
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ import pyblish.api
|
|||
from ayon_core.pipeline.publish import (
|
||||
AbstractMetaInstancePlugin,
|
||||
KnownPublishError,
|
||||
OpenPypePyblishPluginMixin
|
||||
AYONPyblishPluginMixin
|
||||
)
|
||||
from ayon_core.pipeline.publish.lib import (
|
||||
replace_with_published_scene_path
|
||||
|
|
@ -406,7 +406,7 @@ class DeadlineJobInfo(object):
|
|||
|
||||
@six.add_metaclass(AbstractMetaInstancePlugin)
|
||||
class AbstractSubmitDeadline(pyblish.api.InstancePlugin,
|
||||
OpenPypePyblishPluginMixin):
|
||||
AYONPyblishPluginMixin):
|
||||
"""Class abstracting access to Deadline."""
|
||||
|
||||
label = "Submit to Deadline"
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import pyblish.api
|
||||
from ayon_core.lib import TextDef
|
||||
from ayon_core.pipeline.publish import OpenPypePyblishPluginMixin
|
||||
from ayon_core.pipeline.publish import AYONPyblishPluginMixin
|
||||
|
||||
|
||||
class CollectDeadlinePools(pyblish.api.InstancePlugin,
|
||||
OpenPypePyblishPluginMixin):
|
||||
AYONPyblishPluginMixin):
|
||||
"""Collect pools from instance or Publisher attributes, from Setting
|
||||
otherwise.
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ from ayon_core.lib import (
|
|||
TextDef,
|
||||
)
|
||||
from ayon_core.pipeline import legacy_io
|
||||
from ayon_core.pipeline.publish import OpenPypePyblishPluginMixin
|
||||
from ayon_core.pipeline.publish import AYONPyblishPluginMixin
|
||||
from ayon_core.pipeline.farm.tools import iter_expected_files
|
||||
from ayon_core.tests.lib import is_in_tests
|
||||
|
||||
|
|
@ -29,7 +29,7 @@ class BlenderPluginInfo():
|
|||
|
||||
|
||||
class BlenderSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline,
|
||||
OpenPypePyblishPluginMixin):
|
||||
AYONPyblishPluginMixin):
|
||||
label = "Submit Render to Deadline"
|
||||
hosts = ["blender"]
|
||||
families = ["render"]
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import pyblish.api
|
|||
|
||||
from ayon_core.pipeline import legacy_io
|
||||
from ayon_core.pipeline.publish import (
|
||||
OpenPypePyblishPluginMixin
|
||||
AYONPyblishPluginMixin
|
||||
)
|
||||
from ayon_core.lib import (
|
||||
BoolDef,
|
||||
|
|
@ -19,7 +19,7 @@ from ayon_core.lib import (
|
|||
|
||||
class FusionSubmitDeadline(
|
||||
pyblish.api.InstancePlugin,
|
||||
OpenPypePyblishPluginMixin
|
||||
AYONPyblishPluginMixin
|
||||
):
|
||||
"""Submit current Comp to Deadline
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ from ayon_core.lib import (
|
|||
)
|
||||
from ayon_core.pipeline import (
|
||||
legacy_io,
|
||||
OpenPypePyblishPluginMixin
|
||||
AYONPyblishPluginMixin
|
||||
)
|
||||
from ayon_core.tests.lib import is_in_tests
|
||||
from ayon_core.lib import is_running_from_build
|
||||
|
|
@ -32,7 +32,7 @@ class HoudiniPluginInfo(object):
|
|||
|
||||
|
||||
class HoudiniCacheSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, # noqa
|
||||
OpenPypePyblishPluginMixin):
|
||||
AYONPyblishPluginMixin):
|
||||
"""Submit Houdini scene to perform a local publish in Deadline.
|
||||
|
||||
Publishing in Deadline can be helpful for scenes that publish very slow.
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ from datetime import datetime
|
|||
|
||||
import pyblish.api
|
||||
|
||||
from ayon_core.pipeline import legacy_io, OpenPypePyblishPluginMixin
|
||||
from ayon_core.pipeline import legacy_io, AYONPyblishPluginMixin
|
||||
from ayon_core.tests.lib import is_in_tests
|
||||
from openpype_modules.deadline import abstract_submit_deadline
|
||||
from openpype_modules.deadline.abstract_submit_deadline import DeadlineJobInfo
|
||||
|
|
@ -50,7 +50,7 @@ class RedshiftRenderPluginInfo():
|
|||
|
||||
class HoudiniSubmitDeadline(
|
||||
abstract_submit_deadline.AbstractSubmitDeadline,
|
||||
OpenPypePyblishPluginMixin
|
||||
AYONPyblishPluginMixin
|
||||
):
|
||||
"""Submit Render ROPs to Deadline.
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ from ayon_core.lib import (
|
|||
)
|
||||
from ayon_core.pipeline import (
|
||||
legacy_io,
|
||||
OpenPypePyblishPluginMixin
|
||||
AYONPyblishPluginMixin
|
||||
)
|
||||
from ayon_core.pipeline.publish.lib import (
|
||||
replace_with_published_scene_path
|
||||
|
|
@ -35,7 +35,7 @@ class MaxPluginInfo(object):
|
|||
|
||||
|
||||
class MaxSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline,
|
||||
OpenPypePyblishPluginMixin):
|
||||
AYONPyblishPluginMixin):
|
||||
|
||||
label = "Submit Render to Deadline"
|
||||
hosts = ["max"]
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ import attr
|
|||
|
||||
from ayon_core.pipeline import (
|
||||
legacy_io,
|
||||
OpenPypePyblishPluginMixin
|
||||
AYONPyblishPluginMixin
|
||||
)
|
||||
from ayon_core.lib import (
|
||||
BoolDef,
|
||||
|
|
@ -100,7 +100,7 @@ class ArnoldPluginInfo(object):
|
|||
|
||||
|
||||
class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline,
|
||||
OpenPypePyblishPluginMixin):
|
||||
AYONPyblishPluginMixin):
|
||||
|
||||
label = "Submit Render to Deadline"
|
||||
hosts = ["maya"]
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import pyblish.api
|
|||
|
||||
from ayon_core.pipeline import legacy_io
|
||||
from ayon_core.pipeline.publish import (
|
||||
OpenPypePyblishPluginMixin
|
||||
AYONPyblishPluginMixin
|
||||
)
|
||||
from ayon_core.tests.lib import is_in_tests
|
||||
from ayon_core.lib import (
|
||||
|
|
@ -20,7 +20,7 @@ from ayon_core.lib import (
|
|||
|
||||
|
||||
class NukeSubmitDeadline(pyblish.api.InstancePlugin,
|
||||
OpenPypePyblishPluginMixin):
|
||||
AYONPyblishPluginMixin):
|
||||
"""Submit write to Deadline
|
||||
|
||||
Renders are submitted to a Deadline Web Service as
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ from ayon_core.pipeline.farm.pyblish_functions import (
|
|||
|
||||
|
||||
class ProcessSubmittedCacheJobOnFarm(pyblish.api.InstancePlugin,
|
||||
publish.OpenPypePyblishPluginMixin,
|
||||
publish.AYONPyblishPluginMixin,
|
||||
publish.ColormanagedPyblishPluginMixin):
|
||||
"""Process Cache Job submitted on farm
|
||||
This is replicated version of submit publish job
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ def get_resource_files(resources, frame_range=None):
|
|||
|
||||
|
||||
class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin,
|
||||
publish.OpenPypePyblishPluginMixin,
|
||||
publish.AYONPyblishPluginMixin,
|
||||
publish.ColormanagedPyblishPluginMixin):
|
||||
"""Process Job submitted on farm.
|
||||
|
||||
|
|
|
|||
|
|
@ -19,14 +19,14 @@ from ayon_core.modules.royalrender.rr_job import (
|
|||
RREnvList,
|
||||
get_rr_platform,
|
||||
)
|
||||
from ayon_core.pipeline import OpenPypePyblishPluginMixin
|
||||
from ayon_core.pipeline import AYONPyblishPluginMixin
|
||||
from ayon_core.pipeline.publish import KnownPublishError
|
||||
from ayon_core.pipeline.publish.lib import get_published_workfile_instance
|
||||
from ayon_core.tests.lib import is_in_tests
|
||||
|
||||
|
||||
class BaseCreateRoyalRenderJob(pyblish.api.InstancePlugin,
|
||||
OpenPypePyblishPluginMixin):
|
||||
AYONPyblishPluginMixin):
|
||||
"""Creates separate rendering job for Royal Render"""
|
||||
label = "Create Nuke Render job in RR"
|
||||
order = pyblish.api.IntegratorOrder + 0.1
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ Entry point of creation. All data and metadata are handled through create contex
|
|||
|
||||
Discovers Creator plugins to be able create new instances and convert existing instances. Creators may have defined attributes that are specific for their instances. Attributes definition can enhance behavior of instance during publishing.
|
||||
|
||||
Publish plugins are loaded because they can also define attributes definitions. These are less family specific To be able define attributes Publish plugin must inherit from `OpenPypePyblishPluginMixin` and must override `get_attribute_defs` class method which must return list of attribute definitions. Values of publish plugin definitions are stored per plugin name under `publish_attributes`. Also can override `convert_attribute_values` class method which gives ability to modify values on instance before are used in CreatedInstance. Method `convert_attribute_values` can be also used without `get_attribute_defs` to modify values when changing compatibility (remove metadata from instance because are irrelevant).
|
||||
Publish plugins are loaded because they can also define attributes definitions. These are less family specific To be able define attributes Publish plugin must inherit from `AYONPyblishPluginMixin` and must override `get_attribute_defs` class method which must return list of attribute definitions. Values of publish plugin definitions are stored per plugin name under `publish_attributes`. Also can override `convert_attribute_values` class method which gives ability to modify values on instance before are used in CreatedInstance. Method `convert_attribute_values` can be also used without `get_attribute_defs` to modify values when changing compatibility (remove metadata from instance because are irrelevant).
|
||||
|
||||
Possible attribute definitions can be found in `openpype/pipeline/lib/attribute_definitions.py`.
|
||||
|
||||
|
|
|
|||
|
|
@ -1200,7 +1200,7 @@ class CreatedInstance:
|
|||
|
||||
Args:
|
||||
attr_plugins (List[pyblish.api.Plugin]): Pyblish plugins which
|
||||
inherit from 'OpenPypePyblishPluginMixin' and may contain
|
||||
inherit from 'AYONPyblishPluginMixin' and may contain
|
||||
attribute definitions.
|
||||
"""
|
||||
|
||||
|
|
@ -1735,7 +1735,7 @@ class CreateContext:
|
|||
self._reset_convertor_plugins()
|
||||
|
||||
def _reset_publish_plugins(self, discover_publish_plugins):
|
||||
from ayon_core.pipeline import OpenPypePyblishPluginMixin
|
||||
from ayon_core.pipeline import AYONPyblishPluginMixin
|
||||
from ayon_core.pipeline.publish import (
|
||||
publish_plugins_discover
|
||||
)
|
||||
|
|
@ -1759,7 +1759,7 @@ class CreateContext:
|
|||
|
||||
# Collect plugins that can have attribute definitions
|
||||
for plugin in publish_plugins:
|
||||
if OpenPypePyblishPluginMixin in inspect.getmro(plugin):
|
||||
if AYONPyblishPluginMixin in inspect.getmro(plugin):
|
||||
plugins_with_defs.append(plugin)
|
||||
|
||||
plugins_mismatch_targets = [
|
||||
|
|
|
|||
|
|
@ -17,16 +17,16 @@ Exception `PublishValidationError` 3 arguments:
|
|||
When there is a known error that can't be fixed by user (e.g. can't connect to deadline service, etc.) `KnownPublishError` should be raise. The only difference is that it's message is shown in UI to artist otherwise a neutral message without context is shown.
|
||||
|
||||
## Plugin extension
|
||||
Publish plugins can be extended by additional logic when inherits from `OpenPypePyblishPluginMixin` which can be used as mixin (additional inheritance of class).
|
||||
Publish plugins can be extended by additional logic when inherits from `AYONPyblishPluginMixin` which can be used as mixin (additional inheritance of class).
|
||||
|
||||
```python
|
||||
import pyblish.api
|
||||
from ayon_core.pipeline import OpenPypePyblishPluginMixin
|
||||
from ayon_core.pipeline import AYONPyblishPluginMixin
|
||||
|
||||
|
||||
# Example context plugin
|
||||
class MyExtendedPlugin(
|
||||
pyblish.api.ContextPlugin, OpenPypePyblishPluginMixin
|
||||
pyblish.api.ContextPlugin, AYONPyblishPluginMixin
|
||||
):
|
||||
pass
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ from .publish_plugins import (
|
|||
PublishValidationError,
|
||||
PublishXmlValidationError,
|
||||
KnownPublishError,
|
||||
AYONPyblishPluginMixin,
|
||||
OpenPypePyblishPluginMixin,
|
||||
OptionalPyblishPluginMixin,
|
||||
|
||||
|
|
@ -62,6 +63,7 @@ __all__ = (
|
|||
"PublishValidationError",
|
||||
"PublishXmlValidationError",
|
||||
"KnownPublishError",
|
||||
"AYONPyblishPluginMixin",
|
||||
"OpenPypePyblishPluginMixin",
|
||||
"OptionalPyblishPluginMixin",
|
||||
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ class KnownPublishError(Exception):
|
|||
pass
|
||||
|
||||
|
||||
class OpenPypePyblishPluginMixin:
|
||||
class AYONPyblishPluginMixin:
|
||||
# TODO
|
||||
# executable_in_thread = False
|
||||
#
|
||||
|
|
@ -166,7 +166,10 @@ class OpenPypePyblishPluginMixin:
|
|||
return self.get_attr_values_from_data_for_plugin(self.__class__, data)
|
||||
|
||||
|
||||
class OptionalPyblishPluginMixin(OpenPypePyblishPluginMixin):
|
||||
OpenPypePyblishPluginMixin = AYONPyblishPluginMixin
|
||||
|
||||
|
||||
class OptionalPyblishPluginMixin(AYONPyblishPluginMixin):
|
||||
"""Prepare mixin for optional plugins.
|
||||
|
||||
Defined active attribute definition prepared for published and
|
||||
|
|
|
|||
|
|
@ -25,12 +25,12 @@ Todos:
|
|||
|
||||
import pyblish.api
|
||||
from ayon_core.lib.attribute_definitions import TextDef
|
||||
from ayon_core.pipeline.publish import OpenPypePyblishPluginMixin
|
||||
from ayon_core.pipeline.publish import AYONPyblishPluginMixin
|
||||
|
||||
|
||||
class CollectInstanceCommentDef(
|
||||
pyblish.api.InstancePlugin,
|
||||
OpenPypePyblishPluginMixin
|
||||
AYONPyblishPluginMixin
|
||||
):
|
||||
label = "Comment per instance"
|
||||
targets = ["local"]
|
||||
|
|
@ -64,7 +64,7 @@ class CollectInstanceCommentDef(
|
|||
|
||||
class CollectComment(
|
||||
pyblish.api.ContextPlugin,
|
||||
OpenPypePyblishPluginMixin
|
||||
AYONPyblishPluginMixin
|
||||
):
|
||||
"""Collect comment per each instance.
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ from ayon_core.lib.attribute_definitions import (
|
|||
BoolDef
|
||||
)
|
||||
|
||||
from ayon_core.pipeline.publish import OpenPypePyblishPluginMixin
|
||||
from ayon_core.pipeline.publish import AYONPyblishPluginMixin
|
||||
from ayon_core.client.entities import (
|
||||
get_last_version_by_subset_name,
|
||||
get_representations
|
||||
|
|
@ -13,7 +13,7 @@ from ayon_core.client.entities import (
|
|||
|
||||
class CollectFramesFixDef(
|
||||
pyblish.api.InstancePlugin,
|
||||
OpenPypePyblishPluginMixin
|
||||
AYONPyblishPluginMixin
|
||||
):
|
||||
"""Provides text field to insert frame(s) to be rerendered.
|
||||
|
||||
|
|
|
|||
|
|
@ -1465,7 +1465,7 @@ class PublishPluginAttrsWidget(QtWidgets.QWidget):
|
|||
"""Widget showing publsish plugin attributes for selected instances.
|
||||
|
||||
Attributes are defined on publish plugins. Publihs plugin may define
|
||||
attribute definitions but must inherit `OpenPypePyblishPluginMixin`
|
||||
attribute definitions but must inherit `AYONPyblishPluginMixin`
|
||||
(~/openpype/pipeline/publish). At the moment requires to implement
|
||||
`get_attribute_defs` and `convert_attribute_values` class methods.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue