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

Kitsu: Use query function from client #3496

Merged
merged 23 commits into from
Jul 21, 2022
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
dada2f4
added function which extract project name based on project id
iLLiCiTiT Jul 12, 2022
b4d11d4
use project name function to drop project collection
iLLiCiTiT Jul 12, 2022
ee370cb
change project in session instead of replacing AvalonMongoDB with pym…
iLLiCiTiT Jul 12, 2022
e2920ff
use query functions in sync service
iLLiCiTiT Jul 12, 2022
d393d6c
a little bit more complicated way how to get asset matching zou id
iLLiCiTiT Jul 12, 2022
20c2ced
use query functions in op to zou sync
iLLiCiTiT Jul 12, 2022
96863fa
use query functions in zou to op sync
iLLiCiTiT Jul 12, 2022
767dc3d
a little bit more complicated queries using zou id
iLLiCiTiT Jul 12, 2022
2988af0
added missing import
iLLiCiTiT Jul 12, 2022
5e14a54
fix typo
iLLiCiTiT Jul 12, 2022
e8f30ee
Added typing notation
iLLiCiTiT Jul 12, 2022
a6c029d
skip validation of zou id
iLLiCiTiT Jul 15, 2022
c210c93
changes from comments
iLLiCiTiT Jul 15, 2022
c59a9cb
Fix: shot duplicate name using shot's hierarchy (ep, seq)
Tilix4 Jul 19, 2022
9f41a51
black
Tilix4 Jul 19, 2022
2bf3cf1
Fix wrong name for sequence
Tilix4 Jul 19, 2022
5939588
Change: Asset is put under an AssetType folder
Tilix4 Jul 20, 2022
02cc216
docstring linting line length
Tilix4 Jul 20, 2022
a3144c9
docstring linting line length
Tilix4 Jul 20, 2022
af45aff
docstring linting line length
Tilix4 Jul 20, 2022
480d196
docstring linting line length
Tilix4 Jul 20, 2022
995a584
Merge pull request #3543 from Tilix4/ch_asset_hierarchy
iLLiCiTiT Jul 20, 2022
4530bfe
Merge pull request #3535 from Tilix4/fx_shot_duplicate_name
iLLiCiTiT Jul 20, 2022
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
54 changes: 37 additions & 17 deletions openpype/modules/kitsu/utils/sync_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,16 @@

import gazu

from openpype.client import (
get_project,
get_assets
)
from openpype.pipeline import AvalonMongoDB
from .credentials import validate_credentials
from .update_op_with_zou import (
create_op_asset,
set_op_project,
get_kitsu_project_name,
write_project_to_op,
update_op_assets,
)
Expand Down Expand Up @@ -119,17 +124,16 @@ def _update_project(self, data):

# Write into DB
if update_project:
self.dbcon = self.dbcon.database[project_name]
self.dbcon.Session["AVALON_PROJECT"] = project_name
self.dbcon.bulk_write([update_project])

def _delete_project(self, data):
"""Delete project."""
project_doc = self.dbcon.find_one(
iLLiCiTiT marked this conversation as resolved.
Show resolved Hide resolved
{"type": "project", "data.zou_id": data["project_id"]}
)

project_name = get_kitsu_project_name(data["project_id"])

# Delete project collection
self.dbcon.database[project_doc["name"]].drop()
self.dbcon.database[project_name].drop()

# == Asset ==

Expand All @@ -150,7 +154,8 @@ def _new_asset(self, data):
def _update_asset(self, data):
"""Update asset into OP DB."""
set_op_project(self.dbcon, data["project_id"])
project_doc = self.dbcon.find_one({"type": "project"})
project_name = self.dbcon.active_project()
project_doc = get_project(project_name)

