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

Ftrack: Unset task ids from asset versions before tasks are removed #2800

Merged
merged 2 commits into from
Feb 24, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 20 additions & 4 deletions openpype/modules/ftrack/event_handlers_user/action_delete_asset.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
from datetime import datetime

from bson.objectid import ObjectId
from openpype_modules.ftrack.lib import BaseAction, statics_icon
from avalon.api import AvalonMongoDB
from openpype_modules.ftrack.lib import BaseAction, statics_icon
from openpype_modules.ftrack.lib.avalon_sync import create_chunks


class DeleteAssetSubset(BaseAction):
Expand Down Expand Up @@ -554,8 +555,8 @@ def launch(self, session, entities, event):
ftrack_proc_txt, ", ".join(ftrack_ids_to_delete)
))

entities_by_link_len = (
self._filter_entities_to_delete(ftrack_ids_to_delete, session)
entities_by_link_len = self._prepare_entities_before_delete(
ftrack_ids_to_delete, session
)
for link_len in sorted(entities_by_link_len.keys(), reverse=True):
for entity in entities_by_link_len[link_len]:
Expand Down Expand Up @@ -609,7 +610,7 @@ def launch(self, session, entities, event):

return self.report_handle(report_messages, project_name, event)

def _filter_entities_to_delete(self, ftrack_ids_to_delete, session):
def _prepare_entities_before_delete(self, ftrack_ids_to_delete, session):
"""Filter children entities to avoid CircularDependencyError."""
joined_ids_to_delete = ", ".join(
["\"{}\"".format(id) for id in ftrack_ids_to_delete]
Expand Down Expand Up @@ -638,6 +639,21 @@ def _filter_entities_to_delete(self, ftrack_ids_to_delete, session):
parent_ids_to_delete.append(entity["id"])
to_delete_entities.append(entity)

# Unset 'task_id' from AssetVersion entities
# - when task is deleted the asset version is not marked for deletion
task_ids = set(
entity["id"]
for entity in to_delete_entities
if entity.entity_type.lower() == "task"
)
for chunk in create_chunks(task_ids):
asset_versions = session.query((
"select id, task_id from AssetVersion where task_id in ({})"
).format(self.join_query_keys(chunk))).all()
for asset_version in asset_versions:
asset_version["task_id"] = None
session.commit()

entities_by_link_len = collections.defaultdict(list)
for entity in to_delete_entities:
entities_by_link_len[len(entity["link"])].append(entity)
Expand Down
30 changes: 26 additions & 4 deletions openpype/modules/ftrack/lib/avalon_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,30 @@
}


def create_chunks(iterable, chunk_size=None):
"""Separate iterable into multiple chunks by size.

Args:
iterable(list|tuple|set): Object that will be separated into chunks.
chunk_size(int): Size of one chunk. Default value is 200.

Returns:
list<list>: Chunked items.
"""
chunks = []
if not iterable:
return chunks

tupled_iterable = tuple(iterable)
iterable_size = len(tupled_iterable)
if chunk_size is None:
chunk_size = 200

for idx in range(0, iterable_size, chunk_size):
chunks.append(tupled_iterable[idx:idx + chunk_size])
return chunks


def check_regex(name, entity_type, in_schema=None, schema_patterns=None):
schema_name = "asset-3.0"
if in_schema:
Expand Down Expand Up @@ -1147,10 +1171,8 @@ def _get_input_links(self, ftrack_ids):
ids_len = len(tupled_ids)
chunk_size = int(5000 / ids_len)
all_links = []
for idx in range(0, ids_len, chunk_size):
entity_ids_joined = join_query_keys(
tupled_ids[idx:idx + chunk_size]
)
for chunk in create_chunks(ftrack_ids, chunk_size):
entity_ids_joined = join_query_keys(chunk)

all_links.extend(self.session.query((
"select from_id, to_id from"
Expand Down