Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove legacy event_names code #4480

Merged
merged 8 commits into from
May 26, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 23 additions & 21 deletions frontend/src/scenes/events/EventsVolumeTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,26 +71,28 @@ export function VolumeTable({
],
onFilter: (value, record) => (value === 'warnings' ? !!record.warnings.length : !record.warnings.length),
},
{
title: function VolumeTitle() {
return (
<Tooltip
placement="right"
title="Total number of events over the last 30 days. Can be delayed by up to an hour."
>
30 day volume (delayed by up to an hour)
<InfoCircleOutlined className="info-indicator" />
</Tooltip>
)
},
render: function RenderVolume(_, record) {
return <span className="ph-no-capture">{humanizeNumber(record.eventOrProp.volume_30_day)}</span>
},
sorter: (a, b) =>
a.eventOrProp.volume_30_day == b.eventOrProp.volume_30_day
? (a.eventOrProp.volume_30_day || -1) - (b.eventOrProp.volume_30_day || -1)
: (a.eventOrProp.volume_30_day || -1) - (b.eventOrProp.volume_30_day || -1),
},
type === 'event'
? {
title: function VolumeTitle() {
return (
<Tooltip
placement="right"
title="Total number of events over the last 30 days. Can be delayed by up to an hour."
>
30 day volume (delayed by up to an hour)
<InfoCircleOutlined className="info-indicator" />
</Tooltip>
)
},
render: function RenderVolume(_, record) {
return <span className="ph-no-capture">{humanizeNumber(record.eventOrProp.volume_30_day)}</span>
},
sorter: (a, b) =>
a.eventOrProp.volume_30_day == b.eventOrProp.volume_30_day
? (a.eventOrProp.volume_30_day || -1) - (b.eventOrProp.volume_30_day || -1)
: (a.eventOrProp.volume_30_day || -1) - (b.eventOrProp.volume_30_day || -1),
}
: {},
{
title: function QueriesTitle() {
return (
Expand Down Expand Up @@ -150,7 +152,7 @@ export function VolumeTable({
rowKey={(item) => item.eventOrProp.name}
size="small"
style={{ marginBottom: '4rem' }}
pagination={{ pageSize: 99999, hideOnSinglePage: true }}
pagination={{ pageSize: 100, hideOnSinglePage: true }}
/>
</>
)
Expand Down
1 change: 0 additions & 1 deletion posthog/api/property_definition.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ class Meta:
"id",
"name",
"is_numerical",
"volume_30_day",
"query_usage_30_day",
)

Expand Down
32 changes: 18 additions & 14 deletions posthog/api/test/test_event_definition.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

from posthog.demo import create_demo_team
from posthog.models import EventDefinition, Organization, Team
from posthog.models.property_definition import PropertyDefinition
from posthog.tasks.calculate_event_property_usage import calculate_event_property_usage_for_team
from posthog.test.base import APIBaseTest

Expand All @@ -19,6 +20,7 @@ class TestEventDefinitionAPI(APIBaseTest):
{"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": 0},
]

@classmethod
Expand All @@ -39,44 +41,46 @@ def test_list_event_definitions(self):

for item in self.EXPECTED_EVENT_DEFINITIONS:
response_item: Dict = next((_i for _i in response.json()["results"] if _i["name"] == item["name"]), {})
self.assertEqual(response_item["volume_30_day"], item["volume_30_day"])
self.assertEqual(response_item["query_usage_30_day"], item["query_usage_30_day"])
self.assertEqual(response_item["volume_30_day"], item["volume_30_day"], item)
self.assertEqual(response_item["query_usage_30_day"], item["query_usage_30_day"], item)
self.assertEqual(
response_item["volume_30_day"], EventDefinition.objects.get(id=response_item["id"]).volume_30_day,
response_item["volume_30_day"], EventDefinition.objects.get(id=response_item["id"]).volume_30_day, item,
)

def test_pagination_of_event_definitions(self):
self.demo_team.event_names = self.demo_team.event_names + [f"z_event_{i}" for i in range(1, 301)]
self.demo_team.save()
EventDefinition.objects.bulk_create(
[EventDefinition(team=self.demo_team, name="z_event_{}".format(i)) for i in range(1, 301)]
)

response = self.client.get("/api/projects/@current/event_definitions/")
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.json()["count"], 305)
self.assertEqual(response.json()["count"], 306)
self.assertEqual(len(response.json()["results"]), 100) # Default page size
self.assertEqual(response.json()["results"][0]["name"], "entered_free_trial") # Order by name (ascending)
self.assertEqual(response.json()["results"][0]["name"], "$pageview") # Order by name (ascending)
self.assertEqual(response.json()["results"][1]["name"], "entered_free_trial") # Order by name (ascending)

event_checkpoints = [
185,
275,
95,
184,
274,
94,
] # Because Postgres's sorter does this: event_1; event_100, ..., event_2, event_200, ..., it's
# easier to deterministically set the expected events

for i in range(0, 3):
response = self.client.get(response.json()["next"])
self.assertEqual(response.status_code, status.HTTP_200_OK)

self.assertEqual(response.json()["count"], 305)
self.assertEqual(response.json()["count"], 306)
self.assertEqual(
len(response.json()["results"]), 100 if i < 2 else 5,
len(response.json()["results"]), 100 if i < 2 else 6,
) # Each page has 100 except the last one
self.assertEqual(response.json()["results"][0]["name"], f"z_event_{event_checkpoints[i]}")

def test_cant_see_event_definitions_for_another_team(self):
org = Organization.objects.create(name="Separate Org")
team = Team.objects.create(organization=org, name="Default Project")
team.event_names = self.demo_team.event_names + [f"should_be_invisible_{i}" for i in range(0, 5)]
team.save()

EventDefinition.objects.create(team=team, name="should_be_invisible")

response = self.client.get("/api/projects/@current/event_definitions/")
self.assertEqual(response.status_code, status.HTTP_200_OK)
Expand Down
39 changes: 19 additions & 20 deletions posthog/api/test/test_property_definition.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,14 @@ class TestPropertyDefinitionAPI(APIBaseTest):
demo_team: Team = None # type: ignore

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": "purchase_value", "volume_30_day": 14, "query_usage_30_day": 0, "is_numerical": True},
{"name": "first_visit", "volume_30_day": 0, "query_usage_30_day": 0, "is_numerical": False},
{"name": "$browser", "query_usage_30_day": 0, "is_numerical": False},
{"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},
]

@classmethod
Expand All @@ -37,41 +38,39 @@ def test_list_property_definitions(self):
response = self.client.get("/api/projects/@current/property_definitions/")
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.json()["count"], len(self.EXPECTED_PROPERTY_DEFINITIONS))

