mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-25 21:32:15 +01:00
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:
commit
eebb251112
15 changed files with 131 additions and 33 deletions
|
|
@ -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']))
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue