Ejemplo n.º 1
0
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"]))
Ejemplo n.º 2
0
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"]
                    )
                )
Ejemplo n.º 4
0
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"]))