Merged in bugfix/ftrack_session_rollback (pull request #376)

Bugfix/ftrack session rollback

Approved-by: Milan Kolar <milan@orbi.tools>
This commit is contained in:
Jakub Trllo 2019-11-19 22:23:12 +00:00 committed by Milan Kolar
commit eebb251112
15 changed files with 131 additions and 33 deletions

View file

@ -108,6 +108,7 @@ class JobKiller(BaseAction):
'Changing Job ({}) status: {} -> failed' 'Changing Job ({}) status: {} -> failed'
).format(job['id'], origin_status)) ).format(job['id'], origin_status))
except Exception: except Exception:
session.rollback()
self.log.warning(( self.log.warning((
'Changing Job ({}) has failed' 'Changing Job ({}) has failed'
).format(job['id'])) ).format(job['id']))

View file

@ -43,7 +43,7 @@ class ThumbToChildren(BaseAction):
'description': 'Push thumbnails to Childrens' 'description': 'Push thumbnails to Childrens'
}) })
}) })
session.commit()
try: try:
for entity in entities: for entity in entities:
thumbid = entity['thumbnail_id'] thumbid = entity['thumbnail_id']
@ -53,10 +53,11 @@ class ThumbToChildren(BaseAction):
# inform the user that the job is done # inform the user that the job is done
job['status'] = 'done' job['status'] = 'done'
except Exception: except Exception as exc:
session.rollback()
# fail the job if something goes wrong # fail the job if something goes wrong
job['status'] = 'failed' job['status'] = 'failed'
raise raise exc
finally: finally:
session.commit() session.commit()

View file

@ -40,9 +40,9 @@ class ThumbToParent(BaseAction):
'status': 'running', 'status': 'running',
'data': json.dumps({ 'data': json.dumps({
'description': 'Push thumbnails to parents' 'description': 'Push thumbnails to parents'
})
}) })
})
session.commit()
try: try:
for entity in entities: for entity in entities:
parent = None parent = None
@ -74,10 +74,11 @@ class ThumbToParent(BaseAction):
# inform the user that the job is done # inform the user that the job is done
job['status'] = status or 'done' job['status'] = status or 'done'
except Exception as e: except Exception as exc:
session.rollback()
# fail the job if something goes wrong # fail the job if something goes wrong
job['status'] = 'failed' job['status'] = 'failed'
raise e raise exc
finally: finally:
session.commit() session.commit()

View file

@ -80,10 +80,10 @@ class NextTaskUpdate(BaseEvent):
'>>> [ {} ] updated to [ Ready ]' '>>> [ {} ] updated to [ Ready ]'
).format(path)) ).format(path))
except Exception as e: except Exception as e:
session.rollback()
self.log.warning(( self.log.warning((
'!!! [ {} ] status couldnt be set: [ {} ]' '!!! [ {} ] status couldnt be set: [ {} ]'
).format(path, e)) ).format(path, str(e)), exc_info=True)
session.rollback()
def register(session, plugins_presets): def register(session, plugins_presets):

View file

@ -2,7 +2,7 @@ from pype.vendor import ftrack_api
from pype.ftrack import BaseEvent from pype.ftrack import BaseEvent
class Radio_buttons(BaseEvent): class RadioButtons(BaseEvent):
ignore_me = True ignore_me = True

View file

@ -2,7 +2,7 @@ from pype.vendor import ftrack_api
from pype.ftrack import BaseEvent, lib from pype.ftrack import BaseEvent, lib
class Sync_to_Avalon(BaseEvent): class SyncToAvalon(BaseEvent):
priority = 100 priority = 100
@ -101,7 +101,7 @@ class Sync_to_Avalon(BaseEvent):
avalon_project = result['project'] avalon_project = result['project']
except Exception as e: except Exception as e:
session.reset() # reset session to clear it session.rollback() # reset session to clear it
message = str(e) message = str(e)
title = 'Hey You! Unknown Error has been raised! (*look below*)' title = 'Hey You! Unknown Error has been raised! (*look below*)'
@ -124,4 +124,4 @@ class Sync_to_Avalon(BaseEvent):
def register(session, plugins_presets): def register(session, plugins_presets):
'''Register plugin. Called when used as an plugin.''' '''Register plugin. Called when used as an plugin.'''
Sync_to_Avalon(session, plugins_presets).register() SyncToAvalon(session, plugins_presets).register()

View file

@ -5,7 +5,7 @@ from pype.vendor import ftrack_api
from pype.ftrack import BaseEvent from pype.ftrack import BaseEvent
class Test_Event(BaseEvent): class TestEvent(BaseEvent):
ignore_me = True ignore_me = True
@ -23,4 +23,4 @@ class Test_Event(BaseEvent):
def register(session, plugins_presets): def register(session, plugins_presets):
'''Register plugin. Called when used as an plugin.''' '''Register plugin. Called when used as an plugin.'''
Test_Event(session, plugins_presets).register() TestEvent(session, plugins_presets).register()

View file

@ -62,6 +62,7 @@ class VersionToTaskStatus(BaseEvent):
task['status'] = task_status task['status'] = task_status
session.commit() session.commit()
except Exception as e: except Exception as e:
session.rollback()
self.log.warning('!!! [ {} ] status couldnt be set:\ self.log.warning('!!! [ {} ] status couldnt be set:\
[ {} ]'.format(path, e)) [ {} ]'.format(path, e))
else: else:

View file

