Beispiel #1
0
 def setUpTestData(cls):
     random.seed(900)
     super().setUpTestData()
     cls.demo_team = create_demo_team(cls.organization)
     calculate_event_property_usage_for_team(cls.demo_team.pk)
     cls.user.current_team = cls.demo_team
     cls.user.save()
 def setUpTestData(cls):
     random.seed(900)
     super().setUpTestData()
     cls.demo_team = create_demo_team(cls.organization)
     calculate_event_property_usage_for_team(cls.demo_team.pk)
     cls.user.current_team = cls.demo_team
     cls.user.save()
     EventProperty.objects.create(team=cls.demo_team, event="$pageview", property="$browser")
     EventProperty.objects.create(team=cls.demo_team, event="$pageview", property="first_visit")
def fix_team_event_names(apps, schema_editor):
    Team = apps.get_model("posthog", "Team")
    for team in Team.objects.all():
        old_event_names = team.event_names
        team.event_names = list(event for event in old_event_names
                                if isinstance(event, str))
        if len(team.event_names) != len(old_event_names):
            from posthog.tasks.calculate_event_property_usage import calculate_event_property_usage_for_team

            team.save()
            calculate_event_property_usage_for_team(team.pk)
Beispiel #4
0
    def test_updating_team_events_or_related_updates_event_definitions(self):
        random.seed(900)
        org = Organization.objects.create(name="Demo Org")
        team = create_demo_team(org, None, None)

        expected_events = ["watched_movie", "installed_app", "rated_app", "purchase", "entered_free_trial"]

        self.assertEqual(EventDefinition.objects.filter(team=team).count(), len(expected_events))

        for obj in EventDefinition.objects.filter(team=team):
            self.assertIn(obj.name, expected_events)
            self.assertEqual(obj.volume_30_day, None)
            self.assertEqual(obj.query_usage_30_day, None)

        # Test adding and removing one event
        team.event_names.pop(0)
        team.event_names.append("uninstalled_app")
        team.save()
        expected_events = ["installed_app", "rated_app", "purchase", "entered_free_trial", "uninstalled_app"]
        self.assertEqual(
            list(EventDefinition.objects.filter(team=team).values_list("name", flat=True)).sort(),
            expected_events.sort(),
        )

        # Test events with usage
        expected_event_definitions = [
            {"name": "installed_app", "volume_30_day": 100, "query_usage_30_day": 0},
            {"name": "rated_app", "volume_30_day": 73, "query_usage_30_day": 0},
            {"name": "purchase", "volume_30_day": 16, "query_usage_30_day": 0},
            {"name": "entered_free_trial", "volume_30_day": 0, "query_usage_30_day": 0},
            {"name": "uninstalled_app", "volume_30_day": 0, "query_usage_30_day": 0},
            {"name": "$pageview", "volume_30_day": 1822, "query_usage_30_day": 19292},
        ]
        calculate_event_property_usage_for_team(team.pk)
        team.refresh_from_db()
        team.event_names.append("$pageview")
        team.event_names_with_usage.append({"event": "$pageview", "volume": 1822, "usage_count": 19292})
        team.save()

        self.assertEqual(EventDefinition.objects.filter(team=team).count(), len(expected_event_definitions))
        for item in expected_event_definitions:
            instance = EventDefinition.objects.get(name=item["name"], team=team)
            self.assertEqual(instance.volume_30_day, item["volume_30_day"])
            self.assertEqual(instance.query_usage_30_day, item["query_usage_30_day"])
    def setUpTestData(cls):
        cls.organization = create_organization(name="test org")
        cls.demo_team = create_team(organization=cls.organization)
        cls.user = create_user("user", "pass", cls.organization)

        for event_definition in cls.EXPECTED_EVENT_DEFINITIONS:
            create_event_definitions(event_definition["name"],
                                     team_id=cls.demo_team.pk)
            for _ in range(event_definition["volume_30_day"]):
                capture_event(event=EventData(
                    event=event_definition["name"],
                    team_id=cls.demo_team.pk,
                    distinct_id="abc",
                    timestamp=datetime(2020, 1, 1),
                    properties={},
                ))

        # To ensure `volume_30_day` and `query_usage_30_day` are returned non
        # None, we need to call this task to have them calculated.
        calculate_event_property_usage_for_team(cls.demo_team.pk)
