From 1ebc8d52a0e91d43b251055d4f293004dd232b16 Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Mon, 1 Jun 2026 17:10:40 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=88(backend)=20capture=20an=20event=20?= =?UTF-8?q?when=20a=20document=20is=20left?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a user leave a document, we want to capture an event. --- src/backend/core/api/viewsets.py | 2 + .../documents/test_api_documents_leave.py | 58 +++++++++++++++++-- src/backend/core/utils/analytics.py | 1 + 3 files changed, 56 insertions(+), 5 deletions(-) diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index 0ee3c4269..d62181ae2 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -2602,6 +2602,8 @@ class DocumentViewSet( ) raise + posthog_capture(PosthogEventName.DOC_LEFT, request.user, {}, document=document) + return drf.response.Response(status=drf.status.HTTP_204_NO_CONTENT) diff --git a/src/backend/core/tests/documents/test_api_documents_leave.py b/src/backend/core/tests/documents/test_api_documents_leave.py index 82c0eded4..4f9144bd5 100644 --- a/src/backend/core/tests/documents/test_api_documents_leave.py +++ b/src/backend/core/tests/documents/test_api_documents_leave.py @@ -1,10 +1,13 @@ """Test for the leave document API""" +from unittest import mock + import pytest from rest_framework import status from rest_framework.test import APIClient from core import factories, models +from core.utils.analytics import PosthogEventName pytestmark = pytest.mark.django_db @@ -83,10 +86,19 @@ def test_api_documents_leave_connected_user_with_link_trace(link_reach): client = APIClient() client.force_login(user) - response = client.post(f"/api/v1.0/documents/{document.id!s}/leave/") + with mock.patch("core.api.viewsets.posthog_capture") as mock_capture: + response = client.post(f"/api/v1.0/documents/{document.id!s}/leave/") assert response.status_code == status.HTTP_204_NO_CONTENT + # Leaving the document should be tracked in PostHog + mock_capture.assert_called_once_with( + PosthogEventName.DOC_LEFT, + user, + {}, + document=document, + ) + assert not models.LinkTrace.objects.filter(document=document, user=user).exists() assert models.LinkTrace.objects.count() == 3 assert models.DocumentAccess.objects.count() == 4 @@ -116,10 +128,19 @@ def test_api_documents_leave_connected_user_with_access(role, link_reach): client = APIClient() client.force_login(user) - response = client.post(f"/api/v1.0/documents/{document.id!s}/leave/") + with mock.patch("core.api.viewsets.posthog_capture") as mock_capture: + response = client.post(f"/api/v1.0/documents/{document.id!s}/leave/") assert response.status_code == status.HTTP_204_NO_CONTENT + # Leaving the document should be tracked in PostHog + mock_capture.assert_called_once_with( + PosthogEventName.DOC_LEFT, + user, + {}, + document=document, + ) + assert not models.DocumentAccess.objects.filter( document=document, user=user ).exists() @@ -189,10 +210,19 @@ def test_api_documents_leave_connected_user_with_access_and_link_trace( client = APIClient() client.force_login(user) - response = client.post(f"/api/v1.0/documents/{document.id!s}/leave/") + with mock.patch("core.api.viewsets.posthog_capture") as mock_capture: + response = client.post(f"/api/v1.0/documents/{document.id!s}/leave/") assert response.status_code == status.HTTP_204_NO_CONTENT + # Leaving the document should be tracked in PostHog + mock_capture.assert_called_once_with( + PosthogEventName.DOC_LEFT, + user, + {}, + document=document, + ) + assert not models.DocumentAccess.objects.filter( document=document, user=user ).exists() @@ -231,10 +261,19 @@ def test_api_documents_leave_connected_accessing_multiple_documents_leave_only_o client = APIClient() client.force_login(user) - response = client.post(f"/api/v1.0/documents/{document.id!s}/leave/") + with mock.patch("core.api.viewsets.posthog_capture") as mock_capture: + response = client.post(f"/api/v1.0/documents/{document.id!s}/leave/") assert response.status_code == status.HTTP_204_NO_CONTENT + # Leaving the document should be tracked in PostHog + mock_capture.assert_called_once_with( + PosthogEventName.DOC_LEFT, + user, + {}, + document=document, + ) + assert not models.DocumentAccess.objects.filter( document=document, user=user ).exists() @@ -281,10 +320,19 @@ def test_api_documents_leave_connected_leave_also_sub_documents(role, link_reach client = APIClient() client.force_login(user) - response = client.post(f"/api/v1.0/documents/{document.id!s}/leave/") + with mock.patch("core.api.viewsets.posthog_capture") as mock_capture: + response = client.post(f"/api/v1.0/documents/{document.id!s}/leave/") assert response.status_code == status.HTTP_204_NO_CONTENT + # Leaving the document should be tracked in PostHog + mock_capture.assert_called_once_with( + PosthogEventName.DOC_LEFT, + user, + {}, + document=document, + ) + assert not models.DocumentAccess.objects.filter( document=document, user=user ).exists() diff --git a/src/backend/core/utils/analytics.py b/src/backend/core/utils/analytics.py index b65460eb3..b4b6c2d54 100644 --- a/src/backend/core/utils/analytics.py +++ b/src/backend/core/utils/analytics.py @@ -22,6 +22,7 @@ class PosthogEventName(StrEnum): DOC_FAVORITED = "doc_favorited" DOC_AI_ACTION = "doc_ai_action" DOC_MOVED = "doc_moved" + DOC_LEFT = "doc_left" # DocumentAccess DOC_ACCESS_CREATED = "doc_access_created"