Example #1
0
def post_event_to_webhook_ee(self: Task, event: Dict[str, Any], team_id: int,
                             site_url: str) -> None:
    team = Team.objects.get(pk=team_id)
    elements_list = chain_to_elements(event.get("elements_chain", ""))
    _event = Event.objects.create(event=event["event"],
                                  distinct_id=event["distinct_id"],
                                  properties=event["properties"],
                                  team=team,
                                  site_url=site_url,
                                  **({
                                      "timestamp": event["timestamp"]
                                  } if event["timestamp"] else {}),
                                  **({
                                      "elements": elements_list
                                  }))

    actions = cast(
        Sequence[Action],
        Action.objects.filter(team_id=team_id, post_to_slack=True).all())

    if not site_url:
        site_url = settings.SITE_URL

    for action in actions:
        qs = Event.objects.filter(pk=_event.pk).query_db_by_action(action)
        if not qs:
            continue
        # REST hooks
        action.on_perform(_event)
        # webhooks
        if not team.slack_incoming_webhook:
            continue
        message_text, message_markdown = get_formatted_message(
            action,
            _event,
            site_url,
        )
        if determine_webhook_type(team) == "slack":
            message = {
                "text":
                message_text,
                "blocks": [
                    {
                        "type": "section",
                        "text": {
                            "type": "mrkdwn",
                            "text": message_markdown
                        },
                    },
                ],
            }
        else:
            message = {
                "text": message_markdown,
            }
        requests.post(team.slack_incoming_webhook, verify=False, json=message)

    _event.delete()
Example #2
0
def post_event_to_webhook_ee(self: Task, event: Dict[str, Any], team_id: int, site_url: str) -> None:
    if not site_url:
        site_url = settings.SITE_URL

    timer = statsd.Timer("%s_posthog_cloud" % (settings.STATSD_PREFIX,))
    timer.start()

    team = Team.objects.select_related("organization").get(pk=team_id)

    elements_list = chain_to_elements(event.get("elements_chain", ""))
    ephemeral_postgres_event = Event.objects.create(
        event=event["event"],
        distinct_id=event["distinct_id"],
        properties=event["properties"],
        team=team,
        site_url=site_url,
        **({"timestamp": event["timestamp"]} if event["timestamp"] else {}),
        **({"elements": elements_list})
    )

    try:
        is_zapier_available = team.organization.is_feature_available("zapier")

        actionFilters = {"team_id": team_id}
        if not is_zapier_available:
            if not team.slack_incoming_webhook:
                return  # Exit this task if neither Zapier nor webhook URL are available
            else:
                actionFilters["post_to_slack"] = True  # We only need to fire for actions that are posted to webhook URL

        for action in cast(Sequence[Action], Action.objects.filter(**actionFilters).all()):
            qs = Event.objects.filter(pk=ephemeral_postgres_event.pk).query_db_by_action(action)
            if not qs:
                continue
            # REST hooks
            if is_zapier_available:
                action.on_perform(ephemeral_postgres_event)
            # webhooks
            if team.slack_incoming_webhook and action.post_to_slack:
                message_text, message_markdown = get_formatted_message(action, ephemeral_postgres_event, site_url)
                if determine_webhook_type(team) == "slack":
                    message = {
                        "text": message_text,
                        "blocks": [{"type": "section", "text": {"type": "mrkdwn", "text": message_markdown}}],
                    }
                else:
                    message = {
                        "text": message_markdown,
                    }
                statsd.Counter("%s_posthog_cloud_hooks_web_fired" % (settings.STATSD_PREFIX)).increment()
                requests.post(team.slack_incoming_webhook, verify=False, json=message)
    except:
        raise
    finally:
        timer.stop("hooks_processed_for_event")
        ephemeral_postgres_event.delete()
 def test_get_formatted_message_default(self) -> None:
     """
     If slack_message_format is empty, use the default message format.
     [action] was triggered by [user]
     """
     self.team.slack_incoming_webhook = "https://hooks.slack.com/services/"
     event1 = Event.objects.create(team=self.team, distinct_id="2", properties={"$browser": "Chrome"})
     action1 = Action.objects.create(team=self.team, name="action1", id=1, slack_message_format="")
     text, markdown = get_formatted_message(action1, event1, "https://localhost:8000")
     self.assertEqual(text, "action1 was triggered by 2")
 def test_get_formatted_message_incorrect(self) -> None:
     self.team.slack_incoming_webhook = "https://hooks.slack.com/services/"
     event1 = Event.objects.create(team=self.team, distinct_id="2", properties={"$browser": "Chrome"})
     action1 = Action.objects.create(
         team=self.team,
         name="action1",
         id=1,
         slack_message_format="[user.name] did thing from browser [user.bbbrowzer]",
     )
     text, markdown = get_formatted_message(action1, event1, "https://localhost:8000")
     self.assertIn("undefined", text)
    def test_get_formatted_message(self) -> None:
        self.team.slack_incoming_webhook = "https://hooks.slack.com/services/"
        event1 = Event.objects.create(
            team=self.team, distinct_id="2", properties={"$browser": "Chrome", "page_title": "Pricing"}
        )
        action1 = Action.objects.create(
            team=self.team,
            name="action1",
            id=1,
            slack_message_format="[user.name] from [user.browser] on [event.properties.page_title] page with [event.properties.fruit]",
        )

        text, markdown = get_formatted_message(action1, event1, "https://localhost:8000")
        self.assertEqual(text, "2 from Chrome on Pricing page with undefined")
Example #6
0
def post_event_to_webhook_ee(self: Task, event: Dict[str, Any], team_id: int, site_url: str) -> None:
    try:
        team = Team.objects.get(pk=team_id)
        _event = Event.objects.create(
            event=event["event"],
            distinct_id=event["distinct_id"],
            properties=event["properties"],
            team=team,
            site_url=site_url,
            **({"timestamp": event["timestamp"]} if event["timestamp"] else {}),
            **({"elements": event["elements_list"]} if event["elements_list"] else {})
        )

        actions = Action.objects.filter(team_id=team_id, post_to_slack=True).all()

        if not site_url:
            site_url = settings.SITE_URL

        if team.slack_incoming_webhook:
            for action in actions:
                qs = Event.objects.filter(pk=_event.pk).query_db_by_action(action)
                if qs:
                    message_text, message_markdown = get_formatted_message(action, _event, site_url,)
                    if determine_webhook_type(team) == "slack":
                        message = {
                            "text": message_text,
                            "blocks": [{"type": "section", "text": {"type": "mrkdwn", "text": message_markdown},},],
                        }
                    else:
                        message = {
                            "text": message_markdown,
                        }
                    requests.post(team.slack_incoming_webhook, verify=False, json=message)

        _event.delete()

    except:
        self.retry(countdown=2 ** self.request.retries)