Moving project folder structure creation out of ftrack module #1989

This commit is contained in:
felix.wang 2021-09-08 16:09:40 -07:00
parent 725c0265f2
commit 5a425a5269
6 changed files with 98 additions and 75 deletions

View file

@ -4,6 +4,7 @@ from .settings import (
get_current_project_settings,
get_anatomy_settings,
get_environments,
get_project_basic_paths,
SystemSettings,
ProjectSettings
@ -24,7 +25,8 @@ from .lib import (
get_latest_version,
get_global_environments,
get_local_site_id,
change_openpype_mongo_url
change_openpype_mongo_url,
create_project_folders
)
from .lib.mongo import (
@ -72,6 +74,7 @@ __all__ = [
"get_current_project_settings",
"get_anatomy_settings",
"get_environments",
"get_project_basic_paths",
"SystemSettings",
@ -120,5 +123,9 @@ __all__ = [
"get_global_environments",
"get_local_site_id",
"change_openpype_mongo_url"
"change_openpype_mongo_url",
"get_project_basic_paths",
"create_project_folders"
]

View file

@ -139,7 +139,8 @@ from .plugin_tools import (
from .path_tools import (
version_up,
get_version_from_path,
get_last_version_from_path
get_last_version_from_path,
create_project_folders
)
from .editorial import (
@ -268,5 +269,6 @@ __all__ = [
"range_from_frames",
"frames_to_secons",
"frames_to_timecode",
"make_sequence_collection"
"make_sequence_collection",
"create_project_folders"
]

View file

@ -2,8 +2,12 @@ import os
import re
import logging
from openpype.api import Anatomy
log = logging.getLogger(__name__)
pattern_array = re.compile(r"\[.*\]")
project_root_key = "__project_root__"
def _rreplace(s, a, b, n=1):
"""Replace a with b in string s from right side n times."""
@ -119,3 +123,42 @@ def get_last_version_from_path(path_dir, filter):
return filtred_files[-1]
return None
def compute_paths(basic_paths_items, project_root):
output = []
for path_items in basic_paths_items:
clean_items = []
for path_item in path_items:
matches = re.findall(pattern_array, path_item)
if len(matches) > 0:
path_item = path_item.replace(matches[0], "")
if path_item == project_root_key:
path_item = project_root
clean_items.append(path_item)
output.append(os.path.normpath(os.path.sep.join(clean_items)))
return output
def create_project_folders(basic_paths, project_name):
anatomy = Anatomy(project_name)
roots_paths = []
if isinstance(anatomy.roots, dict):
for root in anatomy.roots.values():
roots_paths.append(root.value)
else:
roots_paths.append(anatomy.roots.value)
for root_path in roots_paths:
project_root = os.path.join(root_path, project_name)
full_paths = compute_paths(basic_paths, project_root)
# Create folders
for path in full_paths:
full_path = path.format(project_root=project_root)
if os.path.exists(full_path):
log.debug(
"Folder already exists: {}".format(full_path)
)
else:
log.debug("Creating folder: {}".format(full_path))
os.makedirs(full_path)

View file

@ -3,7 +3,7 @@ import re
import json
from openpype.modules.ftrack.lib import BaseAction, statics_icon
from openpype.api import Anatomy, get_project_settings
from openpype.api import get_project_basic_paths, create_project_folders
class CreateProjectFolders(BaseAction):
@ -72,25 +72,18 @@ class CreateProjectFolders(BaseAction):
def launch(self, session, entities, event):
# Get project entity
project_entity = self.get_project_from_entity(entities[0])
# Load settings for project
project_name = project_entity["full_name"]
project_settings = get_project_settings(project_name)
project_folder_structure = (
project_settings["global"]["project_folder_structure"]
)
if not project_folder_structure:
return {
"success": False,
"message": "Project structure is not set."
}
try:
if isinstance(project_folder_structure, str):
project_folder_structure = json.loads(project_folder_structure)
# Get paths based on presets
basic_paths = self.get_path_items(project_folder_structure)
self.create_folders(basic_paths, project_entity)
basic_paths = get_project_basic_paths(project_name)
if not basic_paths:
return {
"success": False,
"message": "Project structure is not set."
}
# Invoking OpenPype API to create the project folders
create_project_folders(basic_paths, project_name)
self.create_ftrack_entities(basic_paths, project_entity)
except Exception as exc:
@ -195,58 +188,6 @@ class CreateProjectFolders(BaseAction):
self.session.commit()
return new_ent
def get_path_items(self, in_dict):
output = []
for key, value in in_dict.items():
if not value:
output.append(key)
else:
paths = self.get_path_items(value)
for path in paths:
if not isinstance(path, (list, tuple)):
path = [path]
output.append([key, *path])
return output
def compute_paths(self, basic_paths_items, project_root):
output = []
for path_items in basic_paths_items:
clean_items = []
for path_item in path_items:
matches = re.findall(self.pattern_array, path_item)
if len(matches) > 0:
path_item = path_item.replace(matches[0], "")
if path_item == self.project_root_key:
path_item = project_root
clean_items.append(path_item)
output.append(os.path.normpath(os.path.sep.join(clean_items)))
return output
def create_folders(self, basic_paths, project):
anatomy = Anatomy(project["full_name"])
roots_paths = []
if isinstance(anatomy.roots, dict):
for root in anatomy.roots.values():
roots_paths.append(root.value)
else:
roots_paths.append(anatomy.roots.value)
for root_path in roots_paths:
project_root = os.path.join(root_path, project["full_name"])
full_paths = self.compute_paths(basic_paths, project_root)
# Create folders
for path in full_paths:
full_path = path.format(project_root=project_root)
if os.path.exists(full_path):
self.log.debug(
"Folder already exists: {}".format(full_path)
)
else:
self.log.debug("Creating folder: {}".format(full_path))
os.makedirs(full_path)
def register(session):
CreateProjectFolders(session).register()

View file

@ -7,7 +7,8 @@ from .lib import (
get_current_project_settings,
get_anatomy_settings,
get_environments,
get_local_settings
get_local_settings,
get_project_basic_paths
)
from .entities import (
SystemSettings,
@ -24,7 +25,7 @@ __all__ = (
"get_anatomy_settings",
"get_environments",
"get_local_settings",
"get_project_basic_paths",
"SystemSettings",
"ProjectSettings"
)

View file

@ -901,6 +901,35 @@ def get_general_environments():
return environments
def _list_path_items(folder_structure):
output = []
for key, value in folder_structure.items():
if not value:
output.append(key)
else:
paths = _list_path_items(value)
for path in paths:
if not isinstance(path, (list, tuple)):
path = [path]
output.append([key, *path])
return output
def get_project_basic_paths(project_name):
project_settings = get_project_settings(project_name)
folder_structure = (
project_settings["global"]["project_folder_structure"]
)
if not folder_structure:
return []
if isinstance(folder_structure, str):
folder_structure = json.loads(folder_structure)
return _list_path_items(folder_structure)
def clear_metadata_from_settings(values):
"""Remove all metadata keys from loaded settings."""
if isinstance(values, dict):