self.assertEqual(len(response.json()["results"]), len(self.EXPECTED_PROPERTY_DEFINITIONS))

for item in self.EXPECTED_PROPERTY_DEFINITIONS:
response_item: Dict = next((_i for _i in response.json()["results"] if _i["name"] == item["name"]), {})
self.assertEqual(response_item["volume_30_day"], item["volume_30_day"])
self.assertEqual(response_item["query_usage_30_day"], item["query_usage_30_day"])
self.assertEqual(response_item["is_numerical"], item["is_numerical"])
self.assertEqual(
response_item["volume_30_day"], PropertyDefinition.objects.get(id=response_item["id"]).volume_30_day,
)

def test_pagination_of_property_definitions(self):
self.demo_team.event_properties = self.demo_team.event_properties + [f"z_property_{i}" for i in range(1, 301)]
self.demo_team.save()
PropertyDefinition.objects.bulk_create(
[PropertyDefinition(team=self.demo_team, name="z_property_{}".format(i)) for i in range(1, 301)]
)

response = self.client.get("/api/projects/@current/property_definitions/")
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.json()["count"], 307)
self.assertEqual(response.json()["count"], 308)
self.assertEqual(len(response.json()["results"]), 100) # Default page size
self.assertEqual(response.json()["results"][0]["name"], "$current_url") # Order by name (ascending)
self.assertEqual(response.json()["results"][0]["name"], "$browser") # Order by name (ascending)