@ -128,6 +128,7 @@ class BaseHandler(object):
try: try:
return func(*args, **kwargs) return func(*args, **kwargs)
except Exception as exc: except Exception as exc:
self.session.rollback()
msg = '{} "{}": Failed ({})'.format(self.type, label, str(exc)) msg = '{} "{}": Failed ({})'.format(self.type, label, str(exc))
self.log.error(msg, exc_info=True) self.log.error(msg, exc_info=True)
return { return {

View file

@ -26,6 +26,7 @@ class BaseEvent(BaseHandler):
try: try:
func(*args, **kwargs) func(*args, **kwargs)
except Exception as exc: except Exception as exc:
self.session.rollback()
self.log.error( self.log.error(
'Event "{}" Failed: {}'.format( 'Event "{}" Failed: {}'.format(
self.__class__.__name__, str(exc) self.__class__.__name__, str(exc)

View file

@ -1,5 +1,6 @@
import os import os
import sys import sys
import six
import pyblish.api import pyblish.api
import clique import clique
@ -125,6 +126,12 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin):
metadata=asset_metadata metadata=asset_metadata
) )
) )
try:
session.commit()
except Exception:
tp, value, tb = sys.exc_info()
session.rollback()
six.reraise(tp, value, tb)
# Adding metadata # Adding metadata
existing_asset_metadata = asset_entity["metadata"] existing_asset_metadata = asset_entity["metadata"]
@ -162,6 +169,12 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin):
metadata=assetversion_metadata metadata=assetversion_metadata
) )
) )
try:
session.commit()
except Exception:
tp, value, tb = sys.exc_info()
session.rollback()
six.reraise(tp, value, tb)
# Adding metadata # Adding metadata
existing_assetversion_metadata = assetversion_entity["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 # Have to commit the version and asset, because location can't
# determine the final location without. # 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 # Component
# Get existing entity. # Get existing entity.
@ -209,7 +227,12 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin):
session.delete(member) session.delete(member)
del(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 # Reset members in memory
if "members" in component_entity.keys(): if "members" in component_entity.keys():
@ -320,4 +343,9 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin):
) )
else: else:
# Commit changes. # Commit changes.
session.commit() try:
session.commit()
except Exception:
tp, value, tb = sys.exc_info()
session.rollback()
six.reraise(tp, value, tb)

View file

@ -1,4 +1,6 @@
import sys
import pyblish.api import pyblish.api
import six
class IntegrateFtrackComments(pyblish.api.InstancePlugin): class IntegrateFtrackComments(pyblish.api.InstancePlugin):
@ -21,4 +23,9 @@ class IntegrateFtrackComments(pyblish.api.InstancePlugin):
entity["notes"].extend(notes) entity["notes"].extend(notes)
session.commit() try:
session.commit()
except Exception:
tp, value, tb = sys.exc_info()
session.rollback()
six.reraise(tp, value, tb)

View file

@ -1,3 +1,6 @@
import sys
import six
import pyblish.api import pyblish.api
from avalon import io from avalon import io
@ -74,9 +77,10 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin):
# try to find if entity already exists # try to find if entity already exists
else: else:
query = 'TypedContext where name is "{0}" and project.full_name is "{1}"'.format( query = (
entity_name, self.ft_project["full_name"] 'TypedContext where name is "{0}" and '
) 'project_id is "{1}"'
).format(entity_name, self.ft_project["id"])
try: try:
entity = self.session.query(query).one() entity = self.session.query(query).one()
except Exception: except Exception:
@ -106,7 +110,12 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin):
for instance in instances: for instance in instances:
instance.data['ftrackEntity'] = entity 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
tasks = entity_data.get('tasks', []) tasks = entity_data.get('tasks', [])
@ -129,11 +138,21 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin):
task_type=task, task_type=task,
parent=entity 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. # Incoming links.
self.create_links(entity_data, entity) 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: if 'childs' in entity_data:
self.import_to_ftrack( self.import_to_ftrack(
@ -143,7 +162,12 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin):
# Clear existing links. # Clear existing links.
for link in entity.get("incoming_links", []): for link in entity.get("incoming_links", []):
self.session.delete(link) 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. # Create new links.
for input in entity_data.get("inputs", []): for input in entity_data.get("inputs", []):
@ -179,7 +203,12 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin):
self.log.info(self.task_types) self.log.info(self.task_types)
task['type'] = self.task_types[task_type] 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 return task
@ -188,6 +217,11 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin):
'name': name, 'name': name,
'parent': parent '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 return entity

View file

@ -1,4 +1,6 @@
import sys
import pyblish.api import pyblish.api
import six
class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin): class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin):
@ -91,7 +93,12 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin):
for instance in instances: for instance in instances:
instance.data['ftrackShotId'] = entity['id'] 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
tasks = entity_data.get('tasks', []) tasks = entity_data.get('tasks', [])
@ -114,7 +121,6 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin):
task_type=ftrack_types[task], task_type=ftrack_types[task],
parent=entity parent=entity
) )
self.session.commit()
if 'childs' in entity_data: if 'childs' in entity_data:
self.import_to_ftrack( self.import_to_ftrack(
@ -141,7 +147,12 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin):
self.log.info(self.task_types) self.log.info(self.task_types)
task['type'] = self.task_types[task_type] 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 return task
@ -150,6 +161,11 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin):
'name': name, 'name': name,
'parent': parent '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 return entity

View file

@ -1,6 +1,8 @@
import sys
import pyblish.api import pyblish.api
import pype.api import pype.api
import avalon.api import avalon.api
import six
class ValidateAutoSyncOff(pyblish.api.ContextPlugin): class ValidateAutoSyncOff(pyblish.api.ContextPlugin):
@ -48,4 +50,9 @@ class ValidateAutoSyncOff(pyblish.api.ContextPlugin):
session = context.data["ftrackSession"] session = context.data["ftrackSession"]
invalid = cls.get_invalid(context) invalid = cls.get_invalid(context)
invalid['custom_attributes']['avalon_auto_sync'] = False 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)