diff --git a/contrib/env-sample b/contrib/env-sample index c3f8c9021..70105239f 100644 --- a/contrib/env-sample +++ b/contrib/env-sample @@ -13,8 +13,7 @@ PAGARME_CRYPTO_KEY= CHAVE_PAGARME_CRIPTOGRAFIA_PUBLICA=ak_test_6yd4kbaJrWzdn61m4De5yzn7jZuTt9 CHAVE_PAGARME_API_PRIVADA= -POSTHOG_API_URL= -POSTHOG_API_KEY= + # Memberkit integation MEMBERKIT_API_KEY= diff --git a/pythonpro/analytics/admin.py b/pythonpro/analytics/admin.py deleted file mode 100644 index 15710d674..000000000 --- a/pythonpro/analytics/admin.py +++ /dev/null @@ -1,26 +0,0 @@ -from django.contrib import admin - -from pythonpro.analytics.models import PageView - - -@admin.register(PageView) -class PageViewAdmin(admin.ModelAdmin): - def get_session_user(self, obj, *args, **kwargs): - return obj.session.user - - def get_path(self, obj, *args, **kwargs): - return obj.meta.get('PATH_INFO') - - def has_delete_permission(self, request, obj=None): - return False - - def has_change_permission(self, request, obj=None): - return False - - def has_add_permission(self, request, obj=None): - return False - - get_session_user.short_description = 'Usuário' - get_path.short_description = 'Destino' - list_display = ['id', 'get_path', 'session', 'get_session_user', 'created'] - search_fields = ['session__user__email'] diff --git a/pythonpro/analytics/apps.py b/pythonpro/analytics/apps.py index d18ffeff9..f173d36bf 100644 --- a/pythonpro/analytics/apps.py +++ b/pythonpro/analytics/apps.py @@ -1,12 +1,6 @@ -import posthog from django.apps import AppConfig -from django.conf import settings class AnalyticsConfig(AppConfig): name = 'pythonpro.analytics' verbose_name = 'Analytics' - - def ready(self): - posthog.api_key = settings.POSTHOG_API_KEY - posthog.api_host = settings.POSTHOG_API_URL diff --git a/pythonpro/analytics/context_processors.py b/pythonpro/analytics/context_processors.py deleted file mode 100644 index bc89070bf..000000000 --- a/pythonpro/analytics/context_processors.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.conf import settings - - -def posthog_configurations(request): - return { - 'POSTHOG_API_KEY': settings.POSTHOG_API_KEY, - 'POSTHOG_API_URL': settings.POSTHOG_API_URL, - } diff --git a/pythonpro/analytics/facade.py b/pythonpro/analytics/facade.py deleted file mode 100644 index b1692cbcf..000000000 --- a/pythonpro/analytics/facade.py +++ /dev/null @@ -1,69 +0,0 @@ -import json -import logging - -import posthog -from django.conf import settings - -from pythonpro.analytics.models import UserSession, PageView - - -def _create_session(request): - user = request.user if not request.user.is_anonymous else None - return UserSession.objects.create(user=user) - - -def _mount_session_dict(session): - return {'id': session.id, 'uuid': str(session.uuid)} - - -def _associate_logged_user_to_session(session_id, user): - session = UserSession.objects.get(id=session_id) - if not user.is_anonymous and session.user is None: - session.user = user - session.save() - - -def _setup_analytics_object(request): - analytics = request.session.get('analytics') - if analytics is None: - session = _create_session(request) - analytics = _mount_session_dict(session) - - _associate_logged_user_to_session(analytics['id'], request.user) - return analytics - - -def get_or_create_session(request): - request.session['analytics'] = _setup_analytics_object(request) - return request - - -def _get_serialized_meta(meta): - class ComplexEncoder(json.JSONEncoder): - def default(self, obj): - try: - return json.JSONEncoder.default(self, obj) - except TypeError: - return None - - return json.loads(json.dumps(meta, cls=ComplexEncoder)) - - -def _should_create_pageview(url): - return url.startswith('/admin') is False - - -def create_pageview(request): - url = request.META.get('PATH_INFO') or '' - if _should_create_pageview(url): - user_session_id = request.session['analytics']['id'] - PageView.objects.create(session_id=user_session_id, - meta=_get_serialized_meta(request.META)) - - -def posthog_alias(session_id, email): - if settings.POSTHOG_API_KEY and settings.POSTHOG_API_URL: - posthog.alias(session_id, email) - else: - logger = logging.getLogger(__name__) - logger.info(f'The value of session_id is {session_id} and email is {email}') diff --git a/pythonpro/analytics/middleware.py b/pythonpro/analytics/middleware.py deleted file mode 100644 index f97f0f3a3..000000000 --- a/pythonpro/analytics/middleware.py +++ /dev/null @@ -1,13 +0,0 @@ -from django.utils.deprecation import MiddlewareMixin - -from pythonpro.analytics.facade import get_or_create_session, create_pageview - - -class AnalyticsMiddleware(MiddlewareMixin): - def __init__(self, get_response): - self.get_response = get_response - - def __call__(self, request): - request = get_or_create_session(request) - create_pageview(request) - return self.get_response(request) diff --git a/pythonpro/analytics/migrations/0003_remove_usersession_user_delete_pageview_and_more.py b/pythonpro/analytics/migrations/0003_remove_usersession_user_delete_pageview_and_more.py new file mode 100644 index 000000000..fa094bd21 --- /dev/null +++ b/pythonpro/analytics/migrations/0003_remove_usersession_user_delete_pageview_and_more.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.1 on 2023-05-03 23:23 + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ('analytics', '0002_auto_20201007_1518'), + ] + + operations = [ + migrations.RemoveField( + model_name='usersession', + name='user', + ), + migrations.DeleteModel( + name='PageView', + ), + migrations.DeleteModel( + name='UserSession', + ), + ] diff --git a/pythonpro/analytics/models.py b/pythonpro/analytics/models.py index 910cd1b62..e69de29bb 100644 --- a/pythonpro/analytics/models.py +++ b/pythonpro/analytics/models.py @@ -1,42 +0,0 @@ -import uuid - -from django.utils import timezone -from django.db import models -from django.db.models import JSONField - -from pythonpro.core.models import User - - -class BaseModel(models.Model): - class Meta: - abstract = True - - created = models.DateTimeField('Criado em', default=timezone.now) - updated = models.DateTimeField('Alterado em', auto_now=True) - - -class UserSession(BaseModel): - class Meta: - verbose_name = 'sessão' - verbose_name_plural = 'sessões' - - uuid = models.UUIDField(default=uuid.uuid4, editable=False) - user = models.ForeignKey(User, - on_delete=models.SET_NULL, - null=True, - blank=True) - - def __str__(self): - return str(self.uuid) - - -class PageView(BaseModel): - class Meta: - verbose_name = 'page view' - verbose_name_plural = 'page views' - - session = models.ForeignKey(UserSession, - verbose_name='sessão', - on_delete=models.SET_NULL, - null=True) - meta = JSONField() diff --git a/pythonpro/analytics/tests/__init__.py b/pythonpro/analytics/tests/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/pythonpro/analytics/tests/conftest.py b/pythonpro/analytics/tests/conftest.py deleted file mode 100644 index eb82d0258..000000000 --- a/pythonpro/analytics/tests/conftest.py +++ /dev/null @@ -1,60 +0,0 @@ -import pytest - -from model_bakery import baker - -from django.contrib.auth.models import AnonymousUser -from django.contrib.sessions.middleware import SessionMiddleware -from django.test import RequestFactory - - -@pytest.fixture -def pre_request(): - factory = RequestFactory() - request = factory.get('/') - request.user = AnonymousUser() - return request - - -def dummy_get_response(request): - return None - - -def _get_request_with_session_setted(pre_request): - middleware = SessionMiddleware(dummy_get_response) - middleware.process_request(pre_request) - pre_request.session.save() - return pre_request - - -@pytest.fixture -def mocked_request(pre_request): - return _get_request_with_session_setted(pre_request) - - -@pytest.fixture -def mocked_request_2(pre_request): - return _get_request_with_session_setted(pre_request) - - -@pytest.fixture -def mocked_request_logged(pre_request, logged_user): - pre_request.user = logged_user - middleware = SessionMiddleware(dummy_get_response) - middleware.process_request(pre_request) - pre_request.session.save() - - return pre_request - - -@pytest.fixture -def user_session(logged_user): - return baker.make('UserSession', user=logged_user) - - -@pytest.fixture -def mocked_request_with_analytics(mocked_request, user_session): - mocked_request.session['analytics'] = { - 'id': user_session.id, - 'uuid': str(user_session.uuid) - } - return mocked_request diff --git a/pythonpro/analytics/tests/facade/__init__.py b/pythonpro/analytics/tests/facade/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/pythonpro/analytics/tests/facade/test_create_pageview.py b/pythonpro/analytics/tests/facade/test_create_pageview.py deleted file mode 100644 index b2b2e41cc..000000000 --- a/pythonpro/analytics/tests/facade/test_create_pageview.py +++ /dev/null @@ -1,46 +0,0 @@ -import pytest - -from pythonpro.analytics.facade import create_pageview, _should_create_pageview -from pythonpro.analytics.models import PageView - - -@pytest.fixture -def create_pageview_executed(mocked_request_with_analytics): - return create_pageview(mocked_request_with_analytics) - - -@pytest.mark.django_db -def test_should_create_pageview_on_database(create_pageview_executed): - assert PageView.objects.all().count() == 1 - - -@pytest.mark.django_db -def test_should_create_meta_field_as_dict(create_pageview_executed): - assert isinstance(PageView.objects.get().meta, dict) - - -@pytest.fixture -def create_pageview_executed_2(mocked_request_with_analytics): - return create_pageview(mocked_request_with_analytics) - - -@pytest.mark.django_db -def test_should_create_pageview_for_each_request(create_pageview_executed, - create_pageview_executed_2): - assert PageView.objects.all().count() == 2 - - -def test_should_ignore_all_urls_that_starts_with_admin(): - assert _should_create_pageview('/curso-gratis-de-python') is True - assert _should_create_pageview('/admin/analytics/pageview') is False - assert _should_create_pageview('/admin') is False - - -@pytest.mark.django_db -def test_should_call_should_create_pageview_function( - mocked_request_with_analytics, mocker): - mocked = mocker.patch('pythonpro.analytics.facade._should_create_pageview', - return_value=True) - - create_pageview(mocked_request_with_analytics) - assert mocked.called diff --git a/pythonpro/analytics/tests/facade/test_get_or_create_session.py b/pythonpro/analytics/tests/facade/test_get_or_create_session.py deleted file mode 100644 index 0e4319aa6..000000000 --- a/pythonpro/analytics/tests/facade/test_get_or_create_session.py +++ /dev/null @@ -1,68 +0,0 @@ -import pytest - -from pythonpro.analytics.facade import get_or_create_session -from pythonpro.analytics.models import UserSession - - -@pytest.fixture -def request_created_in_fixture(mocked_request): - return get_or_create_session(mocked_request) - - -@pytest.mark.django_db -def test_should_create_session(request_created_in_fixture): - assert 'analytics' in request_created_in_fixture.session - - -@pytest.mark.django_db -def test_should_create_an_usersession_on_database(request_created_in_fixture): - session = UserSession.objects.get() - assert request_created_in_fixture.session['analytics'] == { - 'id': session.id, - 'uuid': str(session.uuid) - } - - -@pytest.mark.django_db -def test_should_not_assert_any_user_when_has_no_logged_in( - request_created_in_fixture): - assert UserSession.objects.get().user is None - - -@pytest.mark.django_db -def test_should_create_only_one_usersession_per_session(mocked_request): - request1 = get_or_create_session(mocked_request) - request2 = get_or_create_session(mocked_request) - assert request1.session['analytics'] == request2.session['analytics'] - - -@pytest.fixture -def new_request_created_in_fixture(mocked_request_2): - return get_or_create_session(mocked_request_2) - - -@pytest.mark.django_db -def test_should_create_two_sessions_for_each_different_visitors( - new_request_created_in_fixture, request_created_in_fixture): - assert UserSession.objects.all().count() == 2 - - -@pytest.fixture -def request_created_in_fixture_with_logged_user(mocked_request_logged): - return get_or_create_session(mocked_request_logged) - - -@pytest.mark.django_db -def test_should_associate_logged_user_to_a_new_usersession( - logged_user, request_created_in_fixture_with_logged_user): - assert UserSession.objects.get().user == logged_user - - -@pytest.mark.django_db -def test_should_associate_logged_user_to_a_existing_usersession( - mocked_request, logged_user): - request = get_or_create_session(mocked_request) - request.user = logged_user - get_or_create_session(request) - - assert UserSession.objects.get().user == logged_user diff --git a/pythonpro/analytics/tests/test_models.py b/pythonpro/analytics/tests/test_models.py deleted file mode 100644 index 828b685c3..000000000 --- a/pythonpro/analytics/tests/test_models.py +++ /dev/null @@ -1,13 +0,0 @@ -import pytest - -from model_bakery import baker - - -@pytest.mark.django_db -def test_should_exists_session_model(): - assert baker.make('UserSession') - - -@pytest.mark.django_db -def test_should_exists_page_view_model(): - assert baker.make('PageView', meta={'name': 'Renzo'}) diff --git a/pythonpro/settings.py b/pythonpro/settings.py index 39dce241a..625d39df3 100644 --- a/pythonpro/settings.py +++ b/pythonpro/settings.py @@ -151,7 +151,6 @@ 'django.contrib.messages.context_processors.messages', 'pythonpro.core.context_processors.global_settings', 'pythonpro.modules.context_processors.global_settings', - 'pythonpro.analytics.context_processors.posthog_configurations', ], }, }, @@ -328,9 +327,6 @@ # Hotzapp configuration HOTZAPP_API_URL = config('HOTZAPP_API_URL') -# PostHog configuration -POSTHOG_API_URL = config('POSTHOG_API_URL') -POSTHOG_API_KEY = config('POSTHOG_API_KEY') # needed to allow iframes in pixeling system X_FRAME_OPTIONS = 'ALLOWALL'