property_checkpoints = [
183,
273,
93,
182,
272,
92,
] # Because Postgres's sorter does this: property_1; property_100, ..., property_2, property_200, ..., it's
# easier to deterministically set the expected events

for i in range(0, 3):
response = self.client.get(response.json()["next"])
self.assertEqual(response.status_code, status.HTTP_200_OK)

self.assertEqual(response.json()["count"], 307)
self.assertEqual(response.json()["count"], 308)
self.assertEqual(
len(response.json()["results"]), 100 if i < 2 else 7,
len(response.json()["results"]), 100 if i < 2 else 8,
) # Each page has 100 except the last one
self.assertEqual(response.json()["results"][0]["name"], f"z_property_{property_checkpoints[i]}")

Expand Down
6 changes: 3 additions & 3 deletions posthog/api/test/test_team.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def test_list_projects(self):
self.assertNotIn("test_account_filters", response_data["results"][0])
self.assertNotIn("data_attributes", response_data["results"][0])

# TODO: #4070 These assertions will no longer make sense when we fully remove these attributes from the model
# TODO: These assertions will no longer make sense when we fully remove these attributes from the model
self.assertNotIn("event_names", response_data["results"][0])
self.assertNotIn("event_properties", response_data["results"][0])
self.assertNotIn("event_properties_numerical", response_data["results"][0])
Expand All @@ -33,8 +33,8 @@ def test_retrieve_project(self):
self.assertEqual(response_data["timezone"], "UTC")
self.assertEqual(response_data["is_demo"], False)
self.assertEqual(response_data["slack_incoming_webhook"], self.team.slack_incoming_webhook)
# The properties below are no longer included as part of the request
# TODO: #4070 These assertions will no longer make sense when we fully remove these attributes from the model

# TODO: These assertions will no longer make sense when we fully remove these attributes from the model
self.assertNotIn("event_names", response_data)
self.assertNotIn("event_properties", response_data)
self.assertNotIn("event_properties_numerical", response_data)
Expand Down
25 changes: 1 addition & 24 deletions posthog/api/test/test_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ def test_update_current_user(self, mock_capture):
user.distinct_id,
"user updated",
properties={
"updated_attrs": ["anonymize_data", "email", "email_opt_in", "events_column_config", "first_name",]
"updated_attrs": ["anonymize_data", "email", "email_opt_in", "events_column_config", "first_name"],
},
)

Expand Down Expand Up @@ -480,29 +480,6 @@ def test_user_team_update(self):
self.assertEqual(team.anonymize_ips, False)
self.assertEqual(team.session_recording_opt_in, True)

def test_event_names_job_not_run_yet(self):
self.team.event_names = ["test event", "another event"]
# test event not in event_names_with_usage
self.team.event_names_with_usage = [{"event": "another event", "volume": 1, "usage_count": 1}]
self.team.event_properties = ["test prop", "another prop"]
self.team.event_properties_with_usage = [{"key": "another prop", "volume": 1, "usage_count": 1}]
self.team.save()
response = self.client.get("/api/user/")
self.assertEqual(
response.json()["team"]["event_names_with_usage"],
[
{"event": "test event", "volume": None, "usage_count": None},
{"event": "another event", "volume": 1, "usage_count": 1},
],
)
self.assertEqual(
response.json()["team"]["event_properties_with_usage"],
[
{"key": "test prop", "volume": None, "usage_count": None},
{"key": "another prop", "volume": 1, "usage_count": 1},
],
)

def test_redirect_to_site(self):
self.team.app_urls = ["http://somewebsite.com"]
self.team.save()
Expand Down
5 changes: 0 additions & 5 deletions posthog/api/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,11 +266,6 @@ def user(request):
"api_token": team.api_token,
"anonymize_ips": team.anonymize_ips,
"slack_incoming_webhook": team.slack_incoming_webhook,
"event_names": team.event_names,
"event_names_with_usage": team.get_latest_event_names_with_usage(),
"event_properties": team.event_properties,
"event_properties_numerical": team.event_properties_numerical,
"event_properties_with_usage": team.get_latest_event_properties_with_usage(),
"completed_snippet_onboarding": team.completed_snippet_onboarding,
"session_recording_opt_in": team.session_recording_opt_in,
"session_recording_retention_period_days": team.session_recording_retention_period_days,
Expand Down
7 changes: 3 additions & 4 deletions posthog/demo/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from posthog.demo.web_data_generator import WebDataGenerator
from posthog.ee import is_clickhouse_enabled
from posthog.models import Organization, Team, User
from posthog.models.event_definition import EventDefinition
from posthog.utils import render_template

