diff --git a/enterprise/Dockerfile b/enterprise/Dockerfile index 4264258d09..65440cc2a4 100644 --- a/enterprise/Dockerfile +++ b/enterprise/Dockerfile @@ -24,7 +24,7 @@ RUN apt-get update && \ rm -rf /var/lib/apt/lists/* # Install Python packages with security fixes -RUN pip install alembic psycopg2-binary cloud-sql-python-connector pg8000 gspread stripe python-keycloak asyncpg sqlalchemy[asyncio] resend tenacity slack-sdk ddtrace posthog "limits==5.2.0" coredis prometheus-client shap scikit-learn pandas numpy && \ +RUN pip install alembic psycopg2-binary cloud-sql-python-connector pg8000 gspread stripe python-keycloak asyncpg sqlalchemy[asyncio] resend tenacity slack-sdk ddtrace "posthog>=6.0.0" "limits==5.2.0" coredis prometheus-client shap scikit-learn pandas numpy && \ # Update packages with known CVE fixes pip install --upgrade \ "mcp>=1.10.0" \ diff --git a/enterprise/poetry.lock b/enterprise/poetry.lock index b4b48a27a6..87d423e642 100644 --- a/enterprise/poetry.lock +++ b/enterprise/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "aiofiles" @@ -1061,7 +1061,7 @@ files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "platform_system == \"Windows\" or os_name == \"nt\" or sys_platform == \"win32\"", dev = "os_name == \"nt\"", test = "platform_system == \"Windows\" or sys_platform == \"win32\""} +markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\" or os_name == \"nt\"", dev = "os_name == \"nt\"", test = "platform_system == \"Windows\" or sys_platform == \"win32\""} [[package]] name = "comm" @@ -1990,6 +1990,7 @@ files = [ {file = "fastuuid-0.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9b31dd488d0778c36f8279b306dc92a42f16904cba54acca71e107d65b60b0c"}, {file = "fastuuid-0.12.0-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:b19361ee649365eefc717ec08005972d3d1eb9ee39908022d98e3bfa9da59e37"}, {file = "fastuuid-0.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:8fc66b11423e6f3e1937385f655bedd67aebe56a3dcec0cb835351cfe7d358c9"}, + {file = "fastuuid-0.12.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:2925f67b88d47cb16aa3eb1ab20fdcf21b94d74490e0818c91ea41434b987493"}, {file = "fastuuid-0.12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7b15c54d300279ab20a9cc0579ada9c9f80d1bc92997fc61fb7bf3103d7cb26b"}, {file = "fastuuid-0.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:458f1bc3ebbd76fdb89ad83e6b81ccd3b2a99fa6707cd3650b27606745cfb170"}, {file = "fastuuid-0.12.0-cp38-cp38-manylinux_2_34_x86_64.whl", hash = "sha256:a8f0f83fbba6dc44271a11b22e15838641b8c45612cdf541b4822a5930f6893c"}, @@ -6112,14 +6113,14 @@ files = [ [[package]] name = "posthog" -version = "4.10.0" +version = "6.7.6" description = "Integrate PostHog into any python application." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "posthog-4.10.0-py3-none-any.whl", hash = "sha256:b693d3d8209d000d8c5f4d6ea19096bfdfb83047fa8a14c937ae50a3394809a1"}, - {file = "posthog-4.10.0.tar.gz", hash = "sha256:513bfbb21344013294abc046b1142173189c5422a3906cf2280d1389b0c2e28b"}, + {file = "posthog-6.7.6-py3-none-any.whl", hash = "sha256:b09a7e65a042ec416c28874b397d3accae412a80a8b0ef3fa686fbffc99e4d4b"}, + {file = "posthog-6.7.6.tar.gz", hash = "sha256:ee5c5ad04b857d96d9b7a4f715e23916a2f206bfcf25e5a9d328a3d27664b0d3"}, ] [package.dependencies] @@ -6128,11 +6129,11 @@ distro = ">=1.5.0" python-dateutil = ">=2.2" requests = ">=2.7,<3.0" six = ">=1.5" +typing-extensions = ">=4.2.0" [package.extras] dev = ["django-stubs", "lxml", "mypy", "mypy-baseline", "packaging", "pre-commit", "pydantic", "ruff", "setuptools", "tomli", "tomli_w", "twine", "types-mock", "types-python-dateutil", "types-requests", "types-setuptools", "types-six", "wheel"] langchain = ["langchain (>=0.2.0)"] -sentry = ["django", "sentry-sdk"] test = ["anthropic", "coverage", "django", "freezegun (==1.5.1)", "google-genai", "langchain-anthropic (>=0.3.15)", "langchain-community (>=0.3.25)", "langchain-core (>=0.3.65)", "langchain-openai (>=0.3.22)", "langgraph (>=0.4.8)", "mock (>=2.0.0)", "openai", "parameterized (>=0.8.1)", "pydantic", "pytest", "pytest-asyncio", "pytest-timeout"] [[package]] @@ -10102,4 +10103,4 @@ cffi = ["cffi (>=1.17) ; python_version >= \"3.13\" and platform_python_implemen [metadata] lock-version = "2.1" python-versions = "^3.12,<3.14" -content-hash = "8c460070dce6bdec5ee0ee7bc0c2246fcf2602d1e64a0867b4f5e3a0e334fe93" +content-hash = "fac67a8991a3e2c840a23702dc90f99e98d381f3537ad50b4c4739cdbde941ca" diff --git a/enterprise/pyproject.toml b/enterprise/pyproject.toml index 2fffec2b7d..30c0630747 100644 --- a/enterprise/pyproject.toml +++ b/enterprise/pyproject.toml @@ -38,7 +38,7 @@ resend = "^2.7.0" tenacity = "^9.1.2" slack-sdk = "^3.35.0" ddtrace = "3.13.0" #pin to avoid yanked version 3.12.4 -posthog = "^4.2.0" +posthog = "^6.0.0" limits = "^5.2.0" coredis = "^4.22.0" httpx = "*" diff --git a/enterprise/server/routes/auth.py b/enterprise/server/routes/auth.py index 08c33c5907..5355f150a9 100644 --- a/enterprise/server/routes/auth.py +++ b/enterprise/server/routes/auth.py @@ -174,19 +174,17 @@ async def keycloak_callback( posthog_user_id = f'FEATURE_{user_id}' if IS_FEATURE_ENV else user_id try: - posthog.identify( - posthog_user_id, - { - '$set': { - 'user_id': posthog_user_id, # Explicitly set as property - 'original_user_id': user_id, # Store the original user_id - 'is_feature_env': IS_FEATURE_ENV, # Track if this is a feature environment - } + posthog.set( + distinct_id=posthog_user_id, + properties={ + 'user_id': posthog_user_id, + 'original_user_id': user_id, + 'is_feature_env': IS_FEATURE_ENV, }, ) except Exception as e: logger.error( - 'auth:posthog_identify:failed', + 'auth:posthog_set:failed', extra={ 'user_id': user_id, 'error': str(e), diff --git a/enterprise/tests/unit/test_auth_routes.py b/enterprise/tests/unit/test_auth_routes.py index 17967183bf..bf74f0055c 100644 --- a/enterprise/tests/unit/test_auth_routes.py +++ b/enterprise/tests/unit/test_auth_routes.py @@ -211,7 +211,7 @@ async def test_keycloak_callback_success_with_valid_offline_token(mock_request): secure=False, accepted_tos=True, ) - mock_posthog.identify.assert_called_once() + mock_posthog.set.assert_called_once() @pytest.mark.asyncio @@ -278,7 +278,7 @@ async def test_keycloak_callback_success_without_offline_token(mock_request): secure=False, accepted_tos=True, ) - mock_posthog.identify.assert_called_once() + mock_posthog.set.assert_called_once() @pytest.mark.asyncio