ayon-core/openpype/tools/assetlinks/widgets.py
2022-12-21 13:52:52 +01:00

155 lines
5.1 KiB
Python

import collections
from openpype.client import (
get_versions,
get_subsets,
get_assets,
get_output_link_versions,
)
from qtpy import QtWidgets
class SimpleLinkView(QtWidgets.QWidget):
def __init__(self, dbcon, parent):
super(SimpleLinkView, self).__init__(parent=parent)
self.dbcon = dbcon
# TODO: display selected target
in_text = QtWidgets.QLabel("Inputs")
in_view = QtWidgets.QListWidget(parent=self)
out_text = QtWidgets.QLabel("Outputs")
out_view = QtWidgets.QListWidget(parent=self)
layout = QtWidgets.QGridLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(in_text, 0, 0)
layout.addWidget(in_view, 1, 0)
layout.addWidget(out_text, 0, 1)
layout.addWidget(out_view, 1, 1)
self._in_view = in_view
self._out_view = out_view
self._version_doc_to_process = None
@property
def project_name(self):
return self.dbcon.current_project()
def clear(self):
self._in_view.clear()
self._out_view.clear()
def set_version(self, version_doc):
self.clear()
self._version_doc_to_process = version_doc
if version_doc and self.isVisible():
self._fill_values()
def showEvent(self, event):
super(SimpleLinkView, self).showEvent(event)
self._fill_values()
def _fill_values(self):
if self._version_doc_to_process is None:
return
version_doc = self._version_doc_to_process
self._version_doc_to_process = None
self._fill_inputs(version_doc)
self._fill_outputs(version_doc)
def _fill_inputs(self, version_doc):
version_ids = set()
for link in version_doc["data"].get("inputLinks", []):
# Backwards compatibility for "input" key used as "id"
if "id" not in link:
link_id = link["input"]
else:
link_id = link["id"]
version_ids.add(link_id)
version_docs = list(get_versions(
self.project_name,
version_ids=version_ids,
fields=["name", "parent"]
))
versions_by_subset_id = collections.defaultdict(list)
for version_doc in version_docs:
subset_id = version_doc["parent"]
versions_by_subset_id[subset_id].append(version_doc)
subset_docs = []
if versions_by_subset_id:
subset_docs = list(get_subsets(
self.project_name,
subset_ids=versions_by_subset_id.keys(),
fields=["_id", "name", "parent"]
))
asset_docs = []
subsets_by_asset_id = collections.defaultdict(list)
if subset_docs:
for subset_doc in subset_docs:
asset_id = subset_doc["parent"]
subsets_by_asset_id[asset_id].append(subset_doc)
asset_docs = list(get_assets(
self.project_name,
asset_ids=subsets_by_asset_id.keys(),
fields=["_id", "name"]
))
for asset_doc in asset_docs:
asset_id = asset_doc["_id"]
for subset_doc in subsets_by_asset_id[asset_id]:
subset_id = subset_doc["_id"]
for version_doc in versions_by_subset_id[subset_id]:
self._in_view.addItem("{} {} v{:0>3}".format(
asset_doc["name"],
subset_doc["name"],
version_doc["name"],
))
def _fill_outputs(self, version_doc):
version_docs = list(get_output_link_versions(
self.project_name,
version_doc["_id"],
fields=["name", "parent"]
))
versions_by_subset_id = collections.defaultdict(list)
for version_doc in version_docs:
subset_id = version_doc["parent"]
versions_by_subset_id[subset_id].append(version_doc)
subset_docs = []
if versions_by_subset_id:
subset_docs = list(get_subsets(
self.project_name,
subset_ids=versions_by_subset_id.keys(),
fields=["_id", "name", "parent"]
))
asset_docs = []
subsets_by_asset_id = collections.defaultdict(list)
if subset_docs:
for subset_doc in subset_docs:
asset_id = subset_doc["parent"]
subsets_by_asset_id[asset_id].append(subset_doc)
asset_docs = list(get_assets(
self.project_name,
asset_ids=subsets_by_asset_id.keys(),
fields=["_id", "name"]
))
for asset_doc in asset_docs:
asset_id = asset_doc["_id"]
for subset_doc in subsets_by_asset_id[asset_id]:
subset_id = subset_doc["_id"]
for version_doc in versions_by_subset_id[subset_id]:
self._out_view.addItem("{} {} v{:0>3}".format(
asset_doc["name"],
subset_doc["name"],
version_doc["name"],
))