# Get gazu entity
asset = gazu.asset.get_asset(data["asset_id"])
Expand All @@ -159,7 +164,7 @@ def _update_asset(self, data):
# Query all assets of the local project
zou_ids_and_asset_docs = {
asset_doc["data"]["zou"]["id"]: asset_doc
for asset_doc in self.dbcon.find({"type": "asset"})
for asset_doc in get_assets(project_name)
if asset_doc["data"].get("zou", {}).get("id")
}
zou_ids_and_asset_docs[asset["project_id"]] = project_doc
Expand Down Expand Up @@ -199,7 +204,8 @@ def _new_episode(self, data):
def _update_episode(self, data):
"""Update episode into OP DB."""
set_op_project(self.dbcon, data["project_id"])
project_doc = self.dbcon.find_one({"type": "project"})
project_name = self.dbcon.active_project()
project_doc = get_project(project_name)

# Get gazu entity
episode = gazu.shot.get_episode(data["episode_id"])
Expand All @@ -208,7 +214,7 @@ def _update_episode(self, data):
# Query all assets of the local project
zou_ids_and_asset_docs = {
asset_doc["data"]["zou"]["id"]: asset_doc
for asset_doc in self.dbcon.find({"type": "asset"})
for asset_doc in get_assets(project_name)
if asset_doc["data"].get("zou", {}).get("id")
}
zou_ids_and_asset_docs[episode["project_id"]] = project_doc
Expand Down Expand Up @@ -249,7 +255,8 @@ def _new_sequence(self, data):
def _update_sequence(self, data):
"""Update sequence into OP DB."""
set_op_project(self.dbcon, data["project_id"])
project_doc = self.dbcon.find_one({"type": "project"})
project_name = self.dbcon.active_project()
project_doc = get_project(project_name)

# Get gazu entity
sequence = gazu.shot.get_sequence(data["sequence_id"])
Expand All @@ -258,7 +265,7 @@ def _update_sequence(self, data):
# Query all assets of the local project
zou_ids_and_asset_docs = {
asset_doc["data"]["zou"]["id"]: asset_doc
for asset_doc in self.dbcon.find({"type": "asset"})
for asset_doc in get_assets(project_name)
if asset_doc["data"].get("zou", {}).get("id")
}
zou_ids_and_asset_docs[sequence["project_id"]] = project_doc
Expand Down Expand Up @@ -299,7 +306,8 @@ def _new_shot(self, data):
def _update_shot(self, data):
"""Update shot into OP DB."""
set_op_project(self.dbcon, data["project_id"])
project_doc = self.dbcon.find_one({"type": "project"})
project_name = self.dbcon.active_project()
project_doc = get_project(project_name)

# Get gazu entity
shot = gazu.shot.get_shot(data["shot_id"])
Expand All @@ -308,7 +316,7 @@ def _update_shot(self, data):
# Query all assets of the local project
zou_ids_and_asset_docs = {
asset_doc["data"]["zou"]["id"]: asset_doc
for asset_doc in self.dbcon.find({"type": "asset"})
for asset_doc in get_assets(project_name)
if asset_doc["data"].get("zou", {}).get("id")
}
zou_ids_and_asset_docs[shot["project_id"]] = project_doc
Expand All @@ -335,14 +343,25 @@ def _new_task(self, data):
"""Create new task into OP DB."""
# Get project entity
set_op_project(self.dbcon, data["project_id"])
project_name = self.dbcon.active_project()

# Get gazu entity
task = gazu.task.get_task(data["task_id"])

