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

feat: add field to never drop data for a customer #17365

Closed
wants to merge 68 commits into from
Closed
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
c08c5a8
create field on org
raquelmsmith Sep 8, 2023
07ba948
save field when updating org details from billing
raquelmsmith Sep 8, 2023
e8a4cab
don't limit customers who have never_drop_data
raquelmsmith Sep 8, 2023
ae4d64a
send an email to cs when this field is used
raquelmsmith Sep 8, 2023
fcf1750
update test
raquelmsmith Sep 8, 2023
2f77d41
change where this is done
raquelmsmith Sep 8, 2023
f095e32
create migrations
raquelmsmith Sep 8, 2023
4020fee
Update query snapshots
github-actions[bot] Sep 8, 2023
6ad0b44
Update query snapshots
github-actions[bot] Sep 8, 2023
cec6965
Update query snapshots
github-actions[bot] Sep 8, 2023
b85fafb
make sure CS is only emailed once every 7 days
raquelmsmith Sep 11, 2023
8f44feb
Merge branch 'master' into feat/never-drop-data
raquelmsmith Sep 11, 2023
05760bc
Merge branch 'master' into feat/never-drop-data
raquelmsmith Sep 11, 2023
e7ae14f
Update query snapshots
github-actions[bot] Sep 11, 2023
c693499
Update query snapshots
github-actions[bot] Sep 11, 2023
4fa5890
make field nullable
raquelmsmith Sep 11, 2023
3a9632a
Merge branch 'master' into feat/never-drop-data
raquelmsmith Sep 11, 2023
2615344
reup migrations
raquelmsmith Sep 11, 2023
f54ae86
fix
raquelmsmith Sep 12, 2023
1606261
Update query snapshots
github-actions[bot] Sep 12, 2023
23d9c1c
improve limit banner language
raquelmsmith Sep 12, 2023
b564b0e
Merge branch 'feat/never-drop-data' of https://github.com/PostHog/pos…
raquelmsmith Sep 12, 2023
29f9d35
Update UI snapshots for `chromium` (1)
github-actions[bot] Sep 12, 2023
9d5ce55
Merge branch 'master' into feat/never-drop-data
raquelmsmith Sep 13, 2023
816644c
handle resends in MessagingRecord
raquelmsmith Sep 13, 2023
e01830e
remove cache usage
raquelmsmith Sep 13, 2023
77fa9b8
Merge branch 'master' into feat/never-drop-data
raquelmsmith Sep 13, 2023
d0207b0
reup migration
raquelmsmith Sep 13, 2023
37493df
Update query snapshots
github-actions[bot] Sep 13, 2023
03be08f
Update query snapshots
github-actions[bot] Sep 13, 2023
7010884
Update UI snapshots for `chromium` (1)
github-actions[bot] Sep 13, 2023
4d7be74
Update UI snapshots for `chromium` (2)
github-actions[bot] Sep 13, 2023
6e6d5e1
Merge branch 'master' into feat/never-drop-data
raquelmsmith Sep 14, 2023
1fd0bc9
remove constraint on resend_frequency_days
raquelmsmith Sep 14, 2023
2500026
Update UI snapshots for `chromium` (2)
github-actions[bot] Sep 14, 2023
24cb18e
Update UI snapshots for `chromium` (2)
github-actions[bot] Sep 14, 2023
9c69666
remove constraint to simplify implementation
raquelmsmith Sep 15, 2023
5735f51
Merge branch 'master' into feat/never-drop-data
raquelmsmith Sep 15, 2023
aa8967f
don't add extra field...
raquelmsmith Sep 15, 2023
26f732e
modify constraint check
raquelmsmith Sep 15, 2023
75e56e6
fix mypy
raquelmsmith Sep 17, 2023
92e455e
remove comments
raquelmsmith Sep 17, 2023
f599659
Added campaign count field
benjackwhite Sep 18, 2023
d6faf4a
Merge
benjackwhite Sep 18, 2023
1461d1e
Fix
benjackwhite Sep 18, 2023
5ca19aa
Update UI snapshots for `chromium` (1)
github-actions[bot] Sep 18, 2023
020ba93
Update UI snapshots for `chromium` (1)
github-actions[bot] Sep 18, 2023
3dc5da0
Merge branch 'master' into feat/never-drop-data
raquelmsmith Sep 18, 2023
f947c1e
re-up migrations
raquelmsmith Sep 18, 2023
45cf0e2
Update query snapshots
github-actions[bot] Sep 18, 2023
0990355
fix mypy
raquelmsmith Sep 18, 2023
6a507e2
Merge branch 'feat/never-drop-data' of https://github.com/PostHog/pos…
raquelmsmith Sep 18, 2023
6ecfdef
Create index concurrently instead of altering unique constraint
frankh Sep 19, 2023
a32d88e
Merge branch 'master' into feat/never-drop-data
raquelmsmith Sep 20, 2023
2ad850c
fix typo
raquelmsmith Sep 20, 2023
844edfe
ignore test
raquelmsmith Sep 20, 2023
7b79f45
Merge branch 'master' into feat/never-drop-data
raquelmsmith Sep 26, 2023
b9c85d7
Merge branch 'master' into feat/never-drop-data
raquelmsmith Oct 5, 2023
88a5858
reup migrations
raquelmsmith Oct 5, 2023
8c15bbe
Update query snapshots
github-actions[bot] Oct 5, 2023
bb659d3
reinstate test
raquelmsmith Oct 6, 2023
547c93d
Merge branch 'feat/never-drop-data' of https://github.com/PostHog/pos…
raquelmsmith Oct 6, 2023
a0121c4
Merge remote-tracking branch 'origin/master' into feat/never-drop-data
frankh Oct 9, 2023
4731e30
fix migration dependency
frankh Oct 9, 2023
a07086d
Remove dup migration
frankh Oct 10, 2023
a81bff8
Don't create the never_drop_data manually, create a separate migration
frankh Oct 10, 2023
e25db07
Merge branch 'master' into feat/never-drop-data
raquelmsmith Oct 10, 2023
2df1b2e
reinstate field migration
raquelmsmith Oct 10, 2023
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
20 changes: 12 additions & 8 deletions ee/api/test/__snapshots__/test_organization_resource_access.ambr
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,13 @@
"posthog_organization"."is_member_join_email_enabled",
"posthog_organization"."enforce_2fa",
"posthog_organization"."customer_id",
"posthog_organization"."available_features",
"posthog_organization"."available_product_features",
"posthog_organization"."usage",
"posthog_organization"."never_drop_data",
"posthog_organization"."setup_section_2_completed",
"posthog_organization"."personalization",
"posthog_organization"."domain_whitelist"
"posthog_organization"."domain_whitelist",
"posthog_organization"."available_features"
FROM "posthog_organization"
WHERE "posthog_organization"."id" = '00000000-0000-0000-0000-000000000000'::uuid
LIMIT 21 /*controller='organization_resource_access-list',route='api/organizations/%28%3FP%3Cparent_lookup_organization_id%3E%5B%5E/.%5D%2B%29/resource_access/%3F%24'*/
Expand All @@ -62,12 +63,13 @@
"posthog_organization"."is_member_join_email_enabled",
"posthog_organization"."enforce_2fa",
"posthog_organization"."customer_id",
"posthog_organization"."available_features",
"posthog_organization"."available_product_features",
"posthog_organization"."usage",
"posthog_organization"."never_drop_data",
"posthog_organization"."setup_section_2_completed",
"posthog_organization"."personalization",
"posthog_organization"."domain_whitelist"
"posthog_organization"."domain_whitelist",
"posthog_organization"."available_features"
FROM "posthog_organization"
WHERE "posthog_organization"."id" = '00000000-0000-0000-0000-000000000000'::uuid
LIMIT 21 /*controller='organization_resource_access-list',route='api/organizations/%28%3FP%3Cparent_lookup_organization_id%3E%5B%5E/.%5D%2B%29/resource_access/%3F%24'*/
Expand Down Expand Up @@ -143,12 +145,13 @@
"posthog_organization"."is_member_join_email_enabled",
"posthog_organization"."enforce_2fa",
"posthog_organization"."customer_id",
"posthog_organization"."available_features",
"posthog_organization"."available_product_features",
"posthog_organization"."usage",
"posthog_organization"."never_drop_data",
"posthog_organization"."setup_section_2_completed",
"posthog_organization"."personalization",
"posthog_organization"."domain_whitelist"
"posthog_organization"."domain_whitelist",
"posthog_organization"."available_features"
FROM "posthog_organization"
WHERE "posthog_organization"."id" = '00000000-0000-0000-0000-000000000000'::uuid
LIMIT 21 /*controller='organization_resource_access-list',route='api/organizations/%28%3FP%3Cparent_lookup_organization_id%3E%5B%5E/.%5D%2B%29/resource_access/%3F%24'*/
Expand Down Expand Up @@ -250,12 +253,13 @@
"posthog_organization"."is_member_join_email_enabled",
"posthog_organization"."enforce_2fa",
"posthog_organization"."customer_id",
"posthog_organization"."available_features",
"posthog_organization"."available_product_features",
"posthog_organization"."usage",
"posthog_organization"."never_drop_data",
"posthog_organization"."setup_section_2_completed",
"posthog_organization"."personalization",
"posthog_organization"."domain_whitelist"
"posthog_organization"."domain_whitelist",
"posthog_organization"."available_features"
FROM "posthog_organization"
WHERE "posthog_organization"."id" = '00000000-0000-0000-0000-000000000000'::uuid
LIMIT 21 /*controller='organization_resource_access-list',route='api/organizations/%28%3FP%3Cparent_lookup_organization_id%3E%5B%5E/.%5D%2B%29/resource_access/%3F%24'*/
Expand Down
5 changes: 5 additions & 0 deletions ee/billing/billing_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,11 @@ def update_org_details(self, organization: Organization, billing_status: Billing
organization.available_product_features = data["available_product_features"]
org_modified = True

never_drop_data = data.get("never_drop_data", None)
if never_drop_data != organization.never_drop_data:
organization.never_drop_data = never_drop_data
org_modified = True

if org_modified:
organization.save()

Expand Down
27 changes: 26 additions & 1 deletion ee/billing/quota_limiting.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,28 @@
from typing import Dict, List, Mapping, Optional, Sequence, TypedDict, cast

import dateutil.parser
from django.core.cache import cache
from django.db.models import Q
from django.utils import timezone
from sentry_sdk import capture_exception

from posthog.cache_utils import cache_for
from posthog.email import is_email_available
from posthog.event_usage import report_organization_action
from posthog.models.organization import Organization, OrganizationUsageInfo
from posthog.models.team.team import Team
from posthog.redis import get_client
from posthog.tasks.email import send_over_quota_but_not_dropped_email_to_cs
from posthog.tasks.usage_report import (
convert_team_usage_rows_to_dict,
get_teams_with_billable_event_count_in_period,
get_teams_with_recording_count_in_period,
convert_team_usage_rows_to_dict,
)
from posthog.utils import get_current_day

QUOTA_LIMITER_CACHE_KEY = "@posthog/quota-limits/"
QUOTA_OVERAGE_NO_DROP_EMAILED_CACHE_KEY = "@posthog/quota-overage-no-drop-emailed/"
QUOTA_OVERAGE_NO_DROP_EMAILED_CACHE_TIMEOUT = 60 * 60 * 24 * 7 # 7 days, 604800 seconds


class QuotaResource(Enum):
Expand Down Expand Up @@ -60,6 +65,19 @@ def list_limited_team_tokens(resource: QuotaResource) -> List[str]:
return [x.decode("utf-8") for x in results]


def add_quota_overage_no_drop_cache_item(organization_id: int) -> None:
now = timezone.now()
cache.set(
f"{QUOTA_OVERAGE_NO_DROP_EMAILED_CACHE_KEY}{organization_id}",
now,
timeout=QUOTA_OVERAGE_NO_DROP_EMAILED_CACHE_TIMEOUT,
)
raquelmsmith marked this conversation as resolved.
Show resolved Hide resolved


def get_quota_overage_no_drop_cache_item(organization_id: int) -> bool:
return cache.get(f"{QUOTA_OVERAGE_NO_DROP_EMAILED_CACHE_KEY}{organization_id}", False)


class UsageCounters(TypedDict):
events: int
recordings: int
Expand All @@ -80,6 +98,13 @@ def org_quota_limited_until(organization: Organization, resource: QuotaResource)
is_quota_limited = usage + todays_usage >= limit + OVERAGE_BUFFER[resource]
billing_period_end = round(dateutil.parser.isoparse(organization.usage["period"][1]).timestamp())

if is_quota_limited and organization.never_drop_data:
if not get_quota_overage_no_drop_cache_item(organization.id):
add_quota_overage_no_drop_cache_item(organization.id)
if is_email_available():
send_over_quota_but_not_dropped_email_to_cs.delay(organization.id)
return None

if is_quota_limited and billing_period_end:
return billing_period_end

Expand Down
48 changes: 47 additions & 1 deletion ee/billing/test/test_quota_limiting.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import time
from unittest.mock import patch
from uuid import uuid4


from dateutil.relativedelta import relativedelta
from django.core.cache import cache
from django.utils import timezone
from django.utils.timezone import now
from freezegun import freeze_time
Expand Down Expand Up @@ -185,6 +186,51 @@ def test_org_quota_limited_until(self):
self.organization.usage["recordings"]["usage"] = 1100 # Over limit + buffer
assert org_quota_limited_until(self.organization, QuotaResource.RECORDINGS) == 1612137599

@patch("ee.billing.quota_limiting.is_email_available", return_value=True)
@patch("ee.billing.quota_limiting.send_over_quota_but_not_dropped_email_to_cs.delay")
def test_over_quota_but_not_dropped_org(self, mock_email, mock_is_email_available):
self.organization.usage = None
assert org_quota_limited_until(self.organization, QuotaResource.EVENTS) is None

self.organization.usage = {
"events": {"usage": 100, "limit": 90},
"recordings": {"usage": 100, "limit": 90},
"period": ["2021-01-01T00:00:00Z", "2021-01-31T23:59:59Z"],
}
self.organization.never_drop_data = True

assert org_quota_limited_until(self.organization, QuotaResource.EVENTS) is None
assert org_quota_limited_until(self.organization, QuotaResource.RECORDINGS) is None

mock_is_email_available.assert_called_once()
mock_email.assert_called_once_with(self.organization.id)

self.organization.never_drop_data = False

@patch("ee.billing.quota_limiting.is_email_available", return_value=True)
@patch("ee.billing.quota_limiting.send_over_quota_but_not_dropped_email_to_cs.delay")
def test_over_quota_but_not_dropped_org_already_emailed(self, mock_email, mock_is_email_available):
self.organization.usage = None
assert org_quota_limited_until(self.organization, QuotaResource.EVENTS) is None
cache.set(
f"@posthog/quota-overage-no-drop-emailed/{self.organization.id}", timezone.now(), timeout=60 * 60 * 24 * 7
)

self.organization.usage = {
"events": {"usage": 100, "limit": 90},
"recordings": {"usage": 100, "limit": 90},
"period": ["2021-01-01T00:00:00Z", "2021-01-31T23:59:59Z"],
}
self.organization.never_drop_data = True

assert org_quota_limited_until(self.organization, QuotaResource.EVENTS) is None
assert org_quota_limited_until(self.organization, QuotaResource.RECORDINGS) is None

mock_is_email_available.assert_not_called()
mock_email.assert_not_called()

self.organization.never_drop_data = False

def test_sync_org_quota_limits(self):
with freeze_time("2021-01-01T12:59:59Z"):
other_team = create_team(organization=self.organization)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# name: ClickhouseTestExperimentSecondaryResults.test_basic_secondary_metric_results
'
/* user_id:51 celery:posthog.celery.sync_insight_caching_state */
/* user_id:53 celery:posthog.celery.sync_insight_caching_state */
SELECT team_id,
date_diff('second', max(timestamp), now()) AS age
FROM events
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# name: ClickhouseTestFunnelExperimentResults.test_experiment_flow_with_event_results
'
/* user_id:58 celery:posthog.celery.sync_insight_caching_state */
/* user_id:60 celery:posthog.celery.sync_insight_caching_state */
SELECT team_id,
date_diff('second', max(timestamp), now()) AS age
FROM events
Expand Down Expand Up @@ -138,7 +138,7 @@
---
# name: ClickhouseTestFunnelExperimentResults.test_experiment_flow_with_event_results_and_events_out_of_time_range_timezones
'
/* user_id:59 celery:posthog.celery.sync_insight_caching_state */
/* user_id:61 celery:posthog.celery.sync_insight_caching_state */
SELECT team_id,
date_diff('second', max(timestamp), now()) AS age
FROM events
Expand Down Expand Up @@ -276,7 +276,7 @@
---
# name: ClickhouseTestFunnelExperimentResults.test_experiment_flow_with_event_results_for_three_test_variants
'
/* user_id:61 celery:posthog.celery.sync_insight_caching_state */
/* user_id:63 celery:posthog.celery.sync_insight_caching_state */
SELECT team_id,
date_diff('second', max(timestamp), now()) AS age
FROM events
Expand Down Expand Up @@ -414,7 +414,7 @@
---
# name: ClickhouseTestFunnelExperimentResults.test_experiment_flow_with_event_results_with_hogql_aggregation
'
/* user_id:62 celery:posthog.celery.sync_insight_caching_state */
/* user_id:64 celery:posthog.celery.sync_insight_caching_state */
SELECT team_id,
date_diff('second', max(timestamp), now()) AS age
FROM events
Expand Down Expand Up @@ -552,7 +552,7 @@
---
# name: ClickhouseTestTrendExperimentResults.test_experiment_flow_with_event_results
'
/* user_id:65 celery:posthog.celery.sync_insight_caching_state */
/* user_id:67 celery:posthog.celery.sync_insight_caching_state */
SELECT team_id,
date_diff('second', max(timestamp), now()) AS age
FROM events
Expand Down Expand Up @@ -749,7 +749,7 @@
---
# name: ClickhouseTestTrendExperimentResults.test_experiment_flow_with_event_results_for_three_test_variants
'
/* user_id:66 celery:posthog.celery.sync_insight_caching_state */
/* user_id:68 celery:posthog.celery.sync_insight_caching_state */
SELECT team_id,
date_diff('second', max(timestamp), now()) AS age
FROM events
Expand Down Expand Up @@ -892,7 +892,7 @@
---
# name: ClickhouseTestTrendExperimentResults.test_experiment_flow_with_event_results_out_of_timerange_timezone
'
/* user_id:68 celery:posthog.celery.sync_insight_caching_state */
/* user_id:70 celery:posthog.celery.sync_insight_caching_state */
SELECT team_id,
date_diff('second', max(timestamp), now()) AS age
FROM events
Expand Down Expand Up @@ -1089,7 +1089,7 @@
---
# name: ClickhouseTestTrendExperimentResults.test_experiment_flow_with_event_results_with_hogql_filter
'
/* user_id:70 celery:posthog.celery.sync_insight_caching_state */
/* user_id:72 celery:posthog.celery.sync_insight_caching_state */
SELECT team_id,
date_diff('second', max(timestamp), now()) AS age
FROM events
Expand Down
4 changes: 3 additions & 1 deletion frontend/src/scenes/billing/billingLogic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,9 @@ export const billingLogic = kea<billingLogicType>([
return {
status: 'error',
title: 'Usage limit exceeded',
message: `You have exceeded the usage limit for ${productOverLimit.name}. Please upgrade your plan or data loss may occur.`,
message: `You have exceeded the usage limit for ${productOverLimit.name}. Please ${
productOverLimit.subscribed ? 'increase your billing limit' : 'upgrade your plan'
} or data loss may occur.`,
}
}

Expand Down
2 changes: 1 addition & 1 deletion latest_migrations.manifest
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ contenttypes: 0002_remove_content_type_name
ee: 0015_add_verified_properties
otp_static: 0002_throttling
otp_totp: 0002_auto_20190420_0723
posthog: 0348_alter_datawarehousetable_format
posthog: 0349_organization_never_drop_data
sessions: 0001_initial
social_django: 0010_uid_db_index
two_factor: 0007_auto_20201201_1019
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
30 changes: 18 additions & 12 deletions posthog/api/test/__snapshots__/test_action.ambr
Original file line number Diff line number Diff line change
Expand Up @@ -238,12 +238,13 @@
"posthog_organization"."is_member_join_email_enabled",
"posthog_organization"."enforce_2fa",
"posthog_organization"."customer_id",
"posthog_organization"."available_features",
"posthog_organization"."available_product_features",
"posthog_organization"."usage",
"posthog_organization"."never_drop_data",
"posthog_organization"."setup_section_2_completed",
"posthog_organization"."personalization",
"posthog_organization"."domain_whitelist"
"posthog_organization"."domain_whitelist",
"posthog_organization"."available_features"
FROM "posthog_organizationmembership"
INNER JOIN "posthog_organization" ON ("posthog_organizationmembership"."organization_id" = "posthog_organization"."id")
WHERE "posthog_organizationmembership"."user_id" = 2 /*controller='project_actions-list',route='api/projects/%28%3FP%3Cparent_lookup_team_id%3E%5B%5E/.%5D%2B%29/actions/%3F%24'*/
Expand All @@ -261,12 +262,13 @@
"posthog_organization"."is_member_join_email_enabled",
"posthog_organization"."enforce_2fa",
"posthog_organization"."customer_id",
"posthog_organization"."available_features",
"posthog_organization"."available_product_features",
"posthog_organization"."usage",
"posthog_organization"."never_drop_data",
"posthog_organization"."setup_section_2_completed",
"posthog_organization"."personalization",
"posthog_organization"."domain_whitelist"
"posthog_organization"."domain_whitelist",
"posthog_organization"."available_features"
FROM "posthog_organization"
WHERE "posthog_organization"."id" = '00000000-0000-0000-0000-000000000000'::uuid
LIMIT 21 /*controller='project_actions-list',route='api/projects/%28%3FP%3Cparent_lookup_team_id%3E%5B%5E/.%5D%2B%29/actions/%3F%24'*/
Expand Down Expand Up @@ -366,12 +368,13 @@
"posthog_organization"."is_member_join_email_enabled",
"posthog_organization"."enforce_2fa",
"posthog_organization"."customer_id",
"posthog_organization"."available_features",
"posthog_organization"."available_product_features",
"posthog_organization"."usage",
"posthog_organization"."never_drop_data",
"posthog_organization"."setup_section_2_completed",
"posthog_organization"."personalization",
"posthog_organization"."domain_whitelist"
"posthog_organization"."domain_whitelist",
"posthog_organization"."available_features"
FROM "posthog_organizationmembership"
INNER JOIN "posthog_organization" ON ("posthog_organizationmembership"."organization_id" = "posthog_organization"."id")
WHERE "posthog_organizationmembership"."user_id" = 2 /*controller='project_actions-list',route='api/projects/%28%3FP%3Cparent_lookup_team_id%3E%5B%5E/.%5D%2B%29/actions/%3F%24'*/
Expand Down Expand Up @@ -400,12 +403,13 @@
"posthog_organization"."is_member_join_email_enabled",
"posthog_organization"."enforce_2fa",
"posthog_organization"."customer_id",
"posthog_organization"."available_features",
"posthog_organization"."available_product_features",
"posthog_organization"."usage",
"posthog_organization"."never_drop_data",
"posthog_organization"."setup_section_2_completed",
"posthog_organization"."personalization",
"posthog_organization"."domain_whitelist"
"posthog_organization"."domain_whitelist",
"posthog_organization"."available_features"
FROM "posthog_organization"
WHERE "posthog_organization"."id" = '00000000-0000-0000-0000-000000000000'::uuid
LIMIT 21 /*controller='project_actions-list',route='api/projects/%28%3FP%3Cparent_lookup_team_id%3E%5B%5E/.%5D%2B%29/actions/%3F%24'*/
Expand Down Expand Up @@ -554,12 +558,13 @@
"posthog_organization"."is_member_join_email_enabled",
"posthog_organization"."enforce_2fa",
"posthog_organization"."customer_id",
"posthog_organization"."available_features",
"posthog_organization"."available_product_features",
"posthog_organization"."usage",
"posthog_organization"."never_drop_data",
"posthog_organization"."setup_section_2_completed",
"posthog_organization"."personalization",
"posthog_organization"."domain_whitelist"
"posthog_organization"."domain_whitelist",
"posthog_organization"."available_features"
FROM "posthog_organizationmembership"
INNER JOIN "posthog_organization" ON ("posthog_organizationmembership"."organization_id" = "posthog_organization"."id")
WHERE "posthog_organizationmembership"."user_id" = 2 /*controller='project_actions-list',route='api/projects/%28%3FP%3Cparent_lookup_team_id%3E%5B%5E/.%5D%2B%29/actions/%3F%24'*/
Expand All @@ -577,12 +582,13 @@
"posthog_organization"."is_member_join_email_enabled",
"posthog_organization"."enforce_2fa",
"posthog_organization"."customer_id",
"posthog_organization"."available_features",
"posthog_organization"."available_product_features",
"posthog_organization"."usage",
"posthog_organization"."never_drop_data",
"posthog_organization"."setup_section_2_completed",
"posthog_organization"."personalization",
"posthog_organization"."domain_whitelist"
"posthog_organization"."domain_whitelist",
"posthog_organization"."available_features"
FROM "posthog_organization"
WHERE "posthog_organization"."id" = '00000000-0000-0000-0000-000000000000'::uuid
LIMIT 21 /*controller='project_actions-list',route='api/projects/%28%3FP%3Cparent_lookup_team_id%3E%5B%5E/.%5D%2B%29/actions/%3F%24'*/
Expand Down
Loading
Loading