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()
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")
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)