# Find asset doc
asset_doc = self.dbcon.find_one(
{"type": "asset", "data.zou.id": task["entity"]["id"]}
parent_name = task["entity"]["name"]
parent_zou_id = task["entity"]["id"]
asset_docs = get_assets(
project_name,
asset_names=[parent_name],
fields=["_id", "data.zou.id", "data.tasks"]
)
asset_doc = None
for _asset_doc in asset_docs:
doc_zou_id = _asset_doc.get("data", {}).get("zou", {}).get("id")
if doc_zou_id == parent_zou_id:
asset_doc = _asset_doc
break
iLLiCiTiT marked this conversation as resolved.
Show resolved Hide resolved

# Update asset tasks with new one
asset_tasks = asset_doc["data"].get("tasks")
Expand All @@ -359,10 +378,11 @@ def _update_task(self, data):

def _delete_task(self, data):
"""Delete task of OP DB."""
set_op_project(self.dbcon, data["project_id"])

set_op_project(self.dbcon, data["project_id"])
project_name = self.dbcon.active_project()
# Find asset doc
asset_docs = [doc for doc in self.dbcon.find({"type": "asset"})]
asset_docs = list(get_assets(project_name))
for doc in asset_docs:
# Match task
for name, task in doc["data"]["tasks"].items():
Expand Down
95 changes: 74 additions & 21 deletions openpype/modules/kitsu/utils/update_op_with_zou.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@
all_tasks_for_shot,
)

from openpype.client import (
get_project,
get_assets,
get_asset_by_id,
get_asset_by_name
)
from openpype.pipeline import AvalonMongoDB
from openpype.api import get_project_settings
from openpype.lib import create_project
Expand All @@ -33,16 +39,29 @@ def create_op_asset(gazu_entity: dict) -> dict:
}


def get_kitsu_project_name(project_id: str):
iLLiCiTiT marked this conversation as resolved.
Show resolved Hide resolved
"""Get project name based on project id in kitsu.

Args:
project_id (str): Id of project in Kitsu.
iLLiCiTiT marked this conversation as resolved.
Show resolved Hide resolved

Returns:
str: Project name which has project in Kitsu.
iLLiCiTiT marked this conversation as resolved.
Show resolved Hide resolved
"""

project = gazu.project.get_project(project_id)
return project["name"]


def set_op_project(dbcon: AvalonMongoDB, project_id: str):
"""Set project context.

Args:
dbcon (AvalonMongoDB): Connection to DB
project_id (str): Project zou ID
"""
project = gazu.project.get_project(project_id)
project_name = project["name"]
dbcon.Session["AVALON_PROJECT"] = project_name

dbcon.Session["AVALON_PROJECT"] = get_kitsu_project_name(project_id)


