From 074b4e4e79ebcf76e60eea4d1f2f688558ec6a2b Mon Sep 17 00:00:00 2001 From: Ogi <86684834+obostjancic@users.noreply.github.com> Date: Wed, 16 Apr 2025 09:40:23 +0200 Subject: [PATCH 1/6] feat(demo-mode): analytics --- src/sentry/templates/sentry/layout.html | 5 +++- src/sentry/templatetags/sentry_demo_mode.py | 18 ++++++++++++ static/app/utils/demoMode/utils.tsx | 31 --------------------- 3 files changed, 22 insertions(+), 32 deletions(-) create mode 100644 src/sentry/templatetags/sentry_demo_mode.py diff --git a/src/sentry/templates/sentry/layout.html b/src/sentry/templates/sentry/layout.html index 9a8019b59fa87a..d7cbf6f5eb4a0b 100644 --- a/src/sentry/templates/sentry/layout.html +++ b/src/sentry/templates/sentry/layout.html @@ -4,6 +4,7 @@ {% load sentry_features %} {% load sentry_helpers %} {% load sentry_status %} +{% load sentry_demo_mode %} {% get_sentry_version %} @@ -55,7 +56,6 @@ {% endscript %} {% include "sentry/partial/preload-data.html" %} - {% block scripts %} {% block scripts_main_entrypoint %} {% frontend_app_asset_url "sentry" "entrypoints/app.js" as asset_url %} @@ -70,6 +70,9 @@ {% asset_url 'sentry' 'js/ads.js' as asset_url %} {% script src=asset_url crossorigin="anonymous" %}{% endscript %} {% endblock %} + + {% init_demo_analytics request.get_host %} + diff --git a/src/sentry/templatetags/sentry_demo_mode.py b/src/sentry/templatetags/sentry_demo_mode.py new file mode 100644 index 00000000000000..6706af187ce822 --- /dev/null +++ b/src/sentry/templatetags/sentry_demo_mode.py @@ -0,0 +1,18 @@ +from django import template +from django.utils.safestring import mark_safe + +from sentry.demo_mode.utils import is_demo_mode_enabled + +register = template.Library() + + +@register.simple_tag +def init_demo_analytics(domain): + if not is_demo_mode_enabled(): + return "" + + html = f""" + + + """ + return mark_safe(html) diff --git a/static/app/utils/demoMode/utils.tsx b/static/app/utils/demoMode/utils.tsx index 7e3c9f3d480109..70bafcef0bcd7c 100644 --- a/static/app/utils/demoMode/utils.tsx +++ b/static/app/utils/demoMode/utils.tsx @@ -1,5 +1,3 @@ -import * as Sentry from '@sentry/react'; - import {setForceHide} from 'sentry/actionCreators/guides'; import {demoSignupModal} from 'sentry/actionCreators/modal'; import type {Client} from 'sentry/api'; @@ -25,7 +23,6 @@ export function initDemoMode(api: Client) { if (!isDemoModeActive()) { return; } - initDemoAnalytics(); captureEmail(api); } @@ -57,31 +54,3 @@ async function captureEmail(api: Client) { setForceHide(false); } } - -function initDemoAnalytics() { - if (!isDemoModeActive()) { - return; - } - - if (document.getElementById('plausible-script')) { - return; - } - - try { - const mainScript = document.createElement('script'); - mainScript.id = 'plausible-script'; - mainScript.defer = true; - mainScript.setAttribute('data-domain', window.location.hostname); - mainScript.src = 'https://plausible.io/js/script.pageview-props.tagged-events.js'; - - const queueScript = document.createElement('script'); - queueScript.id = 'plausible-queue-script'; - queueScript.textContent = - 'window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }'; - - document.head.appendChild(mainScript); - document.head.appendChild(queueScript); - } catch (error) { - Sentry.captureException(error); - } -} From d61ee753b51490bc4ec4ba6e5d60fb8fe34c4942 Mon Sep 17 00:00:00 2001 From: Ogi <86684834+obostjancic@users.noreply.github.com> Date: Wed, 16 Apr 2025 09:41:12 +0200 Subject: [PATCH 2/6] blank line --- src/sentry/templates/sentry/layout.html | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sentry/templates/sentry/layout.html b/src/sentry/templates/sentry/layout.html index d7cbf6f5eb4a0b..9e5a7bb4f1312c 100644 --- a/src/sentry/templates/sentry/layout.html +++ b/src/sentry/templates/sentry/layout.html @@ -56,6 +56,7 @@ {% endscript %} {% include "sentry/partial/preload-data.html" %} + {% block scripts %} {% block scripts_main_entrypoint %} {% frontend_app_asset_url "sentry" "entrypoints/app.js" as asset_url %} From 70af49b57a47dbc4de284d68d5d14e95fc07f529 Mon Sep 17 00:00:00 2001 From: Ogi <86684834+obostjancic@users.noreply.github.com> Date: Wed, 16 Apr 2025 13:41:27 +0200 Subject: [PATCH 3/6] domain fix --- src/sentry/demo_mode/utils.py | 16 ++++++++++++-- src/sentry/templates/sentry/layout.html | 2 +- src/sentry/templatetags/sentry_demo_mode.py | 11 ++++++++-- tests/sentry/demo_mode/test_utils.py | 24 +++++++++++++++++++++ 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/sentry/demo_mode/utils.py b/src/sentry/demo_mode/utils.py index 5938c2642dc55a..a0dba9212d738c 100644 --- a/src/sentry/demo_mode/utils.py +++ b/src/sentry/demo_mode/utils.py @@ -41,7 +41,13 @@ def get_demo_org(): if not is_demo_mode_enabled(): return None - org_id = options.get("demo-mode.orgs")[0] + demo_orgs = options.get("demo-mode.orgs") + + if demo_orgs is None or len(demo_orgs) == 0: + return None + + org_id = demo_orgs[0] + return Organization.objects.get(id=org_id) @@ -49,7 +55,13 @@ def get_demo_user(): if not is_demo_mode_enabled(): return None - user_id = options.get("demo-mode.users")[0] + demo_users = options.get("demo-mode.users") + + if demo_users is None or len(demo_users) == 0: + return None + + user_id = demo_users[0] + return User.objects.get(id=user_id) diff --git a/src/sentry/templates/sentry/layout.html b/src/sentry/templates/sentry/layout.html index 9e5a7bb4f1312c..2aa267ccd40b78 100644 --- a/src/sentry/templates/sentry/layout.html +++ b/src/sentry/templates/sentry/layout.html @@ -72,7 +72,7 @@ {% script src=asset_url crossorigin="anonymous" %}{% endscript %} {% endblock %} - {% init_demo_analytics request.get_host %} + {% init_demo_analytics %} diff --git a/src/sentry/templatetags/sentry_demo_mode.py b/src/sentry/templatetags/sentry_demo_mode.py index 6706af187ce822..ffc0fffdc50652 100644 --- a/src/sentry/templatetags/sentry_demo_mode.py +++ b/src/sentry/templatetags/sentry_demo_mode.py @@ -1,16 +1,23 @@ from django import template from django.utils.safestring import mark_safe -from sentry.demo_mode.utils import is_demo_mode_enabled +from sentry.demo_mode.utils import get_demo_org, is_demo_mode_enabled register = template.Library() @register.simple_tag -def init_demo_analytics(domain): +def init_demo_analytics(): if not is_demo_mode_enabled(): return "" + org = get_demo_org() + + if not org: + return "" + + domain = f"{org.slug}.sentry.io" + html = f""" diff --git a/tests/sentry/demo_mode/test_utils.py b/tests/sentry/demo_mode/test_utils.py index 08e50528a8f1d3..b646927679735e 100644 --- a/tests/sentry/demo_mode/test_utils.py +++ b/tests/sentry/demo_mode/test_utils.py @@ -79,6 +79,18 @@ def test_get_demo_user_demo_mode_disabled(): assert get_demo_user() is None +@override_options({"demo-mode.enabled": True, "demo-mode.users": None}) +@django_db_all +def test_get_demo_user_demo_mode_enabled_users_none(): + assert get_demo_user() is None + + +@override_options({"demo-mode.enabled": True, "demo-mode.users": []}) +@django_db_all +def test_get_demo_user_demo_mode_enabled_users_empty(): + assert get_demo_user() is None + + @override_options({"demo-mode.enabled": True, "demo-mode.users": [1]}) @django_db_all def test_get_demo_user_demo_mode_enabled(): @@ -101,3 +113,15 @@ def test_get_demo_org_demo_mode_enabled(): with patch("sentry.demo_mode.utils.Organization.objects.get", return_value=org) as mock_org_get: assert get_demo_org() == org mock_org_get.assert_called_once_with(id=1) + + +@override_options({"demo-mode.enabled": True, "demo-mode.orgs": []}) +@django_db_all +def test_get_demo_org_demo_mode_enabled_not_set(): + assert get_demo_org() is None + + +@override_options({"demo-mode.enabled": True, "demo-mode.orgs": None}) +@django_db_all +def test_get_demo_org_demo_mode_enabled_orgs_none(): + assert get_demo_org() is None From 4e18c18334aa1e9f2e10965e225013e85106ed40 Mon Sep 17 00:00:00 2001 From: Ogi <86684834+obostjancic@users.noreply.github.com> Date: Wed, 16 Apr 2025 13:42:54 +0200 Subject: [PATCH 4/6] remove check --- src/sentry/templatetags/sentry_demo_mode.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/sentry/templatetags/sentry_demo_mode.py b/src/sentry/templatetags/sentry_demo_mode.py index ffc0fffdc50652..ba1f0d911241ab 100644 --- a/src/sentry/templatetags/sentry_demo_mode.py +++ b/src/sentry/templatetags/sentry_demo_mode.py @@ -1,16 +1,13 @@ from django import template from django.utils.safestring import mark_safe -from sentry.demo_mode.utils import get_demo_org, is_demo_mode_enabled +from sentry.demo_mode.utils import get_demo_org register = template.Library() @register.simple_tag def init_demo_analytics(): - if not is_demo_mode_enabled(): - return "" - org = get_demo_org() if not org: From bf4a4a4ecaa5a1d1fb55282d730287f5997ff12a Mon Sep 17 00:00:00 2001 From: Ogi <86684834+obostjancic@users.noreply.github.com> Date: Thu, 17 Apr 2025 10:26:03 +0200 Subject: [PATCH 5/6] use org_service --- src/sentry/demo_mode/utils.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/sentry/demo_mode/utils.py b/src/sentry/demo_mode/utils.py index a0dba9212d738c..c99d60f40d9884 100644 --- a/src/sentry/demo_mode/utils.py +++ b/src/sentry/demo_mode/utils.py @@ -2,6 +2,7 @@ from sentry import options from sentry.models.organization import Organization +from sentry.organizations.services.organization import organization_service from sentry.users.models.user import User READONLY_SCOPES = frozenset( @@ -48,7 +49,9 @@ def get_demo_org(): org_id = demo_orgs[0] - return Organization.objects.get(id=org_id) + return organization_service.get_org_by_id( + id=org_id, + ) def get_demo_user(): From 0f5016fa52a1d22767cb6c4bfffab253b8319cf1 Mon Sep 17 00:00:00 2001 From: Ogi <86684834+obostjancic@users.noreply.github.com> Date: Thu, 17 Apr 2025 10:48:34 +0200 Subject: [PATCH 6/6] fix test --- tests/sentry/demo_mode/test_utils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/sentry/demo_mode/test_utils.py b/tests/sentry/demo_mode/test_utils.py index b646927679735e..5c67dcfa3f40f8 100644 --- a/tests/sentry/demo_mode/test_utils.py +++ b/tests/sentry/demo_mode/test_utils.py @@ -110,7 +110,9 @@ def test_get_demo_org_demo_mode_disabled(): @django_db_all def test_get_demo_org_demo_mode_enabled(): org = Factories.create_organization(id=1) - with patch("sentry.demo_mode.utils.Organization.objects.get", return_value=org) as mock_org_get: + with patch( + "sentry.demo_mode.utils.organization_service.get_org_by_id", return_value=org + ) as mock_org_get: assert get_demo_org() == org mock_org_get.assert_called_once_with(id=1)