Merge pull request #237 from ynput/bugfix/workfiles-tool-templates

Workfiles tool: Fix work with anatomy templates
This commit is contained in:
Jakub Trllo 2024-03-25 18:19:36 +01:00 committed by GitHub
commit 8a39bd0fc8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -25,7 +25,14 @@ from ayon_core.tools.workfiles.abstract import (
class CommentMatcher(object): class CommentMatcher(object):
"""Use anatomy and work file data to parse comments from filenames""" """Use anatomy and work file data to parse comments from filenames.
Args:
extensions (set[str]): Set of extensions.
file_template (AnatomyStringTemplate): File template.
data (dict[str, Any]): Data to fill the template with.
"""
def __init__(self, extensions, file_template, data): def __init__(self, extensions, file_template, data):
self.fname_regex = None self.fname_regex = None
@ -199,6 +206,22 @@ class WorkareaModel:
def _get_last_workfile_version( def _get_last_workfile_version(
self, workdir, file_template, fill_data, extensions self, workdir, file_template, fill_data, extensions
): ):
"""
Todos:
Validate if logic of this function is correct. It does return
last version + 1 which might be wrong.
Args:
workdir (str): Workdir path.
file_template (str): File template.
fill_data (dict[str, Any]): Fill data.
extensions (set[str]): Extensions.
Returns:
int: Next workfile version.
"""
version = get_last_workfile_with_version( version = get_last_workfile_with_version(
workdir, file_template, fill_data, extensions workdir, file_template, fill_data, extensions
)[1] )[1]
@ -225,8 +248,21 @@ class WorkareaModel:
root, root,
current_filename, current_filename,
): ):
"""Get comments from root directory.
Args:
file_template (AnatomyStringTemplate): File template.
extensions (set[str]): Extensions.
fill_data (dict[str, Any]): Fill data.
root (str): Root directory.
current_filename (str): Current filename.
Returns:
Tuple[list[str], Union[str, None]]: Comment hints and current
comment.
"""
current_comment = None current_comment = None
comment_hints = set()
filenames = [] filenames = []
if root and os.path.exists(root): if root and os.path.exists(root):
for filename in os.listdir(root): for filename in os.listdir(root):
@ -239,10 +275,11 @@ class WorkareaModel:
filenames.append(filename) filenames.append(filename)
if not filenames: if not filenames:
return comment_hints, current_comment return [], current_comment
matcher = CommentMatcher(extensions, file_template, fill_data) matcher = CommentMatcher(extensions, file_template, fill_data)
comment_hints = set()
for filename in filenames: for filename in filenames:
comment = matcher.parse_comment(filename) comment = matcher.parse_comment(filename)
if comment: if comment:
@ -259,18 +296,18 @@ class WorkareaModel:
return directory_template.format_strict(fill_data).normalized() return directory_template.format_strict(fill_data).normalized()
def get_workarea_save_as_data(self, folder_id, task_id): def get_workarea_save_as_data(self, folder_id, task_id):
folder = None folder_entity = None
task = None task_entity = None
if folder_id: if folder_id:
folder = self._controller.get_folder_entity( folder_entity = self._controller.get_folder_entity(
self.project_name, folder_id self.project_name, folder_id
) )
if task_id: if folder_entity and task_id:
task = self._controller.get_task_entity( task_entity = self._controller.get_task_entity(
self.project_name, task_id self.project_name, task_id
) )
if not folder or not task: if not folder_entity or not task_entity:
return { return {
"template_key": None, "template_key": None,
"template_has_version": None, "template_has_version": None,
@ -302,10 +339,11 @@ class WorkareaModel:
file_template = anatomy.get_template_item( file_template = anatomy.get_template_item(
"work", template_key, "file" "work", template_key, "file"
).template )
file_template_str = file_template.template
template_has_version = "{version" in file_template template_has_version = "{version" in file_template_str
template_has_comment = "{comment" in file_template template_has_comment = "{comment" in file_template_str
comment_hints, comment = self._get_comments_from_root( comment_hints, comment = self._get_comments_from_root(
file_template, file_template,
@ -315,7 +353,8 @@ class WorkareaModel:
current_filename, current_filename,
) )
last_version = self._get_last_workfile_version( last_version = self._get_last_workfile_version(
workdir, file_template, fill_data, extensions) workdir, file_template_str, fill_data, extensions
)
return { return {
"template_key": template_key, "template_key": template_key,
@ -338,19 +377,34 @@ class WorkareaModel:
version, version,
comment, comment,
): ):
"""Fill workarea filepath based on context.
Args:
folder_id (str): Folder id.
task_id (str): Task id.
extension (str): File extension.
use_last_version (bool): Use last version.
version (int): Version number.
comment (str): Comment.
Returns:
WorkareaFilepathResult: Workarea filepath result.
"""
anatomy = self._controller.project_anatomy anatomy = self._controller.project_anatomy
fill_data = self._prepare_fill_data(folder_id, task_id) fill_data = self._prepare_fill_data(folder_id, task_id)
template_key = self._get_template_key(fill_data) template_key = self._get_template_key(fill_data)
workdir = self._get_workdir(anatomy, template_key, fill_data) workdir = self._get_workdir(anatomy, template_key, fill_data)
file_template = anatomy.get_template_item( file_template = anatomy.get_template_item(
"work", template_key, "file" "work", template_key, "file"
).template )
if use_last_version: if use_last_version:
version = self._get_last_workfile_version( version = self._get_last_workfile_version(
workdir, file_template, fill_data, self._extensions workdir, file_template.template, fill_data, self._extensions
) )
fill_data["version"] = version fill_data["version"] = version
fill_data["ext"] = extension.lstrip(".") fill_data["ext"] = extension.lstrip(".")