mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 16:34:53 +01:00
prepared functions to separate process function
This commit is contained in:
parent
66209b27cd
commit
b9dc19a046
1 changed files with 346 additions and 0 deletions
|
|
@ -464,3 +464,349 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin):
|
|||
for asset_version in used_asset_versions:
|
||||
if asset_version not in instance.data[asset_versions_key]:
|
||||
instance.data[asset_versions_key].append(asset_version)
|
||||
|
||||
def _ensure_asset_types_exists(self, session, component_list):
|
||||
"""Make sure that all AssetType entities exists for integration.
|
||||
|
||||
Returns:
|
||||
dict: All asset types by short name.
|
||||
"""
|
||||
# Query existing asset types
|
||||
asset_types = session.query("select id, short from AssetType").all()
|
||||
# Stpore all existing short names
|
||||
asset_type_shorts = {asset_type["short"] for asset_type in asset_types}
|
||||
# Check which asset types are missing and store them
|
||||
asset_type_names_by_missing_shorts = {}
|
||||
default_short_name = "upload"
|
||||
for data in component_list:
|
||||
asset_type_data = data.get("assettype_data") or {}
|
||||
asset_type_short = asset_type_data.get("short")
|
||||
if not asset_type_short:
|
||||
# Use default asset type name if not set and change the
|
||||
# input data
|
||||
asset_type_short = default_short_name
|
||||
asset_type_data["short"] = asset_type_short
|
||||
data["assettype_data"] = asset_type_data
|
||||
|
||||
if (
|
||||
# Skip if short name exists
|
||||
asset_type_short in asset_type_shorts
|
||||
# Skip if short name was already added to missing types
|
||||
# and asset type name is filled
|
||||
# - if asset type name is missing then try use name from other
|
||||
# data
|
||||
or asset_type_names_by_missing_shorts.get(asset_type_short)
|
||||
):
|
||||
continue
|
||||
|
||||
asset_type_names_by_missing_shorts[asset_type_short] = (
|
||||
asset_type_data.get("name")
|
||||
)
|
||||
|
||||
# Create missing asset types if there are any
|
||||
if asset_type_names_by_missing_shorts:
|
||||
self.log.info("Creating asset types with short names: {}".format(
|
||||
", ".join(asset_type_names_by_missing_shorts.keys())
|
||||
))
|
||||
for missing_short, type_name in asset_type_names_by_missing_shorts:
|
||||
# Use short for name if name is not defined
|
||||
if not type_name:
|
||||
type_name = missing_short
|
||||
# Use short name also for name
|
||||
# - there is not other source for 'name'
|
||||
session.create(
|
||||
"AssetType",
|
||||
{
|
||||
"short": missing_short,
|
||||
"name": type_name
|
||||
}
|
||||
)
|
||||
|
||||
# Commit creation
|
||||
session.commit()
|
||||
# Requery asset types
|
||||
asset_types = session.query(
|
||||
"select id, short from AssetType"
|
||||
).all()
|
||||
|
||||
return {asset_type["short"]: asset_type for asset_type in asset_types}
|
||||
|
||||
def _ensure_asset_exists(
|
||||
self, session, asset_data, asset_type_id, parent_id
|
||||
):
|
||||
asset_name = asset_data["name"]
|
||||
asset_entity = self._query_asset(
|
||||
session, asset_name, asset_type_id, parent_id
|
||||
)
|
||||
if asset_entity is not None:
|
||||
return asset_entity
|
||||
|
||||
asset_data = {
|
||||
"name": asset_name,
|
||||
"type_id": asset_type_id,
|
||||
"context_id": parent_id
|
||||
}
|
||||
self.log.info("Created new Asset with data: {}.".format(asset_data))
|
||||
session.create("Asset", asset_data)
|
||||
session.commit()
|
||||
return self._query_asset(session, asset_name, asset_type_id, parent_id)
|
||||
|
||||
def _query_asset(self, session, asset_name, asset_type_id, parent_id):
|
||||
return session.query(
|
||||
(
|
||||
"select id from Asset"
|
||||
" where name is \"{}\""
|
||||
" and type_id is \"{}\""
|
||||
" and context_id is \"{}\""
|
||||
).format(asset_name, asset_type_id, parent_id)
|
||||
).first()
|
||||
|
||||
def _ensure_asset_version_exists(
|
||||
self, session, asset_version_data, asset_id, task_entity
|
||||
):
|
||||
task_id = None
|
||||
if task_entity:
|
||||
task_id = task_entity["id"]
|
||||
|
||||
# Try query asset version by criteria (asset id and version)
|
||||
version = asset_version_data.get("version") or 0
|
||||
asset_version_entity = self._query_asset_version(
|
||||
session, version, asset_id
|
||||
)
|
||||
|
||||
# Prepare comment value
|
||||
comment = asset_version_data.get("comment") or ""
|
||||
if asset_version_entity is not None:
|
||||
changed = False
|
||||
if comment != asset_version_entity["comment"]:
|
||||
asset_version_entity["comment"] = comment
|
||||
changed = True
|
||||
|
||||
if task_id != asset_version_entity["task_id"]:
|
||||
asset_version_entity["task_id"] = task_id
|
||||
changed = True
|
||||
|
||||
if changed:
|
||||
session.commit()
|
||||
|
||||
else:
|
||||
new_asset_version_data = {
|
||||
"version": version,
|
||||
"asset_id": asset_id
|
||||
}
|
||||
if task_id:
|
||||
new_asset_version_data["task_id"] = task_id
|
||||
|
||||
if comment:
|
||||
new_asset_version_data["comment"] = comment
|
||||
|
||||
self.log.info("Created new AssetVersion with data {}".format(
|
||||
new_asset_version_data
|
||||
))
|
||||
session.create("AssetVersion", new_asset_version_data)
|
||||
session.commit()
|
||||
asset_version_entity = self._query_asset_version(
|
||||
session, version, asset_id
|
||||
)
|
||||
|
||||
# Set custom attributes if there were any set
|
||||
custom_attrs = asset_version_data.get("custom_attributes") or {}
|
||||
for attr_key, attr_value in custom_attrs.items():
|
||||
if attr_key in asset_version_entity["custom_attributes"]:
|
||||
try:
|
||||
asset_version_entity["custom_attributes"][attr_key] = (
|
||||
attr_value
|
||||
)
|
||||
session.commit()
|
||||
continue
|
||||
except Exception:
|
||||
session.rollback()
|
||||
session._configure_locations()
|
||||
|
||||
self.log.warning(
|
||||
(
|
||||
"Custom Attrubute \"{0}\" is not available for"
|
||||
" AssetVersion <{1}>. Can't set it's value to: \"{2}\""
|
||||
).format(
|
||||
attr_key, asset_version_entity["id"], str(attr_value)
|
||||
)
|
||||
)
|
||||
|
||||
return asset_version_entity
|
||||
|
||||
def _query_asset_version(self, session, version, asset_id):
|
||||
return session.query(
|
||||
(
|
||||
"select id, task_id, comment from AssetVersion"
|
||||
" where version is \"{}\" and asset_id is \"{}\""
|
||||
).format(version, asset_id)
|
||||
).first()
|
||||
|
||||
def create_component(self, session, asset_version_entity, data):
|
||||
component_data = data.get("component_data") or {}
|
||||
|
||||
if not component_data.get("name"):
|
||||
component_data["name"] = "main"
|
||||
|
||||
version_id = asset_version_entity["id"]
|
||||
component_data["version_id"] = version_id
|
||||
component_entity = session.query(
|
||||
(
|
||||
"select id, name from Component where name is \"{}\""
|
||||
" and version_id is \"{}\""
|
||||
).format(component_data["name"], version_id)
|
||||
).first()
|
||||
|
||||
component_overwrite = data.get("component_overwrite", False)
|
||||
location = data.get("component_location", session.pick_location())
|
||||
|
||||
# Overwrite existing component data if requested.
|
||||
if component_entity and component_overwrite:
|
||||
origin_location = session.query(
|
||||
"Location where name is \"ftrack.origin\""
|
||||
).one()
|
||||
|
||||
# Removing existing members from location
|
||||
components = list(component_entity.get("members", []))
|
||||
components += [component_entity]
|
||||
for component in components:
|
||||
for loc in component["component_locations"]:
|
||||
if location["id"] == loc["location_id"]:
|
||||
location.remove_component(
|
||||
component, recursive=False
|
||||
)
|
||||
|
||||
# Deleting existing members on component entity
|
||||
for member in component_entity.get("members", []):
|
||||
session.delete(member)
|
||||
del(member)
|
||||
|
||||
try:
|
||||
session.commit()
|
||||
except Exception:
|
||||
tp, value, tb = sys.exc_info()
|
||||
session.rollback()
|
||||
session._configure_locations()
|
||||
six.reraise(tp, value, tb)
|
||||
|
||||
# Reset members in memory
|
||||
if "members" in component_entity.keys():
|
||||
component_entity["members"] = []
|
||||
|
||||
# Add components to origin location
|
||||
try:
|
||||
collection = clique.parse(data["component_path"])
|
||||
except ValueError:
|
||||
# Assume its a single file
|
||||
# Changing file type
|
||||
name, ext = os.path.splitext(data["component_path"])
|
||||
component_entity["file_type"] = ext
|
||||
|
||||
origin_location.add_component(
|
||||
component_entity, data["component_path"]
|
||||
)
|
||||
else:
|
||||
# Changing file type
|
||||
component_entity["file_type"] = collection.format("{tail}")
|
||||
|
||||
# Create member components for sequence.
|
||||
for member_path in collection:
|
||||
|
||||
size = 0
|
||||
try:
|
||||
size = os.path.getsize(member_path)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
name = collection.match(member_path).group("index")
|
||||
|
||||
member_data = {
|
||||
"name": name,
|
||||
"container": component_entity,
|
||||
"size": size,
|
||||
"file_type": os.path.splitext(member_path)[-1]
|
||||
}
|
||||
|
||||
component = session.create(
|
||||
"FileComponent", member_data
|
||||
)
|
||||
origin_location.add_component(
|
||||
component, member_path, recursive=False
|
||||
)
|
||||
component_entity["members"].append(component)
|
||||
|
||||
# Add components to location.
|
||||
location.add_component(
|
||||
component_entity, origin_location, recursive=True
|
||||
)
|
||||
|
||||
data["component"] = component_entity
|
||||
self.log.info(
|
||||
(
|
||||
"Overwriting Component with path: {0}, data: {1},"
|
||||
" location: {2}"
|
||||
).format(
|
||||
data["component_path"],
|
||||
component_data,
|
||||
location
|
||||
)
|
||||
)
|
||||
|
||||
# Extracting metadata, and adding after entity creation. This is
|
||||
# due to a ftrack_api bug where you can't add metadata on creation.
|
||||
component_metadata = component_data.pop("metadata", {})
|
||||
|
||||
# Create new component if none exists.
|
||||
new_component = False
|
||||
if not component_entity:
|
||||
component_entity = asset_version_entity.create_component(
|
||||
data["component_path"],
|
||||
data=component_data,
|
||||
location=location
|
||||
)
|
||||
data["component"] = component_entity
|
||||
self.log.info(
|
||||
(
|
||||
"Created new Component with path: {0}, data: {1},"
|
||||
" metadata: {2}, location: {3}"
|
||||
).format(
|
||||
data["component_path"],
|
||||
component_data,
|
||||
component_metadata,
|
||||
location
|
||||
)
|
||||
)
|
||||
new_component = True
|
||||
|
||||
# Adding metadata
|
||||
existing_component_metadata = component_entity["metadata"]
|
||||
existing_component_metadata.update(component_metadata)
|
||||
component_entity["metadata"] = existing_component_metadata
|
||||
|
||||
# if component_data['name'] = 'ftrackreview-mp4-mp4':
|
||||
# assetversion_entity["thumbnail_id"]
|
||||
|
||||
# Setting assetversion thumbnail
|
||||
if data.get("thumbnail"):
|
||||
asset_version_entity["thumbnail_id"] = component_entity["id"]
|
||||
|
||||
# Inform user about no changes to the database.
|
||||
if (
|
||||
component_entity
|
||||
and not component_overwrite
|
||||
and not new_component
|
||||
):
|
||||
data["component"] = component_entity
|
||||
self.log.info(
|
||||
"Found existing component, and no request to overwrite. "
|
||||
"Nothing has been changed."
|
||||
)
|
||||
else:
|
||||
# Commit changes.
|
||||
try:
|
||||
session.commit()
|
||||
except Exception:
|
||||
tp, value, tb = sys.exc_info()
|
||||
session.rollback()
|
||||
session._configure_locations()
|
||||
six.reraise(tp, value, tb)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue