diff --git a/pype/ftrack/actions/action_job_killer.py b/pype/ftrack/actions/action_job_killer.py index 56a280a663..c7839f5508 100644 --- a/pype/ftrack/actions/action_job_killer.py +++ b/pype/ftrack/actions/action_job_killer.py @@ -108,6 +108,7 @@ class JobKiller(BaseAction): 'Changing Job ({}) status: {} -> failed' ).format(job['id'], origin_status)) except Exception: + session.rollback() self.log.warning(( 'Changing Job ({}) has failed' ).format(job['id'])) diff --git a/pype/ftrack/actions/action_thumbnail_to_childern.py b/pype/ftrack/actions/action_thumbnail_to_childern.py index 7d189cf652..4a6a85a6e6 100644 --- a/pype/ftrack/actions/action_thumbnail_to_childern.py +++ b/pype/ftrack/actions/action_thumbnail_to_childern.py @@ -43,7 +43,7 @@ class ThumbToChildren(BaseAction): 'description': 'Push thumbnails to Childrens' }) }) - + session.commit() try: for entity in entities: thumbid = entity['thumbnail_id'] @@ -53,10 +53,11 @@ class ThumbToChildren(BaseAction): # inform the user that the job is done job['status'] = 'done' - except Exception: + except Exception as exc: + session.rollback() # fail the job if something goes wrong job['status'] = 'failed' - raise + raise exc finally: session.commit() diff --git a/pype/ftrack/actions/action_thumbnail_to_parent.py b/pype/ftrack/actions/action_thumbnail_to_parent.py index efafca4a96..596d49836f 100644 --- a/pype/ftrack/actions/action_thumbnail_to_parent.py +++ b/pype/ftrack/actions/action_thumbnail_to_parent.py @@ -40,9 +40,9 @@ class ThumbToParent(BaseAction): 'status': 'running', 'data': json.dumps({ 'description': 'Push thumbnails to parents' - }) }) - + }) + session.commit() try: for entity in entities: parent = None @@ -74,10 +74,11 @@ class ThumbToParent(BaseAction): # inform the user that the job is done job['status'] = status or 'done' - except Exception as e: + except Exception as exc: + session.rollback() # fail the job if something goes wrong job['status'] = 'failed' - raise e + raise exc finally: session.commit() diff --git a/pype/ftrack/events/event_next_task_update.py b/pype/ftrack/events/event_next_task_update.py index 51ccb2f057..68db07d03d 100644 --- a/pype/ftrack/events/event_next_task_update.py +++ b/pype/ftrack/events/event_next_task_update.py @@ -80,10 +80,10 @@ class NextTaskUpdate(BaseEvent): '>>> [ {} ] updated to [ Ready ]' ).format(path)) except Exception as e: + session.rollback() self.log.warning(( '!!! [ {} ] status couldnt be set: [ {} ]' - ).format(path, e)) - session.rollback() + ).format(path, str(e)), exc_info=True) def register(session, plugins_presets): diff --git a/pype/ftrack/events/event_radio_buttons.py b/pype/ftrack/events/event_radio_buttons.py index 917c7a49e6..56d4c4cb65 100644 --- a/pype/ftrack/events/event_radio_buttons.py +++ b/pype/ftrack/events/event_radio_buttons.py @@ -2,7 +2,7 @@ from pype.vendor import ftrack_api from pype.ftrack import BaseEvent -class Radio_buttons(BaseEvent): +class RadioButtons(BaseEvent): ignore_me = True diff --git a/pype/ftrack/events/event_sync_to_avalon.py b/pype/ftrack/events/event_sync_to_avalon.py index 3fe65bca11..6ede2a4d11 100644 --- a/pype/ftrack/events/event_sync_to_avalon.py +++ b/pype/ftrack/events/event_sync_to_avalon.py @@ -2,7 +2,7 @@ from pype.vendor import ftrack_api from pype.ftrack import BaseEvent, lib -class Sync_to_Avalon(BaseEvent): +class SyncToAvalon(BaseEvent): priority = 100 @@ -101,7 +101,7 @@ class Sync_to_Avalon(BaseEvent): avalon_project = result['project'] except Exception as e: - session.reset() # reset session to clear it + session.rollback() # reset session to clear it message = str(e) title = 'Hey You! Unknown Error has been raised! (*look below*)' @@ -124,4 +124,4 @@ class Sync_to_Avalon(BaseEvent): def register(session, plugins_presets): '''Register plugin. Called when used as an plugin.''' - Sync_to_Avalon(session, plugins_presets).register() + SyncToAvalon(session, plugins_presets).register() diff --git a/pype/ftrack/events/event_test.py b/pype/ftrack/events/event_test.py index a909aa5510..bcea5b47e4 100644 --- a/pype/ftrack/events/event_test.py +++ b/pype/ftrack/events/event_test.py @@ -5,7 +5,7 @@ from pype.vendor import ftrack_api from pype.ftrack import BaseEvent -class Test_Event(BaseEvent): +class TestEvent(BaseEvent): ignore_me = True @@ -23,4 +23,4 @@ class Test_Event(BaseEvent): def register(session, plugins_presets): '''Register plugin. Called when used as an plugin.''' - Test_Event(session, plugins_presets).register() + TestEvent(session, plugins_presets).register() diff --git a/pype/ftrack/events/event_version_to_task_statuses.py b/pype/ftrack/events/event_version_to_task_statuses.py index 66a55c0cf7..607a31f44e 100644 --- a/pype/ftrack/events/event_version_to_task_statuses.py +++ b/pype/ftrack/events/event_version_to_task_statuses.py @@ -62,6 +62,7 @@ class VersionToTaskStatus(BaseEvent): task['status'] = task_status session.commit() except Exception as e: + session.rollback() self.log.warning('!!! [ {} ] status couldnt be set:\ [ {} ]'.format(path, e)) else: diff --git a/pype/ftrack/lib/ftrack_base_handler.py b/pype/ftrack/lib/ftrack_base_handler.py index f22f80e7f1..200006dd2d 100644 --- a/pype/ftrack/lib/ftrack_base_handler.py +++ b/pype/ftrack/lib/ftrack_base_handler.py @@ -128,6 +128,7 @@ class BaseHandler(object): try: return func(*args, **kwargs) except Exception as exc: + self.session.rollback() msg = '{} "{}": Failed ({})'.format(self.type, label, str(exc)) self.log.error(msg, exc_info=True) return { diff --git a/pype/ftrack/lib/ftrack_event_handler.py b/pype/ftrack/lib/ftrack_event_handler.py index db55eef16e..80a86527ab 100644 --- a/pype/ftrack/lib/ftrack_event_handler.py +++ b/pype/ftrack/lib/ftrack_event_handler.py @@ -26,6 +26,7 @@ class BaseEvent(BaseHandler): try: func(*args, **kwargs) except Exception as exc: + self.session.rollback() self.log.error( 'Event "{}" Failed: {}'.format( self.__class__.__name__, str(exc) diff --git a/pype/plugins/ftrack/publish/integrate_ftrack_api.py b/pype/plugins/ftrack/publish/integrate_ftrack_api.py index 87b14b612b..b7d9a2855d 100644 --- a/pype/plugins/ftrack/publish/integrate_ftrack_api.py +++ b/pype/plugins/ftrack/publish/integrate_ftrack_api.py @@ -1,5 +1,6 @@ import os import sys +import six import pyblish.api import clique @@ -125,6 +126,12 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin): metadata=asset_metadata ) ) + try: + session.commit() + except Exception: + tp, value, tb = sys.exc_info() + session.rollback() + six.reraise(tp, value, tb) # Adding metadata existing_asset_metadata = asset_entity["metadata"] @@ -162,6 +169,12 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin): metadata=assetversion_metadata ) ) + try: + session.commit() + except Exception: + tp, value, tb = sys.exc_info() + session.rollback() + six.reraise(tp, value, tb) # Adding metadata existing_assetversion_metadata = assetversion_entity["metadata"] @@ -170,7 +183,12 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin): # Have to commit the version and asset, because location can't # determine the final location without. - session.commit() + try: + session.commit() + except Exception: + tp, value, tb = sys.exc_info() + session.rollback() + six.reraise(tp, value, tb) # Component # Get existing entity. @@ -209,7 +227,12 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin): session.delete(member) del(member) - session.commit() + try: + session.commit() + except Exception: + tp, value, tb = sys.exc_info() + session.rollback() + six.reraise(tp, value, tb) # Reset members in memory if "members" in component_entity.keys(): @@ -320,4 +343,9 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin): ) else: # Commit changes. - session.commit() + try: + session.commit() + except Exception: + tp, value, tb = sys.exc_info() + session.rollback() + six.reraise(tp, value, tb) diff --git a/pype/plugins/ftrack/publish/integrate_ftrack_comments.py b/pype/plugins/ftrack/publish/integrate_ftrack_comments.py index 889a78e254..9d0b7b3ab9 100644 --- a/pype/plugins/ftrack/publish/integrate_ftrack_comments.py +++ b/pype/plugins/ftrack/publish/integrate_ftrack_comments.py @@ -1,4 +1,6 @@ +import sys import pyblish.api +import six class IntegrateFtrackComments(pyblish.api.InstancePlugin): @@ -21,4 +23,9 @@ class IntegrateFtrackComments(pyblish.api.InstancePlugin): entity["notes"].extend(notes) - session.commit() + try: + session.commit() + except Exception: + tp, value, tb = sys.exc_info() + session.rollback() + six.reraise(tp, value, tb) diff --git a/pype/plugins/ftrack/publish/integrate_hierarchy_ftrack.py b/pype/plugins/ftrack/publish/integrate_hierarchy_ftrack.py index 73a4d8af97..6e2017ca4e 100644 --- a/pype/plugins/ftrack/publish/integrate_hierarchy_ftrack.py +++ b/pype/plugins/ftrack/publish/integrate_hierarchy_ftrack.py @@ -1,3 +1,6 @@ +import sys + +import six import pyblish.api from avalon import io @@ -74,9 +77,10 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin): # try to find if entity already exists else: - query = 'TypedContext where name is "{0}" and project.full_name is "{1}"'.format( - entity_name, self.ft_project["full_name"] - ) + query = ( + 'TypedContext where name is "{0}" and ' + 'project_id is "{1}"' + ).format(entity_name, self.ft_project["id"]) try: entity = self.session.query(query).one() except Exception: @@ -106,7 +110,12 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin): for instance in instances: instance.data['ftrackEntity'] = entity - self.session.commit() + try: + self.session.commit() + except Exception: + tp, value, tb = sys.exc_info() + self.session.rollback() + six.reraise(tp, value, tb) # TASKS tasks = entity_data.get('tasks', []) @@ -129,11 +138,21 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin): task_type=task, parent=entity ) - self.session.commit() + try: + self.session.commit() + except Exception: + tp, value, tb = sys.exc_info() + self.session.rollback() + six.reraise(tp, value, tb) # Incoming links. self.create_links(entity_data, entity) - self.session.commit() + try: + self.session.commit() + except Exception: + tp, value, tb = sys.exc_info() + self.session.rollback() + six.reraise(tp, value, tb) if 'childs' in entity_data: self.import_to_ftrack( @@ -143,7 +162,12 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin): # Clear existing links. for link in entity.get("incoming_links", []): self.session.delete(link) - self.session.commit() + try: + self.session.commit() + except Exception: + tp, value, tb = sys.exc_info() + self.session.rollback() + six.reraise(tp, value, tb) # Create new links. for input in entity_data.get("inputs", []): @@ -179,7 +203,12 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin): self.log.info(self.task_types) task['type'] = self.task_types[task_type] - self.session.commit() + try: + self.session.commit() + except Exception: + tp, value, tb = sys.exc_info() + self.session.rollback() + six.reraise(tp, value, tb) return task @@ -188,6 +217,11 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin): 'name': name, 'parent': parent }) - self.session.commit() + try: + self.session.commit() + except Exception: + tp, value, tb = sys.exc_info() + self.session.rollback() + six.reraise(tp, value, tb) return entity diff --git a/pype/plugins/premiere/publish/integrate_hierarchy_ftrack.py b/pype/plugins/premiere/publish/integrate_hierarchy_ftrack.py index d6d03e9722..c32df636e1 100644 --- a/pype/plugins/premiere/publish/integrate_hierarchy_ftrack.py +++ b/pype/plugins/premiere/publish/integrate_hierarchy_ftrack.py @@ -1,4 +1,6 @@ +import sys import pyblish.api +import six class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin): @@ -91,7 +93,12 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin): for instance in instances: instance.data['ftrackShotId'] = entity['id'] - self.session.commit() + try: + self.session.commit() + except Exception: + tp, value, tb = sys.exc_info() + self.session.rollback() + six.reraise(tp, value, tb) # TASKS tasks = entity_data.get('tasks', []) @@ -114,7 +121,6 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin): task_type=ftrack_types[task], parent=entity ) - self.session.commit() if 'childs' in entity_data: self.import_to_ftrack( @@ -141,7 +147,12 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin): self.log.info(self.task_types) task['type'] = self.task_types[task_type] - self.session.commit() + try: + self.session.commit() + except Exception: + tp, value, tb = sys.exc_info() + self.session.rollback() + six.reraise(tp, value, tb) return task @@ -150,6 +161,11 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin): 'name': name, 'parent': parent }) - self.session.commit() + try: + self.session.commit() + except Exception: + tp, value, tb = sys.exc_info() + self.session.rollback() + six.reraise(tp, value, tb) return entity diff --git a/pype/plugins/premiere/publish/validate_auto_sync_off.py b/pype/plugins/premiere/publish/validate_auto_sync_off.py index 3b46a682ab..b6429cfa05 100644 --- a/pype/plugins/premiere/publish/validate_auto_sync_off.py +++ b/pype/plugins/premiere/publish/validate_auto_sync_off.py @@ -1,6 +1,8 @@ +import sys import pyblish.api import pype.api import avalon.api +import six class ValidateAutoSyncOff(pyblish.api.ContextPlugin): @@ -48,4 +50,9 @@ class ValidateAutoSyncOff(pyblish.api.ContextPlugin): session = context.data["ftrackSession"] invalid = cls.get_invalid(context) invalid['custom_attributes']['avalon_auto_sync'] = False - session.commit() + try: + session.commit() + except Exception: + tp, value, tb = sys.exc_info() + session.rollback() + six.reraise(tp, value, tb)