ORGANIZATION_NAME = "HogFlix"
Expand All @@ -27,10 +28,7 @@ def demo(request: Request):

user.current_team = team
user.save()
if "$pageview" not in team.event_names:
team.event_names.append("$pageview")
team.event_names_with_usage.append({"event": "$pageview", "usage_count": None, "volume": None})
team.save()
EventDefinition.objects.get_or_create(team=team, name="$pageview")

if is_clickhouse_enabled(): # :TRICKY: Lazily backfill missing event data.
from ee.clickhouse.models.event import get_events_by_team
Expand All @@ -52,6 +50,7 @@ def create_demo_team(organization: Organization, *args) -> Team:
is_demo=True,
)
create_demo_data(team)
EventDefinition.objects.get_or_create(team=team, name="$pageview")
return team


Expand Down
9 changes: 0 additions & 9 deletions posthog/demo/app_data_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,6 @@

class AppDataGenerator(DataGenerator):
def create_missing_events_and_properties(self):
self.add_if_not_contained(self.team.event_names, "watched_movie")
self.add_if_not_contained(self.team.event_names, "installed_app")
self.add_if_not_contained(self.team.event_names, "rated_app")
self.add_if_not_contained(self.team.event_properties, "$current_url")
self.add_if_not_contained(self.team.event_properties, "is_first_movie")
self.add_if_not_contained(
self.team.event_properties, "app_rating",
) # numerical properties must also be declared here
self.add_if_not_contained(self.team.event_properties_numerical, "app_rating")
EventDefinition.objects.get_or_create(team=self.team, name="watched_movie")
EventDefinition.objects.get_or_create(team=self.team, name="installed_app")
EventDefinition.objects.get_or_create(team=self.team, name="rated_app")
Expand Down
6 changes: 0 additions & 6 deletions posthog/demo/revenue_data_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,6 @@

class RevenueDataGenerator(DataGenerator):
def create_missing_events_and_properties(self):
self.add_if_not_contained(self.team.event_names, "purchase")
self.add_if_not_contained(self.team.event_names, "entered_free_trial")
self.add_if_not_contained(self.team.event_properties, "plan")
self.add_if_not_contained(self.team.event_properties, "first_visit")
self.add_if_not_contained(self.team.event_properties_numerical, "purchase_value")
self.add_if_not_contained(self.team.event_properties, "purchase_value")
EventDefinition.objects.get_or_create(team=self.team, name="purchase")
EventDefinition.objects.get_or_create(team=self.team, name="entered_free_trial")
PropertyDefinition.objects.get_or_create(team=self.team, name="plan")
Expand Down
3 changes: 3 additions & 0 deletions posthog/demo/web_data_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from posthog.constants import TREND_FILTER_TYPE_ACTIONS
from posthog.demo.data_generator import DataGenerator
from posthog.models import Action, ActionStep, Dashboard, DashboardItem, Person, PropertyDefinition
from posthog.models.event_definition import EventDefinition
from posthog.models.filters.mixins.utils import cached_property
from posthog.models.utils import UUIDT
from posthog.utils import get_absolute_path
Expand All @@ -22,6 +23,8 @@ def create_missing_events_and_properties(self):
self.add_if_not_contained(self.team.event_properties_numerical, "purchase")
self.add_if_not_contained(self.team.event_properties, "purchase")
PropertyDefinition.objects.get_or_create(team=self.team, name="purchase", is_numerical=True)
PropertyDefinition.objects.get_or_create(team=self.team, name="$current_url")
PropertyDefinition.objects.get_or_create(team=self.team, name="$browser")

def create_actions_dashboards(self):
homepage = Action.objects.create(team=self.team, name="HogFlix homepage view")
Expand Down
Loading