From 2d7670dcc4166e230c431380b60e15881c79f45d Mon Sep 17 00:00:00 2001 From: Marius Andra Date: Thu, 22 Jul 2021 14:26:09 +0200 Subject: [PATCH 1/3] get default event name directly from django --- frontend/src/lib/utils/getAppContext.ts | 6 +++++- frontend/src/scenes/funnels/funnelLogic.ts | 7 ++----- frontend/src/scenes/trends/trendsLogic.ts | 22 ++++++---------------- frontend/src/types.ts | 1 + posthog/utils.py | 6 +++++- 5 files changed, 19 insertions(+), 23 deletions(-) diff --git a/frontend/src/lib/utils/getAppContext.ts b/frontend/src/lib/utils/getAppContext.ts index c61d6cc2ba160..eb80b3f7bdb50 100644 --- a/frontend/src/lib/utils/getAppContext.ts +++ b/frontend/src/lib/utils/getAppContext.ts @@ -1,5 +1,9 @@ -import { AppContext } from '~/types' +import { AppContext, PathType } from '~/types' export function getAppContext(): AppContext | undefined { return (window as any)['POSTHOG_APP_CONTEXT'] || undefined } + +export function getDefaultEventName(): string { + return getAppContext()?.default_event || PathType.PageView +} diff --git a/frontend/src/scenes/funnels/funnelLogic.ts b/frontend/src/scenes/funnels/funnelLogic.ts index 1b1bc828e367b..db4d7eb9a100d 100644 --- a/frontend/src/scenes/funnels/funnelLogic.ts +++ b/frontend/src/scenes/funnels/funnelLogic.ts @@ -15,7 +15,6 @@ import { FunnelStep, FunnelsTimeConversionBins, FunnelTimeConversionStep, - PathType, PersonType, ViewType, FunnelStepWithNestedBreakdown, @@ -27,10 +26,10 @@ import { featureFlagLogic } from 'lib/logic/featureFlagLogic' import { FEATURE_FLAGS, FunnelLayout } from 'lib/constants' import { preflightLogic } from 'scenes/PreflightCheck/logic' import { FunnelStepReference } from 'scenes/insights/InsightTabs/FunnelTab/FunnelStepReferencePicker' -import { eventDefinitionsModel } from '~/models/eventDefinitionsModel' import { calcPercentage, cleanBinResult, getLastFilledStep, getReferenceStep } from './funnelUtils' import { personsModalLogic } from 'scenes/trends/personsModalLogic' import { router } from 'kea-router' +import { getDefaultEventName } from 'lib/utils/getAppContext' function aggregateBreakdownResult(breakdownList: FunnelStep[][]): FunnelStepWithNestedBreakdown[] { if (breakdownList.length) { @@ -521,9 +520,7 @@ export const funnelLogic = kea({ if (!objectsEqual(currentParams, paramsToCheck)) { const cleanedParams = cleanFunnelParams(searchParams) if (isStepsEmpty(cleanedParams)) { - const event = eventDefinitionsModel.values.eventNames.includes(PathType.PageView) - ? PathType.PageView - : eventDefinitionsModel.values.eventNames[0] + const event = getDefaultEventName() cleanedParams.events = [ { id: event, diff --git a/frontend/src/scenes/trends/trendsLogic.ts b/frontend/src/scenes/trends/trendsLogic.ts index 8f9c6d7394032..cb994c637bb60 100644 --- a/frontend/src/scenes/trends/trendsLogic.ts +++ b/frontend/src/scenes/trends/trendsLogic.ts @@ -12,7 +12,6 @@ import { ChartDisplayType, EntityTypes, FilterType, - PathType, PersonType, PropertyFilter, TrendResult, @@ -24,6 +23,7 @@ import { eventDefinitionsModel } from '~/models/eventDefinitionsModel' import { propertyDefinitionsModel } from '~/models/propertyDefinitionsModel' import { sceneLogic } from 'scenes/sceneLogic' import { featureFlagLogic } from 'lib/logic/featureFlagLogic' +import { getDefaultEventName } from 'lib/utils/getAppContext' interface TrendResponse { result: TrendResult[] @@ -121,16 +121,9 @@ export function parsePeopleParams(peopleParams: PeopleParamType, filters: Partia return toAPIParams({ ...params, ...restParams }) } -function getDefaultFilters(currentFilters: Partial, eventNames: string[]): Partial { - /* Opening /insights without any params, will set $pageview as the default event (or - the first random event). We load this default events when `currentTeam` is loaded (because that's when - `eventNames` become available) and on every view change (through the urlToAction map) */ - if (!currentFilters.actions?.length && !currentFilters.events?.length && eventNames.length) { - const event = eventNames.includes(PathType.PageView) - ? PathType.PageView - : eventNames.includes(PathType.Screen) - ? PathType.Screen - : eventNames[0] +function getDefaultFilters(currentFilters: Partial): Partial { + if (!currentFilters.actions?.length && !currentFilters.events?.length) { + const event = getDefaultEventName() const defaultFilters = { [EntityTypes.EVENTS]: [ @@ -386,7 +379,7 @@ export const trendsLogic = kea { - const newFilter = getDefaultFilters(values.filters, eventDefinitionsModel.values.eventNames) + const newFilter = getDefaultFilters(values.filters) const mergedFilter: Partial = { ...values.filters, ...newFilter, @@ -454,10 +447,7 @@ export const trendsLogic = kea Date: Thu, 22 Jul 2021 14:35:10 +0200 Subject: [PATCH 2/3] default event name in the backend --- frontend/src/lib/utils/getAppContext.ts | 2 +- frontend/src/types.ts | 2 +- posthog/test/test_utils.py | 23 ++++++++++++++++++++++- posthog/utils.py | 13 ++++++++++++- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/frontend/src/lib/utils/getAppContext.ts b/frontend/src/lib/utils/getAppContext.ts index eb80b3f7bdb50..d475c0206b6e0 100644 --- a/frontend/src/lib/utils/getAppContext.ts +++ b/frontend/src/lib/utils/getAppContext.ts @@ -5,5 +5,5 @@ export function getAppContext(): AppContext | undefined { } export function getDefaultEventName(): string { - return getAppContext()?.default_event || PathType.PageView + return getAppContext()?.default_event_name || PathType.PageView } diff --git a/frontend/src/types.ts b/frontend/src/types.ts index bd20fc87923ec..14ff983fc6360 100644 --- a/frontend/src/types.ts +++ b/frontend/src/types.ts @@ -974,7 +974,7 @@ export type EventOrPropType = EventDefinition & PropertyDefinition export interface AppContext { current_user: UserType | null preflight: PreflightStatus - default_event: string + default_event_name: string } export type StoredMetricMathOperations = 'max' | 'min' | 'sum' diff --git a/posthog/test/test_utils.py b/posthog/test/test_utils.py index e3e30ac66fc3b..5310e5ef3eee4 100644 --- a/posthog/test/test_utils.py +++ b/posthog/test/test_utils.py @@ -1,7 +1,14 @@ from django.test import TestCase from freezegun import freeze_time -from posthog.utils import get_available_timezones_with_offsets, mask_email_address, relative_date_parse +from posthog.models import EventDefinition +from posthog.test.base import BaseTest +from posthog.utils import ( + get_available_timezones_with_offsets, + get_default_event_name, + mask_email_address, + relative_date_parse, +) class TestGeneralUtils(TestCase): @@ -57,3 +64,17 @@ def test_year(self): @freeze_time("2020-01-31") def test_normal_date(self): self.assertEqual(relative_date_parse("2019-12-31").strftime("%Y-%m-%d"), "2019-12-31") + + +class TestDefaultEventName(BaseTest): + def test_no_events(self): + self.assertEqual(get_default_event_name(), "$pageview") + + def test_take_screen(self): + EventDefinition.objects.create(name="$screen", team=self.team) + self.assertEqual(get_default_event_name(), "$screen") + + def test_prefer_pageview(self): + EventDefinition.objects.create(name="$pageview", team=self.team) + EventDefinition.objects.create(name="$screen", team=self.team) + self.assertEqual(get_default_event_name(), "$pageview") diff --git a/posthog/utils.py b/posthog/utils.py index 2d74e00990dbd..e774491cb25c7 100644 --- a/posthog/utils.py +++ b/posthog/utils.py @@ -220,12 +220,13 @@ def render_template(template_name: str, request: HttpRequest, context: Dict = {} # Set the frontend app context if not request.GET.get("no-preloaded-app-context"): from posthog.api.user import UserSerializer + from posthog.models import EventDefinition from posthog.views import preflight_check posthog_app_context: Dict = { "current_user": None, "preflight": json.loads(preflight_check(request).getvalue()), - "default_event": "$pageview", + "default_event_name": get_default_event_name(), } if request.user.pk: @@ -240,6 +241,16 @@ def render_template(template_name: str, request: HttpRequest, context: Dict = {} return HttpResponse(html) +def get_default_event_name(): + from posthog.models import EventDefinition + + if EventDefinition.objects.filter(name="$pageview").exists(): + return "$pageview" + elif EventDefinition.objects.filter(name="$screen").exists(): + return "$screen" + return "$pageview" + + def json_uuid_convert(o): if isinstance(o, uuid.UUID): return str(o) From e3bf5df8d76479f5e1403d08663671d8e5cec4d1 Mon Sep 17 00:00:00 2001 From: Marius Andra Date: Thu, 22 Jul 2021 17:39:55 +0200 Subject: [PATCH 3/3] fix "~/" urls in jest tests --- jest.config.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jest.config.ts b/jest.config.ts index d1e949c20fed7..11005aa507aa8 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -81,7 +81,11 @@ export default { // ], // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - // moduleNameMapper: {}, + moduleNameMapper: { + '^~/(.*)$': '/$1', + '^lib/(.*)$': '/lib/$1', + '^scenes/(.*)$': '/scenes/$1', + }, // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader // modulePathIgnorePatterns: [],