diff --git a/openpype/tools/republisher/republisher_processor/control.py b/openpype/tools/republisher/republisher_processor/control.py index 8a235561d7..36e78bfdc6 100644 --- a/openpype/tools/republisher/republisher_processor/control.py +++ b/openpype/tools/republisher/republisher_processor/control.py @@ -1,43 +1,63 @@ import os import re import copy -import requests +import socket +import itertools + from openpype.client import ( get_project, get_asset_by_id, + get_subset_by_id, get_subset_by_name, - get_representation_by_id, - get_representation_parents, + get_version_by_id, + get_last_version_by_subset_id, + get_version_by_name, + get_representations, + get_representation_by_name, +) +from openpype.client.operations import ( + OperationsSession, + new_subset_document, + new_version_doc, + prepare_version_update_data, +) +from openpype.lib import ( + StringTemplate, + get_openpype_username, + get_formatted_current_time, ) -from openpype.lib import StringTemplate from openpype.settings import get_project_settings +from openpype.pipeline import Anatomy +from openpype.pipeline.template_data import get_template_data from openpype.pipeline.publish import get_publish_template_name from openpype.pipeline.create import get_subset_name +UNKNOWN = object() + class RepublishError(Exception): pass -class RepublishItem: +class ProjectPushItem: def __init__( self, src_project_name, - src_representation_id, + src_version_id, dst_project_name, dst_asset_id, dst_task_name, dst_version=None ): self.src_project_name = src_project_name - self.src_representation_id = src_representation_id + self.src_version_id = src_version_id self.dst_project_name = dst_project_name self.dst_asset_id = dst_asset_id self.dst_task_name = dst_task_name self.dst_version = dst_version self._id = "|".join([ src_project_name, - src_representation_id, + src_version_id, dst_project_name, dst_asset_id, dst_task_name @@ -50,14 +70,391 @@ class RepublishItem: def __repr__(self): return "{} - {} -> {}/{}/{}".format( self.src_project_name, - self.src_representation_id, + self.src_version_id, self.dst_project_name, self.dst_asset_id, self.dst_task_name ) -class RepublishItemStatus: +class ProjectPushRepreItem: + """Representation item. + + Args: + repre_doc (Dict[str, Ant]): Representation document. + roots (Dict[str, str]): Project roots (based on project anatomy). + """ + + def __init__(self, repre_doc, roots): + self._repre_doc = repre_doc + self._roots = roots + self._src_files = None + self._resource_files = None + + @property + def repre_doc(self): + return self._repre_doc + + @property + def src_files(self): + if self._src_files is None: + self.get_source_files() + return self._src_files + + @property + def resource_files(self): + if self._resource_files is None: + self.get_source_files() + return self._resource_files + + @staticmethod + def validate_source_files(src_files, resource_files): + if not src_files: + raise AssertionError(( + "Couldn't figure out source files from representation." + " Found resource files {}" + ).format(", ".join(str(i) for i in resource_files))) + + invalid_items = [ + item + for item in itertools.chain(src_files, resource_files) + if not item.is_valid_file + ] + if invalid_items: + raise AssertionError(( + "Source files that were not found on disk: {}" + ).format(", ".join(str(i) for i in invalid_items))) + + def get_source_files(self): + if self._src_files is not None: + return self._src_files, self._resource_files + + repre_context = self._repre_doc["context"] + if "frame" in repre_context or "udim" in repre_context: + src_files, resource_files = self._get_source_files_with_frames() + else: + src_files, resource_files = self._get_source_files() + + self.validate_source_files(src_files, resource_files) + + self._src_files = src_files + self._resource_files = resource_files + return self._src_files, self._resource_files + + def _get_source_files_with_frames(self): + frame_placeholder = "__frame__" + udim_placeholder = "__udim__" + src_files = [] + resource_files = [] + template = self._repre_doc["data"]["template"] + repre_context = self._repre_doc["context"] + fill_repre_context = copy.deepcopy(repre_context) + if "frame" in fill_repre_context: + fill_repre_context["frame"] = frame_placeholder + + if "udim" in fill_repre_context: + fill_repre_context["udim"] = udim_placeholder + + fill_roots = fill_repre_context["root"] + for root_name in tuple(fill_roots.keys()): + fill_roots[root_name] = "{{root[{}]}}".format(root_name) + repre_path = StringTemplate.format_template(template, + fill_repre_context) + repre_path = repre_path.replace("\\", "/") + src_dirpath, src_basename = os.path.split(repre_path) + src_basename = ( + re.escape(src_basename) + .replace(frame_placeholder, "(?P[0-9]+)") + .replace(udim_placeholder, "(?P[0-9]+)") + ) + src_basename_regex = re.compile("^{}$".format(src_basename)) + for file_info in self._repre_doc["files"]: + filepath_template = file_info["path"].replace("\\", "/") + filepath = filepath_template.format(root=self._roots) + dirpath, basename = os.path.split(filepath_template) + if dirpath != src_dirpath or not src_basename_regex.match(basename): + relative_dir = dirpath.replace(src_dirpath, "") + if relative_dir: + relative_path = "/".join([relative_dir, basename]) + else: + relative_path = basename + resource_files.append(ResourceFile(filepath, relative_path)) + continue + + frame = None + udim = None + for item in src_basename_regex.finditer(basename): + group_name = item.lastgroup + value = item.group(group_name) + if group_name == "frame": + frame = int(value) + elif group_name == "udim": + udim = value + + src_files.append(SourceFile(filepath, frame, udim)) + + return src_files, resource_files + + def _get_source_files(self): + src_files = [] + resource_files = [] + template = self._repre_doc["data"]["template"] + repre_context = self._repre_doc["context"] + fill_repre_context = copy.deepcopy(repre_context) + fill_roots = fill_repre_context["root"] + for root_name in tuple(fill_roots.keys()): + fill_roots[root_name] = "{{root[{}]}}".format(root_name) + repre_path = StringTemplate.format_template(template, + fill_repre_context) + repre_path = repre_path.replace("\\", "/") + src_dirpath = os.path.dirname(repre_path) + for file_info in self._repre_doc["files"]: + filepath_template = file_info["path"].replace("\\", "/") + filepath = filepath_template.format(root=self._roots) + if filepath_template == repre_path: + src_files.append(SourceFile(filepath)) + else: + dirpath, basename = os.path.split(filepath_template) + relative_dir = dirpath.replace(src_dirpath, "") + if relative_dir: + relative_path = "/".join([relative_dir, basename]) + else: + relative_path = basename + + resource_files.append( + ResourceFile(filepath, relative_path) + ) + return src_files, resource_files + + +class ProjectPushItemProcess: + """ + Args: + item (ProjectPushItem): Item which is being processed. + """ + + # TODO how to define 'variant'? - ask user + variant = "Main" + # TODO where to get host?!!! + host_name = "republisher" + + def __init__(self, item): + self._item = item + self._src_project_doc = UNKNOWN + self._src_asset_doc = UNKNOWN + self._src_subset_doc = UNKNOWN + self._src_version_doc = UNKNOWN + self._src_repre_items = UNKNOWN + self._src_anatomy = None + + self._project_doc = UNKNOWN + self._anatomy = None + self._asset_doc = UNKNOWN + self._task_info = UNKNOWN + self._subset_doc = None + self._version_doc = None + + self._family = UNKNOWN + self._subset_name = UNKNOWN + + self._project_settings = UNKNOWN + self._template_name = UNKNOWN + + self._src_files = UNKNOWN + self._src_resource_files = UNKNOWN + + def get_src_project_doc(self): + if self._src_project_doc is UNKNOWN: + self._src_project_doc = get_project(self._item.src_project_name) + return self._src_project_doc + + def get_src_anatomy(self): + if self._src_anatomy is None: + self._src_anatomy = Anatomy(self._item.src_project_name) + return self._src_anatomy + + def get_src_asset_doc(self): + if self._src_asset_doc is UNKNOWN: + asset_doc = None + subset_doc = self.get_src_subset_doc() + if subset_doc: + asset_doc = get_asset_by_id( + self._item.src_project_name, + subset_doc["parent"] + ) + self._src_asset_doc = asset_doc + return self._src_asset_doc + + def get_src_subset_doc(self): + if self._src_subset_doc is UNKNOWN: + version_doc = self.get_src_version_doc() + subset_doc = None + if version_doc: + subset_doc = get_subset_by_id( + self._item.src_project_name, + version_doc["parent"] + ) + self._src_subset_doc = subset_doc + return self._src_subset_doc + + def get_src_version_doc(self): + if self._src_version_doc is UNKNOWN: + self._src_version_doc = get_version_by_id( + self._item.src_project_name, self._item.src_version_id + ) + return self._src_version_doc + + def get_src_repre_items(self): + if self._src_repre_items is UNKNOWN: + repre_items = None + version_doc = self.get_src_version_doc() + if version_doc: + repre_docs = get_representations( + self._item.src_project_name, + version_ids=[version_doc["_id"]] + ) + repre_items = [ + ProjectPushRepreItem(repre_doc, self.src_anatomy.roots) + for repre_doc in repre_docs + ] + self._src_repre_items = repre_items + return self._src_repre_items + + src_project_doc = property(get_src_project_doc) + src_anatomy = property(get_src_anatomy) + src_asset_doc = property(get_src_asset_doc) + src_subset_doc = property(get_src_subset_doc) + src_version_doc = property(get_src_version_doc) + src_repre_items = property(get_src_repre_items) + + def get_project_doc(self): + if self._project_doc is UNKNOWN: + self._project_doc = get_project(self._item.dst_project_name) + return self._project_doc + + def get_anatomy(self): + if self._anatomy is None: + self._anatomy = Anatomy(self._item.dst_project_name) + return self._anatomy + + def get_asset_doc(self): + if self._asset_doc is UNKNOWN: + self._asset_doc = get_asset_by_id( + self._item.dst_project_name, self._item.dst_asset_id + ) + return self._asset_doc + + def get_task_info(self): + if self._task_info is UNKNOWN: + task_name = self._item.dst_task_name + if not task_name: + self._task_info = {} + return self._task_info + + project_doc = self.get_project_doc() + asset_doc = self.get_asset_doc() + if not project_doc or not asset_doc: + self._task_info = None + return self._task_info + + asset_tasks = asset_doc.get("data", {}).get("tasks") or {} + task_info = asset_tasks.get(task_name) + if not task_info: + self._task_info = None + return self._task_info + + # Create copy of task info to avoid changing data in asset document + task_info = copy.deepcopy(task_info) + task_info["name"] = task_name + # Fill rest of task information based on task type + task_type = task_info["type"] + task_type_info = project_doc["config"]["tasks"].get(task_type, {}) + task_info.update(task_type_info) + self._task_info = task_info + + return self._task_info + + def get_subset_doc(self): + return self._subset_doc + + def set_subset_doc(self, subset_doc): + self._subset_doc = subset_doc + + def get_version_doc(self): + return self._version_doc + + def set_version_doc(self, version_doc): + self._version_doc = version_doc + + project_doc = property(get_project_doc) + anatomy = property(get_anatomy) + asset_doc = property(get_asset_doc) + task_info = property(get_task_info) + subset_doc = property(get_subset_doc) + version_doc = property(get_version_doc, set_version_doc) + + def get_project_settings(self): + if self._project_settings is UNKNOWN: + self._project_settings = get_project_settings( + self._item.dst_project_name + ) + return self._project_settings + + project_settings = property(get_project_settings) + + @property + def family(self): + if self._family is UNKNOWN: + family = None + subset_doc = self.src_subset_doc + if subset_doc: + family = subset_doc["data"].get("family") + families = subset_doc["data"].get("families") + if not family and families: + family = families[0] + self._family = family + return self._family + + @property + def subset_name(self): + if self._subset_name is UNKNOWN: + subset_name = None + family = self.family + asset_doc = self.asset_doc + task_info = self.task_info + if family and asset_doc and task_info: + subset_name = get_subset_name( + family, + self.variant, + task_info["name"], + asset_doc, + project_name=self._item.dst_project_name, + host_name=self.host_name, + project_settings=self.project_settings + ) + self._subset_name = subset_name + return self._subset_name + + @property + def template_name(self): + if self._template_name is UNKNOWN: + task_info = self.task_info + family = self.family + template_name = None + if family and task_info: + template_name = get_publish_template_name( + self._item.dst_project_name, + self.host_name, + self.family, + task_info["name"], + task_info["type"], + project_settings=self.project_settings + ) + self._template_name = template_name + return self._template_name + + +class ProjectPushItemStatus: def __init__( self, item, @@ -131,9 +528,18 @@ class RepublisherController: return dict(self._items) -class SourceFile: - def __init__(self, path, frame=None, udim=None): +class FileItem(object): + def __init__(self, path): self.path = path + + @property + def is_valid_file(self): + return os.path.exists(self.path) and os.path.isfile(self.path) + + +class SourceFile(FileItem): + def __init__(self, path, frame=None, udim=None): + super(SourceFile, self).__init__(path) self.frame = frame self.udim = udim @@ -147,189 +553,231 @@ class SourceFile: return "<{}> '{}'".format(" - ".join(subparts), self.path) -class ResourceFile: +class ResourceFile(FileItem): def __init__(self, path, relative_path): - self.path = path + super(ResourceFile, self).__init__(path) self.relative_path = relative_path def __repr__(self): return "<{}> '{}'".format(self.__class__.__name__, self.relative_path) -def get_source_files_with_frames(src_representation): - frame_placeholder = "__frame__" - udim_placeholder = "__udim__" - src_files = [] - resource_files = [] - template = src_representation["data"]["template"] - repre_context = src_representation["context"] - fill_repre_context = copy.deepcopy(repre_context) - if "frame" in fill_repre_context: - fill_repre_context["frame"] = frame_placeholder +def _make_sure_subset_exists(item_process, project_name, operations): + dst_asset_doc = item_process.asset_doc + subset_name = item_process.subset_name + family = item_process.family + asset_id = dst_asset_doc["_id"] + subset_doc = get_subset_by_name(project_name, subset_name, asset_id) + if subset_doc: + return subset_doc - if "udim" in fill_repre_context: - fill_repre_context["udim"] = udim_placeholder - - fill_roots = fill_repre_context["root"] - for root_name in tuple(fill_roots.keys()): - fill_roots[root_name] = "{{root[{}]}}".format(root_name) - repre_path = StringTemplate.format_template(template, fill_repre_context) - repre_path = repre_path.replace("\\", "/") - src_dirpath, src_basename = os.path.split(repre_path) - src_basename = ( - re.escape(src_basename) - .replace(frame_placeholder, "(?P[0-9]+)") - .replace(udim_placeholder, "(?P[0-9]+)") + data = { + "families": [family] + } + subset_doc = new_subset_document( + subset_name, family, asset_id, data ) - src_basename_regex = re.compile("^{}$".format(src_basename)) - for file_info in src_representation["files"]: - filepath = file_info["path"].replace("\\", "/") - dirpath, basename = os.path.split(filepath) - if dirpath != src_dirpath or not src_basename_regex.match(basename): - relative_dir = dirpath.replace(src_dirpath, "") - if relative_dir: - relative_path = "/".join([relative_dir, basename]) - else: - relative_path = basename - resource_files.append(ResourceFile(filepath, relative_path)) - continue - - frame = None - udim = None - for item in src_basename_regex.finditer(basename): - group_name = item.lastgroup - value = item.group(group_name) - if group_name == "frame": - frame = int(value) - elif group_name == "udim": - udim = value - - src_files.append(SourceFile(filepath, frame, udim)) - - return src_files, resource_files + operations.create_entity(project_name, "subset", subset_doc) + item_process.set_subset_doc(subset_doc) -def get_source_files(src_representation): - repre_context = src_representation["context"] - if "frame" in repre_context or "udim" in repre_context: - return get_source_files_with_frames(src_representation) - - src_files = [] - resource_files = [] - template = src_representation["data"]["template"] - fill_repre_context = copy.deepcopy(repre_context) - fill_roots = fill_repre_context["root"] - for root_name in tuple(fill_roots.keys()): - fill_roots[root_name] = "{{root[{}]}}".format(root_name) - repre_path = StringTemplate.format_template(template, fill_repre_context) - repre_path = repre_path.replace("\\", "/") - src_dirpath = os.path.dirname(repre_path) - for file_info in src_representation["files"]: - filepath = file_info["path"] - if filepath == repre_path: - src_files.append(SourceFile(filepath)) - else: - dirpath, basename = os.path.split(filepath) - relative_dir = dirpath.replace(src_dirpath, "") - if relative_dir: - relative_path = "/".join([relative_dir, basename]) - else: - relative_path = basename - resource_files.append(ResourceFile(filepath, relative_path)) - return src_files, resource_files - - -def _republish_to( - item, +def _make_sure_version_exists( item_process, - src_representation, - src_representation_parents, - dst_asset_doc, - dst_task_info + project_name, + version, + operations ): + """Make sure version document exits in database. + + Args: + item_process (ProjectPushItemProcess): Item handling process. + project_name (str): Name of project where version should live. + version (Union[int, None]): Number of version. Latest is used when + 'None' is passed. + operations (OperationsSession): Session which handler creation and + update of entities. + + Returns: + Tuple[Dict[str, Any], bool]: New version document and boolean if version + already existed in database. + """ + + src_version_doc = item_process.src_version_doc + subset_doc = item_process.subset_doc + subset_id = subset_doc["_id"] + src_data = src_version_doc["data"] + families = subset_doc["data"].get("families") + if not families: + families = [subset_doc["data"]["family"]] + + version_data = { + "families": list(families), + "fps": src_data.get("fps"), + "source": src_data.get("source"), + "machine": socket.gethostname(), + "comment": "", + "author": get_openpype_username(), + "time": get_formatted_current_time(), + } + if version is None: + last_version_doc = get_last_version_by_subset_id( + project_name, subset_id + ) + version = 1 + if last_version_doc: + version += int(last_version_doc["name"]) + + existing_version_doc = get_version_by_name( + project_name, version, subset_id + ) + # Update existing version + if existing_version_doc: + version_doc = new_version_doc( + version, subset_id, version_data, existing_version_doc["_id"] + ) + update_data = prepare_version_update_data( + existing_version_doc, version_doc + ) + if update_data: + operations.update_entity( + project_name, + "version", + existing_version_doc["_id"], + update_data + ) + item_process.set_version_doc(version_doc) + + return + + if version is None: + last_version_doc = get_last_version_by_subset_id( + project_name, subset_id + ) + version = 1 + if last_version_doc: + version += int(last_version_doc["name"]) + + version_doc = new_version_doc( + version, subset_id, version_data + ) + operations.create_entity(project_name, "version", version_doc) + + item_process.set_version_doc(version_doc) + + +def _integrate_representations(item, item_process, item_status, operations): """ Args: - item (RepublishItem): Item to process. - item_process (RepublishItemStatus): Item process information. - src_representation (Dict[str, Any]): Representation document. - src_representation_parents (Tuple[Any, Any, Any, Any]): Representation - parent documents. - dst_asset_doc (Dict[str, Any]): Asset document as destination of - publishing. - dst_task_info (Dict[str, str]): Task information with prepared - infromation from project config. + item (ProjectPushItem): Item to be pushed to different project. + item_process (ProjectPushItemProcess): Process of push item. """ - src_subset_doc = src_representation_parents[1] - family = src_subset_doc["data"].get("family") - if not family: - families = src_subset_doc["data"]["families"] - family = families[0] + version_id = item_process.version_doc["_id"] + repre_names = { + repre_item.repre_doc["name"] + for repre_item in item_process.src_repre_items + } + existing_repres = get_representations( + item.dst_project_name, + representation_names=repre_names, + version_ids=[version_id] + ) + existing_repres_by_name = { + repre_doc["name"] : repre_doc + for repre_doc in existing_repres + } + anatomy = item_process.anatomy + formatting_data = get_template_data( + item_process.project_doc, + item_process.asset_doc, + item.dst_task_name, + item_process.host_name + ) - item_process.add_progress_message( + +def _republish_to(item, item_process, item_status): + """ + + Args: + item (ProjectPushItem): Item to process. + item_process (ProjectPushItemProcess): Item process information. + item_status (ProjectPushItemStatus): Item status information. + """ + + family = item_process.family + item_status.add_progress_message( f"Republishing family '{family}' (Based on source subset)" ) - # TODO how to define 'variant'? - variant = "Main" - # TODO where to get host? - host_name = "republisher" - project_settings = get_project_settings(item.dst_project_name) - subset_name = get_subset_name( - family, - variant, - dst_task_info["name"], - dst_asset_doc, - project_name=item.dst_project_name, - host_name=host_name, - project_settings=project_settings - ) - item_process.add_progress_message(f"Final subset name is '{subset_name}'") + subset_name = item_process.subset_name + item_status.add_progress_message(f"Final subset name is '{subset_name}'") - template_name = get_publish_template_name( - item.dst_project_name, - host_name, - family, - dst_task_info["name"], - dst_task_info["type"], - project_settings=project_settings - ) - item_process.add_progress_message( + template_name = item_process.template_name + item_status.add_progress_message( f"Using template '{template_name}' for integration" ) - src_files, resource_files = get_source_files(src_representation) + repre_items = item_process.src_repre_items + file_count = sum( + len(repre_item.src_files) + len(repre_item.resource_files) + for repre_item in repre_items + ) + item_status.add_progress_message( + f"Representation has {file_count} files to integrate" + ) + + operations = OperationsSession() + item_status.add_progress_message( + f"Integration to {item.dst_project_name} begins." + ) + _make_sure_subset_exists( + item_process, + item.dst_project_name, + operations + ) + _make_sure_version_exists( + item_process, + item.dst_project_name, + item.dst_version, + operations + ) + _integrate_representations(item, item_process, item_status, operations) -def _process_item(item, item_process): +def _process_item(item, item_process, item_status): + """ + + Args: + item (ProjectPushItem): Item defying the source and destination. + item_process (ProjectPushItemProcess): Process item. + item_status (ProjectPushItemStatus): Status of process item. + """ + # Query all entities source and destination # - all of them are required for processing to exist # --- Source entities --- # Project - we just need validation of existence src_project_name = item.src_project_name - src_project_doc = get_project(src_project_name, fields=["name"]) + src_project_doc = item_process.get_src_project_doc() if not src_project_doc: - item_process.error = ( + item_status.error = ( f"Source project '{src_project_name}' was not found" ) return - item_process.add_progress_message(f"Project '{src_project_name}' found") + item_status.add_progress_message(f"Project '{src_project_name}' found") # Representation - contains information of source files and template data - src_representation_id = item.src_representation_id - src_representation = get_representation_by_id( - src_project_name, src_representation_id - ) - if not src_representation: - item_process.error = ( - f"Representation with id '{src_representation_id}'" - f" was not found in project '{src_project_name}'" + repre_items = item_process.get_src_repre_items() + if not repre_items: + item_status.error = ( + f"Version {item.src_version_id} does not have any representations" ) return - item_process.add_progress_message( - f"Representation with id '{src_representation_id}' found" - f" in project '{src_project_name}'" + + item_status.add_progress_message( + f"Found {len(repre_items)} representations on" + f" version {item.src_version_id} in project '{src_project_name}'" ) # --- Destination entities --- @@ -338,73 +786,51 @@ def _process_item(item, item_process): dst_task_name = item.dst_task_name # Validate project existence - dst_project_doc = get_project(dst_project_name, fields=["name", "config"]) + dst_project_doc = item_process.get_project_doc() if not dst_project_doc: - item_process.error = ( + item_status.error = ( f"Destination project '{dst_project_name}' was not found" ) return - item_process.add_progress_message(f"Project '{dst_project_name}' found") + item_status.add_progress_message(f"Project '{dst_project_name}' found") # Get asset document - dst_asset_doc = get_asset_by_id( - dst_project_name, - dst_asset_id - ) - if not dst_asset_doc: - item_process.error = ( + if not item_process.asset_doc: + item_status.error = ( f"Destination asset with id '{dst_asset_id}'" f" was not found in project '{dst_project_name}'" ) return - item_process.add_progress_message(( + item_status.add_progress_message(( f"Asset with id '{dst_asset_id}'" f" found in project '{dst_project_name}'" )) # Get task information from asset document - asset_tasks = dst_asset_doc.get("data", {}).get("tasks") or {} - task_info = asset_tasks.get(dst_task_name) - if not task_info: - item_process.error = ( + if not item_process.task_info: + item_status.error = ( f"Destination task '{dst_task_name}'" f" was not found on asset with id '{dst_asset_id}'" f" in project '{dst_project_name}'" ) return - item_process.add_progress_message(( + item_status.add_progress_message(( f"Task with name '{dst_task_name}'" f" found on asset with id '{dst_asset_id}'" f" in project '{dst_project_name}'" )) - # Create copy of task info to avoid changing data in asset document - dst_task_info = copy.deepcopy(task_info) - dst_task_info["name"] = dst_task_name - # Fill rest of task information based on task type - task_type = dst_task_info["type"] - task_type_info = dst_project_doc["config"]["tasks"].get(task_type) - dst_task_info.update(task_type_info) - src_representation_parents = get_representation_parents( - src_project_name, src_representation - ) - _republish_to( - item, - item_process, - src_representation, - src_representation_parents, - dst_asset_doc, - dst_task_info - ) + _republish_to(item, item_process, item_status) def fake_process(controller): items = controller.get_items() for item in items.values(): - item_process = RepublishItemStatus(item) - _process_item(item, item_process) - if item_process.failed: + item_process = ProjectPushItemProcess(item) + item_status = ProjectPushItemStatus(item) + _process_item(item, item_process, item_status) + if item_status.failed: print("Process failed") else: print("Process Finished") @@ -414,15 +840,16 @@ def main(): # NOTE For development purposes controller = RepublisherController() project_name = "" - representation_id = "" + verssion_id = "" dst_project_name = "" dst_asset_id = "" dst_task_name = "" - controller.add_item(RepublishItem( + controller.add_item(ProjectPushItem( project_name, - representation_id, + version_id, dst_project_name, dst_asset_id, - dst_task_name + dst_task_name, + dst_version=1 )) fake_process(controller) \ No newline at end of file