Beispiel #6
0
    def test_updating_event_properties_or_related_updates_property_definitions(
            self):
        random.seed(900)
        org = Organization.objects.create(name="Demo Org")
        team = create_demo_team(org, None, None)

        expected_properties = [
            "purchase",
            "$current_url",
            "is_first_movie",
            "app_rating",
            "plan",
            "first_visit",
            "purchase_value",
        ]
        numerical_properties = ["purchase", "app_rating", "purchase_value"]

        self.assertEqual(
            PropertyDefinition.objects.filter(team=team).count(),
            len(expected_properties))

        for obj in PropertyDefinition.objects.filter(team=team):
            self.assertIn(obj.name, expected_properties)
            self.assertEqual(obj.volume_30_day, None)
            self.assertEqual(obj.query_usage_30_day, None)
            self.assertEqual(obj.is_numerical, obj.name
                             in numerical_properties)

        # Test adding and removing one event
        team.event_properties.pop(-1)
        team.event_properties.append("paid_tier")
        team.save()
        expected_properties = [
            "purchase",
            "$current_url",
            "is_first_movie",
            "app_rating",
            "plan",
            "first_visit",
            "paid_tier",
        ]
        self.assertEqual(
            list(
                PropertyDefinition.objects.filter(team=team).values_list(
                    "name", flat=True)).sort(),
            expected_properties.sort(),
        )

        # Test events with usage
        expected_property_definitions = [
            {
                "name": "$current_url",
                "volume_30_day": 264,
                "query_usage_30_day": 0,
                "is_numerical": False
            },
            {
                "name": "is_first_movie",
                "volume_30_day": 87,
                "query_usage_30_day": 0,
                "is_numerical": False
            },
            {
                "name": "app_rating",
                "volume_30_day": 73,
                "query_usage_30_day": 0,
                "is_numerical": True
            },
            {
                "name": "plan",
                "volume_30_day": 14,
                "query_usage_30_day": 0,
                "is_numerical": False
            },
            {
                "name": "purchase",
                "volume_30_day": 0,
                "query_usage_30_day": 0,
                "is_numerical": True
            },
            {
                "name": "paid_tier",
                "volume_30_day": 0,
                "query_usage_30_day": 0,
                "is_numerical": False
            },
            {
                "name": "first_visit",
                "volume_30_day": 0,
                "query_usage_30_day": 0,
                "is_numerical": False
            },
            {
                "name": "$browser",
                "volume_30_day": 166,
                "query_usage_30_day": 349,
                "is_numerical": True
            },
        ]
        calculate_event_property_usage_for_team(team.pk)
        team.refresh_from_db()
        team.event_properties.append("$browser")
        team.event_properties_numerical.append("$browser")
        team.event_properties_with_usage.append({
            "key": "$browser",
            "volume": 166,
            "usage_count": 349
        })
        team.save()

        self.assertEqual(
            PropertyDefinition.objects.filter(team=team).count(),
            len(expected_property_definitions))
        for item in expected_property_definitions:
            instance = PropertyDefinition.objects.get(name=item["name"],
                                                      team=team)
            self.assertEqual(instance.volume_30_day, item["volume_30_day"])
            self.assertEqual(instance.query_usage_30_day,
                             item["query_usage_30_day"])
            self.assertEqual(instance.is_numerical, item["is_numerical"])
