From f0e6bb7a82a98e040f47087bdb00fc7ffed47cbc Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 7 Jul 2021 17:42:30 +0200 Subject: [PATCH 01/10] created copy of multiple notes action --- .../action_multiple_notes.py | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py diff --git a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py new file mode 100644 index 00000000000..8db65fe39ba --- /dev/null +++ b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py @@ -0,0 +1,110 @@ +from openpype.modules.ftrack.lib import BaseAction, statics_icon + + +class MultipleNotes(BaseAction): + '''Edit meta data action.''' + + #: Action identifier. + identifier = 'multiple.notes' + #: Action label. + label = 'Multiple Notes' + #: Action description. + description = 'Add same note to multiple Asset Versions' + icon = statics_icon("ftrack", "action_icons", "MultipleNotes.svg") + + def discover(self, session, entities, event): + ''' Validation ''' + valid = True + for entity in entities: + if entity.entity_type.lower() != 'assetversion': + valid = False + break + return valid + + def interface(self, session, entities, event): + if not event['data'].get('values', {}): + note_label = { + 'type': 'label', + 'value': '# Enter note: #' + } + + note_value = { + 'name': 'note', + 'type': 'textarea' + } + + category_label = { + 'type': 'label', + 'value': '## Category: ##' + } + + category_data = [] + category_data.append({ + 'label': '- None -', + 'value': 'none' + }) + all_categories = session.query('NoteCategory').all() + for cat in all_categories: + category_data.append({ + 'label': cat['name'], + 'value': cat['id'] + }) + category_value = { + 'type': 'enumerator', + 'name': 'category', + 'data': category_data, + 'value': 'none' + } + + splitter = { + 'type': 'label', + 'value': '{}'.format(200*"-") + } + + items = [] + items.append(note_label) + items.append(note_value) + items.append(splitter) + items.append(category_label) + items.append(category_value) + return items + + def launch(self, session, entities, event): + if 'values' not in event['data']: + return + + values = event['data']['values'] + if len(values) <= 0 or 'note' not in values: + return False + # Get Note text + note_value = values['note'] + if note_value.lower().strip() == '': + return False + # Get User + user = session.query( + 'User where username is "{}"'.format(session.api_user) + ).one() + # Base note data + note_data = { + 'content': note_value, + 'author': user + } + # Get category + category_value = values['category'] + if category_value != 'none': + category = session.query( + 'NoteCategory where id is "{}"'.format(category_value) + ).one() + note_data['category'] = category + # Create notes for entities + for entity in entities: + new_note = session.create('Note', note_data) + entity['notes'].append(new_note) + session.commit() + return True + + +def register(session): + '''Register plugin. Called when used as an plugin.''' + + MultipleNotes(session).register() From 4a2efb1cd2ae9b617ceaf8ddd45eb1b304e7de2f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 7 Jul 2021 17:53:06 +0200 Subject: [PATCH 02/10] Converted to server action --- .../action_multiple_notes.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py index 8db65fe39ba..021a61e0ced 100644 --- a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py +++ b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py @@ -1,16 +1,12 @@ -from openpype.modules.ftrack.lib import BaseAction, statics_icon +from openpype.modules.ftrack.lib import ServerAction -class MultipleNotes(BaseAction): - '''Edit meta data action.''' +class MultipleNotesServer(ServerAction): + """Action adds same note for muliple AssetVersions.""" - #: Action identifier. - identifier = 'multiple.notes' - #: Action label. - label = 'Multiple Notes' - #: Action description. - description = 'Add same note to multiple Asset Versions' - icon = statics_icon("ftrack", "action_icons", "MultipleNotes.svg") + identifier = "multiple.notes.server" + label = "Multiple Notes (Server)" + description = "Add same note to multiple Asset Versions" def discover(self, session, entities, event): ''' Validation ''' @@ -107,4 +103,4 @@ def launch(self, session, entities, event): def register(session): '''Register plugin. Called when used as an plugin.''' - MultipleNotes(session).register() + MultipleNotesServer(session).register() From c1994950adb7cc28704f409c3486b5a875d36311 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 7 Jul 2021 17:54:07 +0200 Subject: [PATCH 03/10] use user from event instead of session event --- .../action_multiple_notes.py | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py index 021a61e0ced..c41b9000312 100644 --- a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py +++ b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py @@ -18,6 +18,15 @@ def discover(self, session, entities, event): return valid def interface(self, session, entities, event): + event_source = event["source"] + user_info = event_source.get("user") or {} + user_id = user_info.get("id") + if not user_id: + return { + "success": False, + "message": "Couldn't get user information." + } + if not event['data'].get('values', {}): note_label = { 'type': 'label', @@ -77,9 +86,21 @@ def launch(self, session, entities, event): if note_value.lower().strip() == '': return False # Get User - user = session.query( - 'User where username is "{}"'.format(session.api_user) - ).one() + event_source = event["source"] + user_info = event_source.get("user") or {} + user_id = user_info.get("id") + user = None + if user_id: + user = session.query( + 'User where id is "{}"'.format(user_id) + ).first() + + if not user: + return { + "success": False, + "message": "Couldn't get user information." + } + # Base note data note_data = { 'content': note_value, From 2710bce4bd1d69ef20c8867db8db13f3dfb2f0be Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 7 Jul 2021 17:57:46 +0200 Subject: [PATCH 04/10] use constant for none category --- .../ftrack/event_handlers_server/action_multiple_notes.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py index c41b9000312..64b51613666 100644 --- a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py +++ b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py @@ -8,6 +8,8 @@ class MultipleNotesServer(ServerAction): label = "Multiple Notes (Server)" description = "Add same note to multiple Asset Versions" + _none_category = "__NONE__" + def discover(self, session, entities, event): ''' Validation ''' valid = True @@ -46,7 +48,7 @@ def interface(self, session, entities, event): category_data = [] category_data.append({ 'label': '- None -', - 'value': 'none' + "value": self._none_category }) all_categories = session.query('NoteCategory').all() for cat in all_categories: @@ -58,7 +60,7 @@ def interface(self, session, entities, event): 'type': 'enumerator', 'name': 'category', 'data': category_data, - 'value': 'none' + "value": self._none_category } splitter = { @@ -108,7 +110,7 @@ def launch(self, session, entities, event): } # Get category category_value = values['category'] - if category_value != 'none': + if category_value != self._none_category: category = session.query( 'NoteCategory where id is "{}"'.format(category_value) ).one() From 61588d9ddd317213dd0795c69b8fd8f22ee898ea Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 7 Jul 2021 17:58:56 +0200 Subject: [PATCH 05/10] formatting changes --- .../action_multiple_notes.py | 70 ++++++++++--------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py index 64b51613666..d08e66ff56c 100644 --- a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py +++ b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py @@ -14,7 +14,7 @@ def discover(self, session, entities, event): ''' Validation ''' valid = True for entity in entities: - if entity.entity_type.lower() != 'assetversion': + if entity.entity_type.lower() != "assetversion": valid = False break return valid @@ -31,62 +31,64 @@ def interface(self, session, entities, event): if not event['data'].get('values', {}): note_label = { - 'type': 'label', - 'value': '# Enter note: #' + "type": "label", + "value": "# Enter note: #" } note_value = { - 'name': 'note', - 'type': 'textarea' + "name": "note", + "type": "textarea" } category_label = { - 'type': 'label', - 'value': '## Category: ##' + "type": "label", + "value": "## Category: ##" } category_data = [] category_data.append({ - 'label': '- None -', + "label": "- None -", "value": self._none_category }) all_categories = session.query('NoteCategory').all() for cat in all_categories: category_data.append({ - 'label': cat['name'], - 'value': cat['id'] + "label": cat["name"], + "value": cat["id"] }) category_value = { - 'type': 'enumerator', - 'name': 'category', - 'data': category_data, + "type": "enumerator", + "name": "category", + "data": category_data, "value": self._none_category } splitter = { - 'type': 'label', - 'value': '{}'.format(200*"-") + "type": "label", + "value": "---" } - items = [] - items.append(note_label) - items.append(note_value) - items.append(splitter) - items.append(category_label) - items.append(category_value) - return items + return [ + note_label, + note_value, + splitter, + category_label, + category_value + ] def launch(self, session, entities, event): - if 'values' not in event['data']: + if "values" not in event["data"]: return - values = event['data']['values'] - if len(values) <= 0 or 'note' not in values: + values = event["data"]["values"] + if len(values) <= 0 or "note" not in values: return False + # Get Note text - note_value = values['note'] - if note_value.lower().strip() == '': + note_value = values["note"] + if note_value.lower().strip() == "": return False + # Get User event_source = event["source"] user_info = event_source.get("user") or {} @@ -105,20 +107,20 @@ def launch(self, session, entities, event): # Base note data note_data = { - 'content': note_value, - 'author': user + "content": note_value, + "author": user } # Get category - category_value = values['category'] + category_value = values["category"] if category_value != self._none_category: category = session.query( - 'NoteCategory where id is "{}"'.format(category_value) + "NoteCategory where id is \"{}\"".format(category_value) ).one() - note_data['category'] = category + note_data["category"] = category # Create notes for entities for entity in entities: - new_note = session.create('Note', note_data) - entity['notes'].append(new_note) + new_note = session.create("Note", note_data) + entity["notes"].append(new_note) session.commit() return True From 52556fc9cea02ce331ba59ef556ccf6bb2f7dbaf Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 7 Jul 2021 17:59:28 +0200 Subject: [PATCH 06/10] reversed logic of interface --- .../action_multiple_notes.py | 83 ++++++++++--------- 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py index d08e66ff56c..7b8e8831742 100644 --- a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py +++ b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py @@ -29,52 +29,57 @@ def interface(self, session, entities, event): "message": "Couldn't get user information." } - if not event['data'].get('values', {}): - note_label = { - "type": "label", - "value": "# Enter note: #" - } + values = event["data"].get("values") + if values: + return None - note_value = { - "name": "note", - "type": "textarea" - } + note_label = { + "type": "label", + "value": "# Enter note: #" + } - category_label = { - "type": "label", - "value": "## Category: ##" - } + note_value = { + "name": "note", + "type": "textarea" + } - category_data = [] + category_label = { + "type": "label", + "value": "## Category: ##" + } + + category_data = [] + category_data.append({ + "label": "- None -", + "value": self._none_category + }) + all_categories = session.query( + "select id, name from NoteCategory" + ).all() + for cat in all_categories: category_data.append({ - "label": "- None -", - "value": self._none_category + "label": cat["name"], + "value": cat["id"] }) - all_categories = session.query('NoteCategory').all() - for cat in all_categories: - category_data.append({ - "label": cat["name"], - "value": cat["id"] - }) - category_value = { - "type": "enumerator", - "name": "category", - "data": category_data, - "value": self._none_category - } + category_value = { + "type": "enumerator", + "name": "category", + "data": category_data, + "value": self._none_category + } - splitter = { - "type": "label", - "value": "---" - } + splitter = { + "type": "label", + "value": "---" + } - return [ - note_label, - note_value, - splitter, - category_label, - category_value - ] + return [ + note_label, + note_value, + splitter, + category_label, + category_value + ] def launch(self, session, entities, event): if "values" not in event["data"]: From 17a97044b9bef033aefc392f7a3aa8011de0be6f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 7 Jul 2021 18:23:21 +0200 Subject: [PATCH 07/10] addedd few modifications to discovery --- .../event_handlers_server/action_multiple_notes.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py index 7b8e8831742..7ed01299518 100644 --- a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py +++ b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py @@ -11,13 +11,14 @@ class MultipleNotesServer(ServerAction): _none_category = "__NONE__" def discover(self, session, entities, event): - ''' Validation ''' - valid = True + """Show action only on AssetVersions.""" + if not entities: + return False + for entity in entities: if entity.entity_type.lower() != "assetversion": - valid = False - break - return valid + return False + return True def interface(self, session, entities, event): event_source = event["source"] From baf02590c24c27961ce60657f4901d894c538a06 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 7 Jul 2021 18:23:50 +0200 Subject: [PATCH 08/10] fixed few return values --- .../event_handlers_server/action_multiple_notes.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py index 7ed01299518..1c3c9929d99 100644 --- a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py +++ b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py @@ -25,10 +25,7 @@ def interface(self, session, entities, event): user_info = event_source.get("user") or {} user_id = user_info.get("id") if not user_id: - return { - "success": False, - "message": "Couldn't get user information." - } + return None values = event["data"].get("values") if values: @@ -84,7 +81,7 @@ def interface(self, session, entities, event): def launch(self, session, entities, event): if "values" not in event["data"]: - return + return None values = event["data"]["values"] if len(values) <= 0 or "note" not in values: @@ -93,7 +90,10 @@ def launch(self, session, entities, event): # Get Note text note_value = values["note"] if note_value.lower().strip() == "": - return False + return { + "success": True, + "message": "Note was not entered. Skipping" + } # Get User event_source = event["source"] From cd3cd88dfacef90a8b0258291ad907d5f7f7ed90 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 7 Jul 2021 18:25:07 +0200 Subject: [PATCH 09/10] added debug log --- .../action_multiple_notes.py | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py index 1c3c9929d99..340dd659afe 100644 --- a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py +++ b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py @@ -111,18 +111,44 @@ def launch(self, session, entities, event): "message": "Couldn't get user information." } + # Logging message preparation + # - username + username = user.get("username") or "N/A" + + # - AssetVersion ids + asset_version_ids_str = ",".join([entity["id"] for entity in entities]) + # Base note data note_data = { "content": note_value, "author": user } + # Get category - category_value = values["category"] - if category_value != self._none_category: + category_id = values["category"] + if category_id == self._none_category: + category_id = None + + category_name = None + if category_id is not None: category = session.query( - "NoteCategory where id is \"{}\"".format(category_value) - ).one() - note_data["category"] = category + "select id, name from NoteCategory where id is \"{}\"".format( + category_id + ) + ).first() + if category: + note_data["category"] = category + category_name = category["name"] + + category_msg = "" + if category_name: + category_msg = " with category: \"{}\"".format(category_name) + + self.log.warning(( + "Creating note{} as User \"{}\" on " + "AssetVersions: {} with value \"{}\"" + ).format(category_msg, username, asset_version_ids_str, note_value)) + # Create notes for entities for entity in entities: new_note = session.create("Note", note_data) From 2be9dd55ee5a52bc0efb7ec46a87d721bd0d9ee0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 7 Jul 2021 18:25:14 +0200 Subject: [PATCH 10/10] enhanced docstring --- .../ftrack/event_handlers_server/action_multiple_notes.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py index 340dd659afe..9ad7b1a9692 100644 --- a/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py +++ b/openpype/modules/ftrack/event_handlers_server/action_multiple_notes.py @@ -2,7 +2,11 @@ class MultipleNotesServer(ServerAction): - """Action adds same note for muliple AssetVersions.""" + """Action adds same note for muliple AssetVersions. + + Note is added to selection of AssetVersions. Note is created with user + who triggered the action. It is possible to define note category of note. + """ identifier = "multiple.notes.server" label = "Multiple Notes (Server)"