def task_assignment_alert(sg, logger, event, args): """ A callback that sends a slack alert to the a user if they are assigned a new task on a project :param sg: Shotgun API handle. :param logger: Logger instance. :param event: A Shotgun EventLogEntry entity dictionary. :param args: Any additional misc arguments passed through this plugin. """ # gather some info event_project = event.get("project") task_assignees = event.get("meta", {}).get("added") event_user = event.get("user") # Bail if we don't have the info we need. if not event_project or not task_assignees: return # Get the Coordinator group coords_group = sg.find_one("Group", [["code", "is", "Coordinators"]], ["users"])["users"] # If the event user is in the Coordinators Group, then bail. We don't # want to see all the versions from ingest assignments if event_user in coords_group: # if any(d.get("id", None) == event_user["id"] for d in coords_group): return # query some project data proj_data = sg.find_one("Project", [["id", "is", event["project"]["id"]]], ["code"]) task_data = sg.find_one("Task", [["id", "is", event["entity"]["id"]]], ["content", "entity"]) task_link = task_data.get("entity") users = [] for task_assignee in task_assignees: if task_assignee["type"] == "HumanUser": users.append(task_assignee) for user in users: slack_id = slack_shotgun_bot.get_slack_user_id(sg, user["id"]) if slack_id: data = { "project": "<{}/page/project_overview?project_id={}|{}>".format( __SG_SITE, proj_data.get("id"), proj_data.get("code")), "task": "<{}/detail/Task/{}|{}>".format(__SG_SITE, task_data.get("id"), task_data.get("content")), } message = "You've been assigned {project} / {task}".format(**data) if task_link: data["task_link"] = "<{}/detail/{}/{}|{}>".format( __SG_SITE, task_link.get("type"), task_link.get("id"), task_link.get("name"), ) message = "You've been assigned {project} / {task_link} / {task}".format( **data) slack_message = slack_shotgun_bot.send_message(slack_id, message) if slack_message["ok"]: logger.info("New assignment alert sent to {}.".format( user["name"])) elif slack_message["error"]: logger.warning( "New assignment alert to {} failed to send with error: {}". format(user["name"], slack_message["error"]))
def user_to_channel(sg, logger, event, args): # {'attribute_name': None, # 'event_type': 'Shotgun_Project_New', # 'created_at': datetime.datetime(2018, 5, 3, 18, 2, 58, tzinfo=<shotgun_api3.lib.sgtimezone.LocalTimezone object at 0x1071f4850>), # 'entity': {'type': 'Project', 'id': 133, 'name': 'slackProject'}, # 'project': None, # 'meta': {'entity_id': 133, 'type': 'new_entity', 'entity_type': 'Project'}, # 'user': {'type': 'HumanUser', 'id': 88, 'name': 'Anthony Kramer'}, # 'session_uuid': 'c521519e-4f36-11e8-bc45-0242ac110004', # 'type': 'EventLogEntry', # 'id': 568623} # gather some info project_id = event.get("meta", {}).get("entity_id") users_added = event.get("meta", {}).get("added") users_removed = event.get("meta", {}).get("removed") logger.debug("Got project ID {} from the event".format(project_id)) # if for some reason the project id doesnt exist, then bail if not project_id: return proj_data = sg.find_one("Project", [["id", "is", project_id]], ["sg_slack_channel_id"]) if not proj_data: logger.info("Project data returned None. Skipping.") return if not proj_data.get("sg_slack_channel_id"): logger.info("Project {} does not have a slack channel entry.") return slack_channel = proj_data["sg_slack_channel_id"] for user in users_added: if user["type"] == "HumanUser": slack_id = slack_shotgun_bot.get_slack_user_id(sg, user["id"]) invite = slack_shotgun_bot.invite_to_channel( slack_id, slack_channel) if invite["ok"]: logger.info("User {} added to slack channel {}.".format( user["name"], slack_channel)) elif invite.get("error"): logger.info( "Failed to add user {}({}) to slack channel {} wth error: {}" .format(user["name"], slack_id, slack_channel, invite["error"])) for user in users_removed: if user["type"] == "HumanUser": slack_id = slack_shotgun_bot.get_slack_user_id(sg, user["id"]) kick = slack_shotgun_bot.kick_from_channel(slack_id, slack_channel) if kick["ok"]: logger.info("User {} removed from slack channel {}.".format( user["name"], slack_channel)) elif kick.get("error"): logger.info( "Failed to remove user {} from slack channel {} wth error: {}" .format(user["name"], slack_channel, kick["error"]))
def ticket_reply_alert(sg, logger, event, args): """ A callback that sends a slack alert to the a user if they are assigned a new task on a project :param sg: Shotgun API handle. :param logger: Logger instance. :param event: A Shotgun EventLogEntry entity dictionary. :param args: Any additional misc arguments passed through this plugin. """ # gather some info event_project = event.get("project") reply_added = event.get("meta", {}).get("added") # Bail if we don't have the info we need. if not event_project or not reply_added: return # query some project data proj_data = sg.find_one( "Project", [["id", "is", event["project"]["id"]]], ["code", "name"] ) ticket_data = sg.find_one( "Ticket", [["id", "is", event["entity"]["id"]]], [ "title", "sg_ticket_type", "sg_priority", "description", "created_by", "sg_status_list", "sg_ticket_type", "addressings_cc", "addressings_to", ], ) ticket_status = sg.find_one( "Status", [["code", "is", ticket_data.get("sg_status_list")]], ["name"] )["name"] if ticket_data.get("sg_priority").startswith("1"): priority_color = "danger" elif ticket_data.get("sg_priority").startswith("2"): priority_color = "warning" else: priority_color = "good" attachments = [ { # "pretext": "Ticket alert:", "color": priority_color, "title": "New reply on Ticket #{}: {}".format( ticket_data.get("id"), parseHtml(ticket_data.get("title")) ), "title_link": "{}/detail/Ticket/{}".format( __SG_SITE, ticket_data.get("id") ), "text": parseHtml(event.get("meta", {}).get("added")[0].get("name")), "author_name": ":writing_hand: {}".format(event.get("user")["name"]), "author_link": "{}/detail/HumanUser/{}".format( __SG_SITE, event.get("user")["id"] ), "fields": [ {"title": "Project", "value": proj_data.get("name"), "short": True}, {"title": "Status", "value": ticket_status, "short": True}, ], } ] sg_users = ( ticket_data.get("addressings_to") + ticket_data.get("addressings_cc") + [ticket_data.get("created_by")] ) sg_users = [i for n, i in enumerate(sg_users) if i not in sg_users[n + 1 :]] users = [] for sg_user in sg_users: if sg_user == event.get("user"): pass elif sg_user["type"] == "HumanUser": users.append(sg_user) elif sg_user["type"] == "Group": group_users = sg.find_one("Group", [["id", "is", sg_user["id"]]], ["users"]) for group_user in group_users["users"]: if group_user == event.get("user"): pass else: users.append(group_user) for user in users: slack_id = slack_shotgun_bot.get_slack_user_id(sg, user["id"]) if slack_id: slack_message = slack_shotgun_bot.send_message( slack_id, None, attachments=attachments ) if slack_message["ok"]: logger.info("Ticket reply alert sent to {}.".format(user["name"])) elif slack_message["error"]: logger.warning( "Ticket reply alert to {} failed to send with error: {}".format( user["name"], slack_message["error"] ) )
def new_version_alert(sg, logger, event, args): """ A callback that sends a slack alert to the project managers if a new version is created by a user. :param sg: Shotgun API handle. :param logger: Logger instance. :param event: A Shotgun EventLogEntry entity dictionary. :param args: Any additional misc arguments passed through this plugin. """ # Make some vars for convenience. event_project = event.get("project") event_user = event.get("user") # Get the Coordinator group coords_group = sg.find_one("Group", [["code", "is", "Coordinators"]], ["users"])["users"] # If the event user is in the Coordinators Group, then bail. We don't # want to see all the versions from ingest if event_user in coords_group: # if any(d.get("id", None) == event_user["id"] for d in coords_group): return # Bail if we don't have the info we need. if not event_project: logger.warning("Version %s created without project, skipping: %s" % ( event["entity"]["name"], event["entity"]["id"], )) return # query some project data proj_data = sg.find_one( "Project", [["id", "is", event_project["id"]]], [ "id", "code", "sg_vfx_supervisor", "sg_cg_supervisors", "sg_producer", "sg_coordinator", ], ) # get the project managers managers = [] if proj_data.get("sg_vfx_supervisor"): for vfx_supe in proj_data.get("sg_vfx_supervisor"): managers.append(vfx_supe) if proj_data.get("sg_cg_supervisor"): for cg_supe in proj_data.get("sg_cg_supervisor"): managers.append(cg_supe) if proj_data.get("sg_producer"): for producer in proj_data.get("sg_producer"): managers.append(producer) # if proj_data.get("sg_coordinator"): # for coord in proj_data.get("sg_coordinator"): # managers.append(coord) # if theres no one to notify, then bail if not managers: return # if there's no event entity, then bail if not event["entity"]: return attachments = [{ "color": "#439FE0", "title": "New Version submitted: {} / {}".format(proj_data.get("code"), event["entity"]["name"]), "title_link": "{}/detail/Version/{}".format(__SG_SITE, event["entity"]["id"]), "author_name": ":writing_hand: {}".format(event.get("user")["name"]), "author_link": "{}/detail/HumanUser/{}".format(__SG_SITE, event.get("user")["id"]), }] for manager in managers: slack_id = slack_shotgun_bot.get_slack_user_id(sg, manager["id"]) if slack_id: slack_message = slack_shotgun_bot.send_message( slack_id, None, attachments=attachments) if slack_message["ok"]: logger.info("New verison alert sent to {}.".format( manager["name"])) elif slack_message["error"]: logger.warning( "New version alert to {} failed to send with error: {}". format(manager["name"], slack_message["error"]))