Beispiel #7
0
        def test_calculate_usage(self) -> None:
            self.team.event_names = ["$pageview", "custom event"]
            self.team.event_properties = ["$current_url", "team_id", "value"]
            self.team.save()
            team2 = Team.objects.create()
            with freeze_time("2020-08-01"):
                # ignore stuff older than 30 days
                DashboardItem.objects.create(
                    team=self.team,
                    filters={
                        "events": [{
                            "id": "$pageview"
                        }],
                        "properties": [{
                            "key": "$current_url",
                            "value": "https://posthog.com"
                        }],
                    },
                )
                create_event(
                    distinct_id="test",
                    team=self.team,
                    event="$pageview",
                    properties={"$current_url": "https://posthog.com"},
                )
            with freeze_time("2020-10-01"):
                DashboardItem.objects.create(
                    team=self.team,
                    filters={
                        "events": [{
                            "id": "$pageview"
                        }],
                        "properties": [{
                            "key": "$current_url",
                            "value": "https://posthog.com"
                        }],
                    },
                )
                DashboardItem.objects.create(
                    team=self.team,
                    filters={
                        "events": [{
                            "id": "$pageview"
                        }],
                        "properties": [{
                            "key": "$current_url",
                            "value": "https://posthog2.com"
                        }],
                    },
                )
                DashboardItem.objects.create(
                    team=self.team,
                    filters={
                        "events": [{
                            "id": "custom event"
                        }],
                        "properties": [{
                            "key": "team_id",
                            "value": "3"
                        }]
                    },
                )
                DashboardItem.objects.create(
                    team=self.team,
                    filters={"events": [{
                        "id": "event that doesnt exist"
                    }]})
                # broken dashboard item
                DashboardItem.objects.create(team=self.team, filters={})
                create_event(
                    distinct_id="test",
                    team=self.team,
                    event="$pageview",
                    properties={"$current_url": "https://posthog.com"},
                )
                create_event(
                    distinct_id="test",
                    team=self.team,
                    event="$pageview",
                    properties={"$current_url": "https://posthog2.com"},
                )
                create_event(distinct_id="test",
                             team=self.team,
                             event="custom event",
                             properties={"team_id": "3"})

                # team leakage
                create_event(
                    distinct_id="test",
                    team=team2,
                    event="$pageview",
                    properties={"$current_url": "https://posthog.com"},
                )
                DashboardItem.objects.create(
                    team=team2,
                    filters={
                        "events": [{
                            "id": "$pageview"
                        }],
                        "properties": [{
                            "key": "$current_url",
                            "value": "https://posthog.com"
                        }],
                    },
                )

                calculate_event_property_usage_for_team(self.team.pk)
            team = Team.objects.get(pk=self.team.pk)
            self.assertEqual(
                team.event_names_with_usage,
                [
                    {
                        "event": "$pageview",
                        "usage_count": 2,
                        "volume": 2
                    },
                    {
                        "event": "custom event",
                        "usage_count": 1,
                        "volume": 1
                    },
                ],
            )
            self.assertEqual(
                team.event_properties_with_usage,
                [
                    {
                        "key": "$current_url",
                        "usage_count": 2,
                        "volume": 2
                    },
                    {
                        "key": "team_id",
                        "usage_count": 1,
                        "volume": 1
                    },
                    {
                        "key": "value",
                        "usage_count": 0,
                        "volume": 0
                    },
                ],
            )
        def test_updating_event_properties_or_related_updates_property_definitions(
                self) -> None:
            random.seed(900)
            org = Organization.objects.create(name="Demo Org")
            team = create_demo_team(org, None, None)

            expected_properties = [
                "purchase",
                "$current_url",
                "$browser",
                "is_first_movie",
                "app_rating",
                "plan",
                "first_visit",
                "purchase_value",
            ]
            numerical_properties = ["purchase", "app_rating", "purchase_value"]

            self.assertCountEqual(
                PropertyDefinition.objects.filter(team=team).values_list(
                    "name", flat=True),
                expected_properties,
                PropertyDefinition.objects.filter(team=team).values("name"),
            )

            for obj in PropertyDefinition.objects.filter(team=team):
                self.assertIn(obj.name, expected_properties)
                self.assertEqual(obj.volume_30_day, None)
                self.assertEqual(obj.query_usage_30_day, None)
                self.assertEqual(obj.is_numerical, obj.name
                                 in numerical_properties)

            DashboardItem.objects.create(team=team,
                                         filters={
                                             "properties": [{
                                                 "key": "$browser",
                                                 "value": "Safari"
                                             }]
                                         })
            # Test events with usage
            expected_property_definitions = [
                {
                    "name": "$current_url",
                    "query_usage_30_day": 0,
                    "is_numerical": False
                },
                {
                    "name": "is_first_movie",
                    "query_usage_30_day": 0,
                    "is_numerical": False
                },
                {
                    "name": "app_rating",
                    "query_usage_30_day": 0,
                    "is_numerical": True
                },
                {
                    "name": "plan",
                    "query_usage_30_day": 0,
                    "is_numerical": False
                },
                {
                    "name": "purchase",
                    "query_usage_30_day": 0,
                    "is_numerical": True
                },
                {
                    "name": "purchase_value",
                    "query_usage_30_day": 0,
                    "is_numerical": True
                },
                {
                    "name": "first_visit",
                    "query_usage_30_day": 0,
                    "is_numerical": False
                },
                {
                    "name": "$browser",
                    "query_usage_30_day": 1,
                    "is_numerical": False
                },
            ]
            calculate_event_property_usage_for_team(team.pk)

            self.assertEqual(
                PropertyDefinition.objects.filter(team=team).count(),
                len(expected_property_definitions))
            for item in expected_property_definitions:
                instance = PropertyDefinition.objects.get(name=item["name"],
                                                          team=team)
                self.assertEqual(instance.query_usage_30_day,
                                 item["query_usage_30_day"], item)
                self.assertEqual(instance.is_numerical, item["is_numerical"],
                                 item)
        def test_calculate_usage(self) -> None:
            EventDefinition.objects.create(team=self.team, name="$pageview")
            EventDefinition.objects.create(team=self.team, name="custom event")
            PropertyDefinition.objects.create(team=self.team,
                                              name="$current_url")
            PropertyDefinition.objects.create(team=self.team, name="team_id")
            PropertyDefinition.objects.create(team=self.team, name="value")
            team2 = Organization.objects.bootstrap(None)[2]
            with freeze_time("2020-08-01"):
                # ignore stuff older than 30 days
                DashboardItem.objects.create(
                    team=self.team,
                    filters={
                        "events": [{
                            "id": "$pageview"
                        }],
                        "properties": [{
                            "key": "$current_url",
                            "value": "https://posthog.com"
                        }],
                    },
                )
                create_event(
                    distinct_id="test",
                    team=self.team,
                    event="$pageview",
                    properties={"$current_url": "https://posthog.com"},
                )
            with freeze_time("2020-10-01"):
                DashboardItem.objects.create(
                    team=self.team,
                    filters={
                        "events": [{
                            "id": "$pageview"
                        }],
                        "properties": [{
                            "key": "$current_url",
                            "value": "https://posthog.com"
                        }],
                    },
                )
                DashboardItem.objects.create(
                    team=self.team,
                    filters={
                        "events": [{
                            "id": "$pageview"
                        }],
                        "properties": [{
                            "key": "$current_url",
                            "value": "https://posthog2.com"
                        }],
                    },
                )
                DashboardItem.objects.create(
                    team=self.team,
                    filters={
                        "events": [{
                            "id": "custom event"
                        }],
                        "properties": [{
                            "key": "team_id",
                            "value": "3"
                        }]
                    },
                )
                DashboardItem.objects.create(
                    team=self.team,
                    filters={"events": [{
                        "id": "event that doesnt exist"
                    }]})
                # broken dashboard item
                DashboardItem.objects.create(team=self.team, filters={})
                create_event(
                    distinct_id="test",
                    team=self.team,
                    event="$pageview",
                    properties={"$current_url": "https://posthog.com"},
                )
                create_event(
                    distinct_id="test",
                    team=self.team,
                    event="$pageview",
                    properties={"$current_url": "https://posthog2.com"},
                )
                create_event(distinct_id="test",
                             team=self.team,
                             event="custom event",
                             properties={"team_id": "3"})

                # team leakage
                create_event(
                    distinct_id="test",
                    team=team2,
                    event="$pageview",
                    properties={"$current_url": "https://posthog.com"},
                )
                DashboardItem.objects.create(
                    team=team2,
                    filters={
                        "events": [{
                            "id": "$pageview"
                        }],
                        "properties": [{
                            "key": "$current_url",
                            "value": "https://posthog.com"
                        }],
                    },
                )

                calculate_event_property_usage_for_team(self.team.pk)
            self.assertEqual(
                2,
                EventDefinition.objects.get(
                    team=self.team, name="$pageview").query_usage_30_day)
            self.assertEqual(
                2,
                EventDefinition.objects.get(team=self.team,
                                            name="$pageview").volume_30_day)

            self.assertEqual(
                1,
                EventDefinition.objects.get(
                    team=self.team, name="custom event").query_usage_30_day)
            self.assertEqual(
                1,
                EventDefinition.objects.get(team=self.team,
                                            name="custom event").volume_30_day)

            self.assertEqual(
                2,
                PropertyDefinition.objects.get(
                    team=self.team, name="$current_url").query_usage_30_day)
            self.assertEqual(
                1,
                PropertyDefinition.objects.get(
                    team=self.team, name="team_id").query_usage_30_day)
            self.assertEqual(
                0,
                PropertyDefinition.objects.get(
                    team=self.team, name="value").query_usage_30_day)
        def test_updating_team_events_or_related_updates_event_definitions(
                self) -> None:
            random.seed(900)  # ensure random data is consistent
            org = Organization.objects.create(name="Demo Org")
            team = create_demo_team(org, None, None)

            expected_events = [
                "watched_movie",
                "installed_app",
                "rated_app",
                "purchase",
                "entered_free_trial",
                "$pageview",
            ]

            self.assertEqual(
                EventDefinition.objects.filter(team=team).count(),
                len(expected_events))

            for obj in EventDefinition.objects.filter(team=team):
                self.assertIn(obj.name, expected_events)
                self.assertEqual(obj.volume_30_day, None)
                self.assertEqual(obj.query_usage_30_day, None)

            DashboardItem.objects.create(
                team=team, filters={"events": [{
                    "id": "$pageview"
                }]})
            # Test events with usage
            expected_event_definitions = [
                {
                    "name": "installed_app",
                    "volume_30_day": 100,
                    "query_usage_30_day": 0
                },
                {
                    "name": "rated_app",
                    "volume_30_day": 73,
                    "query_usage_30_day": 0
                },
                {
                    "name": "purchase",
                    "volume_30_day": 16,
                    "query_usage_30_day": 0
                },
                {
                    "name": "entered_free_trial",
                    "volume_30_day": 0,
                    "query_usage_30_day": 0
                },
                {
                    "name": "watched_movie",
                    "volume_30_day": 87,
                    "query_usage_30_day": 0
                },
                {
                    "name": "$pageview",
                    "volume_30_day": 327,
                    "query_usage_30_day": 1
                },
            ]
            calculate_event_property_usage_for_team(team.pk)

            self.assertEqual(
                EventDefinition.objects.filter(team=team).count(),
                len(expected_event_definitions))
            for item in expected_event_definitions:
                instance = EventDefinition.objects.get(name=item["name"],
                                                       team=team)
                self.assertEqual(instance.volume_30_day, item["volume_30_day"],
                                 item)
                self.assertEqual(instance.query_usage_30_day,
                                 item["query_usage_30_day"], item)