From 2bf0d29ebe3bf0ed5d9cc597b407db379e98c85d Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 19 Jan 2021 10:44:48 +0000 Subject: [PATCH 1/6] Clone review session with children. --- .../actions/action_clone_review_session.py | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 pype/modules/ftrack/actions/action_clone_review_session.py diff --git a/pype/modules/ftrack/actions/action_clone_review_session.py b/pype/modules/ftrack/actions/action_clone_review_session.py new file mode 100644 index 0000000000..863a929f59 --- /dev/null +++ b/pype/modules/ftrack/actions/action_clone_review_session.py @@ -0,0 +1,133 @@ +import json + +from pype.modules.ftrack.lib import BaseAction + + +def clone_review_session(session, entity): + # Create a client review with timestamp. + name = entity["name"] + review_session = session.create( + "ReviewSession", + { + "name": f"Clone of {name}", + "project": entity["project"] + } + ) + + # Add all invitees. + for invitee in entity["review_session_invitees"]: + session.create( + "ReviewSessionInvitee", + { + "name": invitee["name"], + "email": invitee["email"], + "review_session": review_session + } + ) + + # Add all objects to new review session. + for obj in entity["review_session_objects"]: + session.create( + "ReviewSessionObject", + { + "name": obj["name"], + "version": obj["version"], + "review_session": review_session, + "asset_version": obj["asset_version"] + } + ) + + session.commit() + + +class CloneReviewSession(BaseAction): + '''Generate Client Review action + `label` a descriptive string identifing your action. + `varaint` To group actions together, give them the same + label and specify a unique variant per action. + `identifier` a unique identifier for your action. + `description` a verbose descriptive text for you action + ''' + label = "Clone Review Session" + variant = None + identifier = "clone-review-session" + description = None + + def discover(self, session, entities, event): + '''Return true if we can handle the selected entities. + *session* is a `ftrack_api.Session` instance + *entities* is a list of tuples each containing the entity type and the + entity id. + If the entity is a hierarchical you will always get the entity + type TypedContext, once retrieved through a get operation you + will have the "real" entity type ie. example Shot, Sequence + or Asset Build. + *event* the unmodified original event + ''' + if len(entities) == 1: + if entities[0].entity_type == "ReviewSession": + return True + + return False + + def launch(self, session, entities, event): + '''Callback method for the custom action. + return either a bool ( True if successful or False if the action + failed ) or a dictionary with they keys `message` and `success`, the + message should be a string and will be displayed as feedback to the + user, success should be a bool, True if successful or False if the + action failed. + *session* is a `ftrack_api.Session` instance + *entities* is a list of tuples each containing the entity type and the + entity id. + If the entity is a hierarchical you will always get the entity + type TypedContext, once retrieved through a get operation you + will have the "real" entity type ie. example Shot, Sequence + or Asset Build. + *event* the unmodified original event + ''' + userId = event['source']['user']['id'] + user = session.query('User where id is ' + userId).one() + job = session.create( + 'Job', + { + 'user': user, + 'status': 'running', + 'data': json.dumps({ + 'description': 'Cloning Review Session.' + }) + } + ) + session.commit() + + try: + clone_review_session(session, entities[0]) + + job['status'] = 'done' + session.commit() + except Exception: + session.rollback() + job["status"] = "failed" + session.commit() + self.log.error( + "Cloning review session failed ({})", exc_info=True + ) + + return { + 'success': True, + 'message': 'Action completed successfully' + } + + +def register(session, plugins_presets=None): + '''Register action. Called when used as an event plugin.''' + + CloneReviewSession(session, plugins_presets).register() + + +if __name__ == "__main__": + import ftrack_api + session = ftrack_api.Session() + id = "8394ad42-4f61-11eb-9060-aecad24e2bb7" + entity = session.get("ReviewSession", id) + clone_review_session(session, entity) From 430c2a7210e1087a96b7d4fcb9ad50aac5491bd2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 22 Jan 2021 09:47:11 +0100 Subject: [PATCH 2/6] moved clone review session from user handlers to server handlers --- .../ftrack/{actions => events}/action_clone_review_session.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename pype/modules/ftrack/{actions => events}/action_clone_review_session.py (100%) diff --git a/pype/modules/ftrack/actions/action_clone_review_session.py b/pype/modules/ftrack/events/action_clone_review_session.py similarity index 100% rename from pype/modules/ftrack/actions/action_clone_review_session.py rename to pype/modules/ftrack/events/action_clone_review_session.py From 84db74bdbe0e5a9d07923f4c5e0f2e10e0b46aaf Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 22 Jan 2021 09:53:26 +0100 Subject: [PATCH 3/6] registration without presets --- .../ftrack/events/action_clone_review_session.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/pype/modules/ftrack/events/action_clone_review_session.py b/pype/modules/ftrack/events/action_clone_review_session.py index 863a929f59..f04f943ad1 100644 --- a/pype/modules/ftrack/events/action_clone_review_session.py +++ b/pype/modules/ftrack/events/action_clone_review_session.py @@ -119,15 +119,7 @@ class CloneReviewSession(BaseAction): } -def register(session, plugins_presets=None): +def register(session): '''Register action. Called when used as an event plugin.''' - CloneReviewSession(session, plugins_presets).register() - - -if __name__ == "__main__": - import ftrack_api - session = ftrack_api.Session() - id = "8394ad42-4f61-11eb-9060-aecad24e2bb7" - entity = session.get("ReviewSession", id) - clone_review_session(session, entity) + CloneReviewSession(session).register() From ebb28b4b4ca075e8976bc6a448b94988921f6bc8 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 22 Jan 2021 09:54:27 +0100 Subject: [PATCH 4/6] user ServerAction instead of BaseAction --- pype/modules/ftrack/events/action_clone_review_session.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pype/modules/ftrack/events/action_clone_review_session.py b/pype/modules/ftrack/events/action_clone_review_session.py index f04f943ad1..49abd2a808 100644 --- a/pype/modules/ftrack/events/action_clone_review_session.py +++ b/pype/modules/ftrack/events/action_clone_review_session.py @@ -1,6 +1,6 @@ import json -from pype.modules.ftrack.lib import BaseAction +from pype.modules.ftrack.lib import ServerAction def clone_review_session(session, entity): @@ -40,7 +40,7 @@ def clone_review_session(session, entity): session.commit() -class CloneReviewSession(BaseAction): +class CloneReviewSession(ServerAction): '''Generate Client Review action `label` a descriptive string identifing your action. `varaint` To group actions together, give them the same From 4a753b47e9f521305aa502efd83e2ee577c48b3a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 22 Jan 2021 09:55:09 +0100 Subject: [PATCH 5/6] discovery checks user roles --- .../ftrack/events/action_clone_review_session.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/pype/modules/ftrack/events/action_clone_review_session.py b/pype/modules/ftrack/events/action_clone_review_session.py index 49abd2a808..9af04b45c1 100644 --- a/pype/modules/ftrack/events/action_clone_review_session.py +++ b/pype/modules/ftrack/events/action_clone_review_session.py @@ -52,6 +52,7 @@ class CloneReviewSession(ServerAction): variant = None identifier = "clone-review-session" description = None + settings_key = "clone_review_session" def discover(self, session, entities, event): '''Return true if we can handle the selected entities. @@ -64,11 +65,13 @@ class CloneReviewSession(ServerAction): or Asset Build. *event* the unmodified original event ''' - if len(entities) == 1: - if entities[0].entity_type == "ReviewSession": - return True - - return False + is_valid = ( + len(entities) == 1 + and entities[0].entity_type == "ReviewSession" + ) + if is_valid: + is_valid = self.valid_roles(session, entities, event) + return is_valid def launch(self, session, entities, event): '''Callback method for the custom action. From 8eea709c94b7aa237d6a7b5a29601d0d7a1c53b8 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 22 Jan 2021 09:59:56 +0100 Subject: [PATCH 6/6] added clone_review_session action to settings for default roles --- .../defaults/project_settings/ftrack.json | 8 ++++++++ .../schema_project_ftrack.json | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/pype/settings/defaults/project_settings/ftrack.json b/pype/settings/defaults/project_settings/ftrack.json index debc92f2b5..17607b6bc1 100644 --- a/pype/settings/defaults/project_settings/ftrack.json +++ b/pype/settings/defaults/project_settings/ftrack.json @@ -26,6 +26,14 @@ "Project Manager" ] }, + "clone_review_session": { + "enabled": true, + "role_list": [ + "Pypeclub", + "Administrator", + "Project Manager" + ] + }, "thumbnail_updates": { "enabled": true, "levels": 1 diff --git a/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_ftrack.json b/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_ftrack.json index cbff26e135..508b8e870d 100644 --- a/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_ftrack.json +++ b/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_ftrack.json @@ -104,6 +104,25 @@ } ] }, + { + "type": "dict", + "key": "clone_review_session", + "label": "Clone Review Session", + "checkbox_key": "enabled", + "children": [ + { + "type": "boolean", + "key": "enabled", + "label": "Enabled" + }, + { + "type": "list", + "key": "role_list", + "label": "Roles for action", + "object_type": "text" + } + ] + }, { "type": "dict", "key": "thumbnail_updates",