def update_op_assets(
Expand Down Expand Up @@ -72,9 +91,7 @@ def update_op_assets(
if not item_doc: # Create asset
op_asset = create_op_asset(item)
insert_result = dbcon.insert_one(op_asset)
item_doc = dbcon.find_one(
{"type": "asset", "_id": insert_result.inserted_id}
)
item_doc = get_asset_by_id(project_name, insert_result.inserted_id)

# Update asset
item_data = deepcopy(item_doc["data"])
Expand Down Expand Up @@ -162,14 +179,32 @@ def update_op_assets(
)
if visual_parent_doc_id is None:
# Find root folder doc
iLLiCiTiT marked this conversation as resolved.
Show resolved Hide resolved
root_folder_doc = dbcon.find_one(
{
"type": "asset",
"name": entity_parent_folders[-1],
"data.root_of": substitute_item_type,
},
["_id"],
root_folder_docs = get_assets(
Tilix4 marked this conversation as resolved.
Show resolved Hide resolved
project_name,
asset_name=[entity_parent_folders[-1]],
fields=["_id", "data.root_of"]
)
# NOTE: Not sure why it's checking for entity type?
Tilix4 marked this conversation as resolved.
Show resolved Hide resolved
# OP3 does not support multiple assets with same names so type
# filtering is irelevant.
# This way mimics previous implementation:
# ```
# root_folder_doc = dbcon.find_one(
# {
# "type": "asset",
# "name": entity_parent_folders[-1],
# "data.root_of": substitute_item_type,
# },
# ["_id"],
# )
# ```
root_folder_doc = None
for folder_doc in root_folder_docs:
root_of = folder_doc.get("data", {}).get("root_of")
if root_of == substitute_item_type:
root_folder_doc = folder_doc
break

if root_folder_doc:
visual_parent_doc_id = root_folder_doc["_id"]

Expand Down Expand Up @@ -222,7 +257,7 @@ def write_project_to_op(project: dict, dbcon: AvalonMongoDB) -> UpdateOne:
UpdateOne: Update instance for the project
"""
project_name = project["name"]
project_doc = dbcon.database[project_name].find_one({"type": "project"})
project_doc = get_project(project_name)
if not project_doc:
print(f"Creating project '{project_name}'")
project_doc = create_project(project_name, project_name, dbcon=dbcon)
Expand Down Expand Up @@ -319,26 +354,44 @@ def sync_project_from_kitsu(dbcon: AvalonMongoDB, project: dict):
bulk_writes.append(write_project_to_op(project, dbcon))

# Try to find project document
dbcon.Session["AVALON_PROJECT"] = project["name"]
project_doc = dbcon.find_one({"type": "project"})
project_name = project["name"]
dbcon.Session["AVALON_PROJECT"] = project_name
project_doc = get_project(project_name)

# Query all assets of the local project
zou_ids_and_asset_docs = {
asset_doc["data"]["zou"]["id"]: asset_doc
for asset_doc in dbcon.find({"type": "asset"})
for asset_doc in get_assets(project_name)
if asset_doc["data"].get("zou", {}).get("id")
}
zou_ids_and_asset_docs[project["id"]] = project_doc

# Create entities root folders
project_module_settings = get_project_settings(project["name"])["kitsu"]
project_module_settings = get_project_settings(project_name)["kitsu"]
for entity_type, root in project_module_settings["entities_root"].items():
parent_folders = root.split("/")
direct_parent_doc = None
for i, folder in enumerate(parent_folders, 1):
parent_doc = dbcon.find_one(
{"type": "asset", "name": folder, "data.root_of": entity_type}
parent_doc = get_asset_by_name(
project_name, folder, fields=["_id", "data.root_of"]
)
# NOTE: Not sure why it's checking for entity type?
# OP3 does not support multiple assets with same names so type
# filtering is irelevant.
# Also all of the entities could find be queried at once using
# 'get_assets'.
# This way mimics previous implementation:
# ```
# parent_doc = dbcon.find_one(
# {"type": "asset", "name": folder, "data.root_of": entity_type}
# )
# ```
if (
parent_doc
and parent_doc.get("data", {}).get("root_of") != entity_type
):
parent_doc = None

if not parent_doc:
direct_parent_doc = dbcon.insert_one(
{
Expand Down Expand Up @@ -371,7 +424,7 @@ def sync_project_from_kitsu(dbcon: AvalonMongoDB, project: dict):
zou_ids_and_asset_docs.update(
{
asset_doc["data"]["zou"]["id"]: asset_doc
for asset_doc in dbcon.find({"type": "asset"})
for asset_doc in get_assets(project_name)
if asset_doc["data"].get("zou")
}
)
Expand Down
7 changes: 3 additions & 4 deletions openpype/modules/kitsu/utils/update_zou_with_op.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import gazu
from pymongo import UpdateOne

from openpype.client import get_project, get_assets
from openpype.pipeline import AvalonMongoDB
from openpype.api import get_project_settings
from openpype.modules.kitsu.utils.credentials import validate_credentials
Expand Down Expand Up @@ -53,9 +54,7 @@ def sync_zou_from_op_project(
"""
# Get project doc if not provided
if not project_doc:
project_doc = dbcon.database[project_name].find_one(
{"type": "project"}
)
project_doc = get_project(project_name)

# Get all entities from zou
print(f"Synchronizing {project_name}...")
Expand Down Expand Up @@ -96,7 +95,7 @@ def sync_zou_from_op_project(
dbcon.Session["AVALON_PROJECT"] = project_name
asset_docs = {
asset_doc["_id"]: asset_doc
for asset_doc in dbcon.find({"type": "asset"})
for asset_doc in get_assets(project_name)
}

# Create new assets
Expand Down