From 5f293f2fafca1c62d78d08bdd9268a1f68bdd74e Mon Sep 17 00:00:00 2001 From: Ian Stride Date: Tue, 21 May 2024 12:18:05 +0100 Subject: [PATCH] Remove Google Analytics features (#1697) --- home/models.py | 30 ++-- home/templatetags/generic_components.py | 45 ------ home/test.py | 141 +++++------------- iogt/middleware.py | 13 -- iogt/settings/base.py | 2 - iogt/templates/base.html | 2 - .../google_analytics_pixel_tracking.html | 11 -- .../google_analytics_tag_manager.html | 22 --- iogt/templates/sw.js | 11 +- iogt/urls.py | 1 - requirements.dev.txt | 91 +---------- requirements.in | 1 - requirements.txt | 71 +-------- 13 files changed, 46 insertions(+), 395 deletions(-) delete mode 100644 iogt/templates/google_analytics_pixel_tracking.html delete mode 100644 iogt/templates/google_analytics_tag_manager.html diff --git a/home/models.py b/home/models.py index 420846395..b3cd0c413 100644 --- a/home/models.py +++ b/home/models.py @@ -630,7 +630,6 @@ class SiteSettings(BaseSetting): help_text=_('When selecting this option, untranslated pages' ' will not be visible to the front end user' ' when viewing a child language of the site')) - # TODO: GA, FB analytics should be global. fb_analytics_app_id = models.CharField( verbose_name=_('Facebook Analytics App ID'), max_length=25, @@ -639,6 +638,10 @@ class SiteSettings(BaseSetting): help_text=_( "The tracking ID to be used to view Facebook Analytics") ) + + # Begin GA settings + # These are now obsolete and should be removed once it is deemed safe for these + # fields to be removed. local_ga_tag_manager = models.CharField( verbose_name=_('Local GA Tag Manager'), max_length=255, @@ -675,6 +678,8 @@ class SiteSettings(BaseSetting): "Global GA tracking code to be used" " to view analytics on more than one site globally") ) + # End GA settings + social_media_link = StreamField( [('social_media_link', SocialMediaLinkBlock())], null=True, @@ -691,7 +696,10 @@ class SiteSettings(BaseSetting): registration_survey = models.ForeignKey('questionnaires.Survey', null=True, blank=True, on_delete=models.SET_NULL) + + # Obsolete - Web Light service discontinued Dec 2022 opt_in_to_google_web_light = models.BooleanField(default=False) + mtm_container_id = models.CharField( verbose_name=_("Matomo Tag Manager container ID"), max_length=255, @@ -719,20 +727,6 @@ class SiteSettings(BaseSetting): ], heading="Facebook Analytics Settings", ), - MultiFieldPanel( - [ - FieldPanel('local_ga_tag_manager'), - FieldPanel('global_ga_tag_manager'), - ], - heading="GA Tag Manager Settings", - ), - MultiFieldPanel( - [ - FieldPanel('local_ga_tracking_code'), - FieldPanel('global_ga_tracking_code'), - ], - heading="GA Tracking Code Settings", - ), MultiFieldPanel( [ MultiFieldPanel( @@ -769,12 +763,6 @@ class SiteSettings(BaseSetting): ], heading="Registration Settings", ), - MultiFieldPanel( - [ - FieldPanel('opt_in_to_google_web_light'), - ], - heading="Opt in to Google web light", - ), MultiFieldPanel( [ FieldPanel( diff --git a/home/templatetags/generic_components.py b/home/templatetags/generic_components.py index 7f261ff33..4b8a4be9e 100644 --- a/home/templatetags/generic_components.py +++ b/home/templatetags/generic_components.py @@ -3,7 +3,6 @@ from django import template from django.conf import settings from django.urls import reverse -from google_analytics import CAMPAIGN_TRACKING_PARAMS import iogt.iogt_globals as globals_ @@ -83,47 +82,3 @@ def language_picker_style(): theme_settings = globals_.theme_settings return f"color:{theme_settings.language_picker_font_color};background-color:" \ f"{theme_settings.language_picker_background_color}" - - -@register.simple_tag(takes_context=True) -def google_analytics(context, tracking_code=None, debug=False): - if not tracking_code: - try: - assert settings.GOOGLE_ANALYTICS['google_analytics_id'] - except KeyError: - return '' - # attempt get the request from the context - request = context.get('request', None) - if request is None: - raise RuntimeError("Request context required") - # intialise the parameters collection - params = {} - # collect the campaign tracking parameters from the request - for param in CAMPAIGN_TRACKING_PARAMS.values(): - value = request.GET.get(param, None) - if value: - params[param] = value - # pass on the referer if present - referer = request.META.get('HTTP_REFERER', None) - if referer: - params['r'] = referer - # remove collected parameters from the path and pass it on - path = request.get_full_path() - parsed_url = urlparse(path) - query = parse_qs(parsed_url.query, keep_blank_values=True) - for param in params: - if param in query: - del query[param] - query = urlencode(query, doseq=True) - new_url = parsed_url._replace(query=query) - params['p'] = new_url.geturl() - params['tracking_code'] = tracking_code or settings.GOOGLE_ANALYTICS[ - 'google_analytics_id'] - # append the debug parameter if requested - if debug: - params['utmdebug'] = 1 - # build and return the url - url = reverse('google-analytics') - if params: - url += '?&' + urlencode(params) - return url diff --git a/home/test.py b/home/test.py index 59a0d600c..85a6cf9e1 100644 --- a/home/test.py +++ b/home/test.py @@ -1,19 +1,16 @@ -from urllib.parse import parse_qs +from unittest.mock import patch from django.conf import settings from django.db.utils import IntegrityError -from django.template import Context -from django.test import TestCase, RequestFactory +from django.test import TestCase from django.urls import reverse +from iogt_users.factories import GroupFactory, UserFactory from rest_framework import status from wagtail.models import PageViewRestriction, Site -from unittest.mock import patch +from wagtail_factories import SiteFactory -from home.models import SVGToPNGMap -from home.templatetags.generic_components import google_analytics -from iogt_users.factories import UserFactory, GroupFactory from home.factories import ArticleFactory, HomePageFactory -from wagtail_factories import SiteFactory +from home.models import SVGToPNGMap class PageViewGroupPermissionTests(TestCase): @@ -21,30 +18,34 @@ def setUp(self): self.user = UserFactory() Site.objects.all().delete() - self.site = SiteFactory(site_name='IoGT', port=8000, is_default_site=True) + self.site = SiteFactory(site_name="IoGT", port=8000, is_default_site=True) self.home_page = HomePageFactory(parent=self.site.root_page) self.group_restricted_article = ArticleFactory(parent=self.home_page) view_restriction = PageViewRestriction.objects.create( - page=self.group_restricted_article, restriction_type=PageViewRestriction.GROUPS) + page=self.group_restricted_article, + restriction_type=PageViewRestriction.GROUPS, + ) - self.allowed_group = GroupFactory(name='Allowed group') + self.allowed_group = GroupFactory(name="Allowed group") view_restriction.groups.add(self.allowed_group) def test_group_limited_article_without_login_redirects_to_login_page(self): response = self.client.get(self.group_restricted_article.url) self.assertEqual(response.status_code, status.HTTP_302_FOUND) self.assertEqual( - f'{reverse("account_login")}?next={self.group_restricted_article.url}', response.url) + f'{reverse("account_login")}?next={self.group_restricted_article.url}', + response.url, + ) def test_group_limited_article_without_group_returns_403(self): - self.client.login(username=self.user.username, password='test@123') + self.client.login(username=self.user.username, password="test@123") response = self.client.get(self.group_restricted_article.url) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) def test_group_limited_article_with_group_user_returns_200(self): self.user.groups.add(self.allowed_group) - self.client.login(username=self.user.username, password='test@123') + self.client.login(username=self.user.username, password="test@123") response = self.client.get(self.group_restricted_article.url) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -52,14 +53,13 @@ def test_group_limited_article_with_group_user_returns_200(self): class SVGToPNGMapTests(TestCase): def setUp(self) -> None: - self.svg_path = 'static/icons/search.svg' + self.svg_path = "static/icons/search.svg" def test_create_png_if_not_found(self): png = SVGToPNGMap.get_png_image(self.svg_path) - expected_path_regex = ''.join([ - settings.MEDIA_ROOT, - r"/svg-to-png-maps/svg-to-png.*\.png" - ]) + expected_path_regex = "".join( + [settings.MEDIA_ROOT, r"/svg-to-png-maps/svg-to-png.*\.png"] + ) self.assertRegex(png.path, expected_path_regex) self.assertGreater(png.size, 0) @@ -69,27 +69,25 @@ def test_create_png_if_not_found(self): def test_ignore_duplicates(self): png = SVGToPNGMap.get_png_image(self.svg_path) duplicate = { - 'svg_path': self.svg_path, - 'fill_color': None, - 'stroke_color': None, - 'png_image_file': png + "svg_path": self.svg_path, + "fill_color": None, + "stroke_color": None, + "png_image_file": png, } SVGToPNGMap.objects.create(**duplicate) SVGToPNGMap.objects.create(**duplicate) count = SVGToPNGMap.objects.filter( - svg_path=self.svg_path, - fill_color=None, - stroke_color=None + svg_path=self.svg_path, fill_color=None, stroke_color=None ).count() self.assertEquals(count, 2) png_2 = SVGToPNGMap.get_png_image(self.svg_path, None, None) self.assertEquals(png, png_2) - @patch.object(SVGToPNGMap, 'create') + @patch.object(SVGToPNGMap, "create") def test_get_png_must_not_fail(self, create): - create.side_effect = Exception('boom') - png = SVGToPNGMap.get_png_image(self.svg_path) - self.assertIsNone(png) + create.side_effect = Exception("boom") + png = SVGToPNGMap.get_png_image(self.svg_path) + self.assertIsNone(png) def test_uniqueness_unspecified_stroke_and_fill(self): SVGToPNGMap.create(self.svg_path) @@ -102,87 +100,16 @@ def test_uniqueness_no_stroke_and_fill(self): SVGToPNGMap.create(self.svg_path, None, None) def test_uniqueness_fill_no_stroke(self): - SVGToPNGMap.create( - self.svg_path, - fill_color='#a1b2c3', - stroke_color=None - ) + SVGToPNGMap.create(self.svg_path, fill_color="#a1b2c3", stroke_color=None) with self.assertRaises(IntegrityError): - SVGToPNGMap.create( - self.svg_path, - fill_color='#a1b2c3', - stroke_color=None - ) + SVGToPNGMap.create(self.svg_path, fill_color="#a1b2c3", stroke_color=None) def test_uniqueness_stroke_no_fill(self): - SVGToPNGMap.create(self.svg_path, fill_color=None, stroke_color='#fff') + SVGToPNGMap.create(self.svg_path, fill_color=None, stroke_color="#fff") with self.assertRaises(IntegrityError): - SVGToPNGMap.create( - self.svg_path, - fill_color=None, - stroke_color='#fff' - ) + SVGToPNGMap.create(self.svg_path, fill_color=None, stroke_color="#fff") def test_uniqueness_stroke_and_fill(self): - SVGToPNGMap.create( - self.svg_path, - fill_color='#555', - stroke_color='#666' - ) + SVGToPNGMap.create(self.svg_path, fill_color="#555", stroke_color="#666") with self.assertRaises(IntegrityError): - SVGToPNGMap.create( - self.svg_path, - fill_color='#555', - stroke_color='#666' - ) - - -class GoogleAnalyticsTagsTestCase(TestCase): - def setUp(self): - self.request_factory = RequestFactory() - - def test_query_param_without_value(self): - request = self.request_factory.get('/en/?test') - context = Context({'request': request}) - - rendered_template = google_analytics(context, tracking_code='my-code') - - parsed_qs = parse_qs(rendered_template) - self.assertEqual(parsed_qs['tracking_code'][0], "my-code") - self.assertEqual(parsed_qs['p'][0], "/en/?test=") - - def test_query_param_with_value(self): - request = self.request_factory.get('/en/?test=abc') - context = Context({'request': request}) - - rendered_template = google_analytics(context, tracking_code='my-code') - - parsed_qs = parse_qs(rendered_template) - self.assertEqual(parsed_qs['tracking_code'][0], "my-code") - self.assertEqual(parsed_qs['p'][0], "/en/?test=abc") - - def test_query_param_with_multiple_values_with_same_key(self): - request = self.request_factory.get('/en/?test=abc&test=xyz') - context = Context({'request': request}) - - rendered_template = google_analytics(context, tracking_code='my-code') - - parsed_qs = parse_qs(rendered_template) - self.assertEqual(parsed_qs['tracking_code'][0], "my-code") - self.assertEqual(parsed_qs['p'][0], "/en/?test=abc&test=xyz") - - def test_query_param_with_utm(self): - request = self.request_factory.get( - '/en/?utm_content=content&utm_term=term&utm_source=source&utm_medium=medium&utm_campaign=campaign') - context = Context({'request': request}) - - rendered_template = google_analytics(context, tracking_code='my-code') - - parsed_qs = parse_qs(rendered_template) - self.assertEqual(parsed_qs['tracking_code'][0], "my-code") - self.assertEqual(parsed_qs['p'][0], "/en/") - self.assertEqual(parsed_qs['utm_content'][0], "content") - self.assertEqual(parsed_qs['utm_term'][0], "term") - self.assertEqual(parsed_qs['utm_source'][0], "source") - self.assertEqual(parsed_qs['utm_medium'][0], "medium") - self.assertEqual(parsed_qs['utm_campaign'][0], "campaign") + SVGToPNGMap.create(self.svg_path, fill_color="#555", stroke_color="#666") diff --git a/iogt/middleware.py b/iogt/middleware.py index 36afaeb08..6ab389a70 100644 --- a/iogt/middleware.py +++ b/iogt/middleware.py @@ -17,19 +17,6 @@ import iogt.iogt_globals as globals_ -class CacheControlMiddleware: - def __init__(self, get_response): - self.get_response = get_response - - def __call__(self, request): - response = self.get_response(request) - - if SiteSettings.for_request(request).opt_in_to_google_web_light: - response['Cache-Control'] = 'no-transform' - - return response - - class LocaleMiddleware(DjangoLocaleMiddleware): def _get_language_from_request(self, request, check_path=False): if check_path: diff --git a/iogt/settings/base.py b/iogt/settings/base.py index 4337512ad..e79d0012f 100644 --- a/iogt/settings/base.py +++ b/iogt/settings/base.py @@ -84,7 +84,6 @@ 'health_check.storage', 'health_check.contrib.migrations', 'rest_framework_simplejwt', - 'google_analytics', 'django_filters', 'drf_yasg', 'webpush', @@ -115,7 +114,6 @@ 'iogt.middleware.CustomRedirectMiddleware', 'iogt_users.middlewares.RegistrationSurveyRedirectMiddleware', 'external_links.middleware.RewriteExternalLinksMiddleware', - 'iogt.middleware.CacheControlMiddleware', 'iogt.middleware.GlobalDataMiddleware', 'wagtailcache.cache.FetchFromCacheMiddleware', ] diff --git a/iogt/templates/base.html b/iogt/templates/base.html index 579e0c3a3..f259dcd28 100644 --- a/iogt/templates/base.html +++ b/iogt/templates/base.html @@ -5,7 +5,6 @@ - {% include 'google_analytics_tag_manager.html' %} @@ -50,7 +49,6 @@ {% get_current_language_bidi as LANGUAGE_BIDI %} <body class="{% if LANGUAGE_BIDI %}rtl{% endif %} {% block body_class %}{% endblock %}"> -{% include 'google_analytics_pixel_tracking.html' %} {% wagtailuserbar %} <main id="app"> diff --git a/iogt/templates/google_analytics_pixel_tracking.html b/iogt/templates/google_analytics_pixel_tracking.html deleted file mode 100644 index d49c4da2c..000000000 --- a/iogt/templates/google_analytics_pixel_tracking.html +++ /dev/null @@ -1,11 +0,0 @@ -{% load wagtailsettings_tags generic_components %} -{% get_settings %} - -<div style="display:none"> - {% if settings.home.SiteSettings.local_ga_tracking_code %} - <img src="{% google_analytics tracking_code=settings.home.SiteSettings.local_ga_tracking_code %}" width="0" height="0" /> - {% endif %} - {% if settings.home.SiteSettings.global_ga_tracking_code %} - <img src="{% google_analytics tracking_code=settings.home.SiteSettings.global_ga_tracking_code %}" width="0" height="0" /> - {% endif %} -</div> diff --git a/iogt/templates/google_analytics_tag_manager.html b/iogt/templates/google_analytics_tag_manager.html deleted file mode 100644 index b20e8b71d..000000000 --- a/iogt/templates/google_analytics_tag_manager.html +++ /dev/null @@ -1,22 +0,0 @@ -{% load wagtailsettings_tags %} -{% get_settings %} - -{% if settings.home.SiteSettings.local_ga_tag_manager or settings.home.SiteSettings.global_ga_tag_manager %} - <script async - src="https://www.googletagmanager.com/gtag/js?id={% firstof settings.home.SiteSettings.local_ga_tag_manager settings.home.SiteSettings.global_ga_tag_manager %}"></script> - <script> - window.dataLayer = window.dataLayer || []; - - function gtag() { - window.dataLayer.push(arguments); - } - - gtag('js', new Date()); - {% if settings.home.SiteSettings.local_ga_tag_manager %} - gtag('config', '{{ settings.home.SiteSettings.local_ga_tag_manager }}'); - {% endif %} - {% if settings.home.SiteSettings.global_ga_tag_manager %} - gtag('config', '{{ settings.home.SiteSettings.global_ga_tag_manager }}'); - {% endif %} - </script> -{% endif %} diff --git a/iogt/templates/sw.js b/iogt/templates/sw.js index e1e10e95f..cf1856bae 100644 --- a/iogt/templates/sw.js +++ b/iogt/templates/sw.js @@ -1,13 +1,5 @@ importScripts('../../static/js/workbox/workbox-v6.1.5/workbox-sw.js'); -// Below we are using a custom dimension to track online vs. offline interactions. So make -// sure to create a custom dimension on GA -workbox.googleAnalytics.initialize({ - parameterOverrides: { - cd1: 'offline', - }, -}); - self.addEventListener('install', event => { event.waitUntil(self.skipWaiting()); }); @@ -16,7 +8,6 @@ self.addEventListener('activate', event => { event.waitUntil(self.clients.claim()); }); - const languageCodeRegEx = RegExp('^\\/(\\w+([@-]\\w+)?)(\\/|$)'); self.addEventListener('fetch', async event => { @@ -34,7 +25,7 @@ self.addEventListener('fetch', async event => { cache.put(event.request, resp.clone()); } return resp; - }) + }); }); }) .catch(error => { diff --git a/iogt/urls.py b/iogt/urls.py index a7f0ab0d2..736899adf 100644 --- a/iogt/urls.py +++ b/iogt/urls.py @@ -84,6 +84,5 @@ urlpatterns = urlpatterns + i18n_patterns( re_path(r'^images/([^/]*)/(\d*)/([^/]*)/[^/]*$', ServeView.as_view(), name='wagtailimages_serve'), - re_path('djga/', include('google_analytics.urls')), path("", include(wagtail_urls)), ) diff --git a/requirements.dev.txt b/requirements.dev.txt index 5e67982e0..005afb4c3 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -4,12 +4,6 @@ # # pip-compile --generate-hashes --output-file=requirements.dev.txt requirements.dev.in # -amqp==5.2.0 \ - --hash=sha256:827cb12fb0baa892aad844fd95258143bce4027fdac4fccddbc43330fd281637 \ - --hash=sha256:a1ecff425ad063ad42a486c902807d1482311481c8ad95a72694b2975e75f7fd - # via - # -r requirements.txt - # kombu anyascii==0.3.2 \ --hash=sha256:3b3beef6fc43d9036d3b0529050b0c48bfad8bc960e9e562d7223cfb94fe45d4 \ --hash=sha256:9d5d32ef844fe225b8bc7cba7f950534fae4da27a9bf3a6bea2cb0ea46ce4730 @@ -34,14 +28,7 @@ beautifulsoup4==4.9.3 \ --hash=sha256:fff47e031e34ec82bf17e00da8f592fe7de69aeea38be00523c04623c04fb666 # via # -r requirements.txt - # django-google-analytics-app # wagtail -billiard==4.2.0 \ - --hash=sha256:07aa978b308f334ff8282bd4a746e681b3513db5c9a514cbdd810cbbdc19714d \ - --hash=sha256:9a3c3184cb275aa17a732f93f65b20c525d3d9f253722d26a82194803ade5a2c - # via - # -r requirements.txt - # celery bleach==3.3.1 \ --hash=sha256:306483a5a9795474160ad57fce3ddd1b50551e981eed8e15a582d34cef28aafa \ --hash=sha256:ae976d7174bba988c0b632def82fdc94235756edfb14e6558a9c5be555c9fb78 @@ -58,12 +45,6 @@ cairosvg==2.7.0 \ --hash=sha256:17cb96423a896258848322a95c80160e714a58f1af3dd73b8e1750994519b9f9 \ --hash=sha256:ac4dc7c1d38b3a15717db2633a3a383012e0be664c727c911637e6af6a49293c # via -r requirements.txt -celery==5.3.5 \ - --hash=sha256:30b75ac60fb081c2d9f8881382c148ed7c9052031a75a1e8743ff4b4b071f184 \ - --hash=sha256:6b65d8dd5db499dd6190c45aa6398e171b99592f2af62c312f7391587feb5458 - # via - # -r requirements.txt - # django-google-analytics-app certifi==2023.7.22 \ --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 @@ -228,29 +209,7 @@ click==8.1.7 \ --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de # via # -r requirements.txt - # celery - # click-didyoumean - # click-plugins - # click-repl # rq -click-didyoumean==0.3.0 \ - --hash=sha256:a0713dc7a1de3f06bc0df5a9567ad19ead2d3d5689b434768a6145bff77c0667 \ - --hash=sha256:f184f0d851d96b6d29297354ed981b7dd71df7ff500d82fa6d11f0856bee8035 - # via - # -r requirements.txt - # celery -click-plugins==1.1.1 \ - --hash=sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b \ - --hash=sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8 - # via - # -r requirements.txt - # celery -click-repl==0.3.0 \ - --hash=sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9 \ - --hash=sha256:fb7e06deb8da8de86180a33a9da97ac316751c094c6899382da7feeeeb51b812 - # via - # -r requirements.txt - # celery coverage==7.3.2 \ --hash=sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1 \ --hash=sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63 \ @@ -369,7 +328,6 @@ django==3.2.24 \ # django-debug-toolbar # django-extensions # django-filter - # django-google-analytics-app # django-health-check # django-modelcluster # django-permissionedforms @@ -427,10 +385,6 @@ django-filter==2.4.0 \ # via # -r requirements.txt # wagtail -django-google-analytics-app==5.0.5 \ - --hash=sha256:63dfd6a9700ac91b7994ade300018b12321b958949c3f63ccbffd2732354b62b \ - --hash=sha256:ef1d565b7f22c856c646892b871bb5a399762d1ba7eb9041c977340d531f766a - # via -r requirements.txt django-health-check==3.16.5 \ --hash=sha256:1edfd49293ccebbce29f9da609c407f307aee240ab799ab4201031341ae78c0f \ --hash=sha256:8d66781a0ea82b1a8b44878187b38a27370e94f18287312e39be0593e72d8983 @@ -570,12 +524,6 @@ iniconfig==2.0.0 \ --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 # via pytest -kombu==5.3.3 \ - --hash=sha256:1491df826cfc5178c80f3e89dd6dfba68e484ef334db81070eb5cb8094b31167 \ - --hash=sha256:6cd5c5d5ef77538434b8f81f3e265c414269418645dbb47dbf130a8a05c3e357 - # via - # -r requirements.txt - # celery l18n==2021.3 \ --hash=sha256:1956e890d673d17135cc20913253c154f6bc1c00266c22b7d503cc1a5a42d848 \ --hash=sha256:78495d1df95b6f7dcc694d1ba8994df709c463a1cbac1bf016e1b9a5ce7280b9 @@ -800,12 +748,6 @@ polib==1.2.0 \ # -r requirements.txt # django-translation-manager # wagtail-localize -prompt-toolkit==3.0.41 \ - --hash=sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0 \ - --hash=sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2 - # via - # -r requirements.txt - # click-repl psycopg2==2.9.9 \ --hash=sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981 \ --hash=sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516 \ @@ -857,10 +799,7 @@ pytest-django==4.7.0 \ python-dateutil==2.8.2 \ --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 - # via - # -r requirements.txt - # celery - # faker + # via faker python3-openid==3.2.0 \ --hash=sha256:33fbf6928f401e0b790151ed2b5290b02545e8775f982485205a066f874aaeaf \ --hash=sha256:6626f771e0417486701e0b4daff762e7212e820ca5b29fcc0d05f6f8736dfa6b @@ -956,7 +895,6 @@ requests==2.31.0 \ # via # -r requirements.txt # django-allauth - # django-google-analytics-app # django-translation-manager # pywebpush # requests-oauthlib @@ -1003,7 +941,6 @@ six==1.16.0 \ # bleach # django-comments-xtd # django-compressor - # django-google-analytics-app # html5lib # l18n # libsass @@ -1029,12 +966,6 @@ sqlparse==0.4.4 \ # -r requirements.txt # django # django-debug-toolbar -structlog==23.2.0 \ - --hash=sha256:16a167e87b9fa7fae9a972d5d12805ef90e04857a93eba479d4be3801a6a1482 \ - --hash=sha256:334666b94707f89dbc4c81a22a8ccd34449f0201d5b1ee097a030b577fa8c858 - # via - # -r requirements.txt - # django-google-analytics-app tablib[xls,xlsx]==3.5.0 \ --hash=sha256:9821caa9eca6062ff7299fa645e737aecff982e6b2b42046928a6413c8dabfd9 \ --hash=sha256:f6661dfc45e1d4f51fa8a6239f9c8349380859a5bfaa73280645f046d6c96e33 @@ -1074,12 +1005,6 @@ typing-extensions==4.8.0 \ # via # -r requirements.txt # wagtail-localize -tzdata==2023.3 \ - --hash=sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a \ - --hash=sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda - # via - # -r requirements.txt - # celery uritemplate==4.1.1 \ --hash=sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0 \ --hash=sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e @@ -1094,14 +1019,6 @@ urllib3[socks]==1.26.18 \ # elasticsearch # requests # selenium -vine==5.1.0 \ - --hash=sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc \ - --hash=sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0 - # via - # -r requirements.txt - # amqp - # celery - # kombu wagtail==3.0.3 \ --hash=sha256:111ed9a0a6ff26d5d881d52deb4bf52b627d79a53c43829611752dbb68a9192f \ --hash=sha256:23b3e541401355ea183372582050ea52b049c956dd5b506197f957bb68423ab3 @@ -1148,12 +1065,6 @@ wagtailsvg==0.0.37 \ --hash=sha256:4b30433809614fbac09f9088b4aed42a1bfe56f9fb581b858606187cb177ca6b \ --hash=sha256:dc4d698748bde32034b1eac2275cf159597ca8e399d3830e96391f761aa0cacf # via -r requirements.txt -wcwidth==0.2.10 \ - --hash=sha256:390c7454101092a6a5e43baad8f83de615463af459201709556b6e4b1c861f97 \ - --hash=sha256:aec5179002dd0f0d40c456026e74a729661c9d468e1ed64405e3a6c2176ca36f - # via - # -r requirements.txt - # prompt-toolkit webencodings==0.5.1 \ --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 diff --git a/requirements.in b/requirements.in index b41d0acaf..f57af5f3e 100644 --- a/requirements.in +++ b/requirements.in @@ -9,7 +9,6 @@ django-compressor==2.4.* django-debug-toolbar==3.2.1 django-extensions==3.1.* django-filter==2.4.0 -django-google-analytics-app==5.0.5 django-health-check==3.16.5 django-redis~=5.2.0 django-sass-processor==1.0.* diff --git a/requirements.txt b/requirements.txt index 1bf1718bd..edbb84291 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,10 +4,6 @@ # # pip-compile --generate-hashes --output-file=requirements.txt requirements.in # -amqp==5.2.0 \ - --hash=sha256:827cb12fb0baa892aad844fd95258143bce4027fdac4fccddbc43330fd281637 \ - --hash=sha256:a1ecff425ad063ad42a486c902807d1482311481c8ad95a72694b2975e75f7fd - # via kombu anyascii==0.3.2 \ --hash=sha256:3b3beef6fc43d9036d3b0529050b0c48bfad8bc960e9e562d7223cfb94fe45d4 \ --hash=sha256:9d5d32ef844fe225b8bc7cba7f950534fae4da27a9bf3a6bea2cb0ea46ce4730 @@ -22,12 +18,7 @@ beautifulsoup4==4.9.3 \ --hash=sha256:fff47e031e34ec82bf17e00da8f592fe7de69aeea38be00523c04623c04fb666 # via # -r requirements.in - # django-google-analytics-app # wagtail -billiard==4.2.0 \ - --hash=sha256:07aa978b308f334ff8282bd4a746e681b3513db5c9a514cbdd810cbbdc19714d \ - --hash=sha256:9a3c3184cb275aa17a732f93f65b20c525d3d9f253722d26a82194803ade5a2c - # via celery bleach==3.3.1 \ --hash=sha256:306483a5a9795474160ad57fce3ddd1b50551e981eed8e15a582d34cef28aafa \ --hash=sha256:ae976d7174bba988c0b632def82fdc94235756edfb14e6558a9c5be555c9fb78 @@ -40,10 +31,6 @@ cairosvg==2.7.0 \ --hash=sha256:17cb96423a896258848322a95c80160e714a58f1af3dd73b8e1750994519b9f9 \ --hash=sha256:ac4dc7c1d38b3a15717db2633a3a383012e0be664c727c911637e6af6a49293c # via -r requirements.in -celery==5.3.5 \ - --hash=sha256:30b75ac60fb081c2d9f8881382c148ed7c9052031a75a1e8743ff4b4b071f184 \ - --hash=sha256:6b65d8dd5db499dd6190c45aa6398e171b99592f2af62c312f7391587feb5458 - # via django-google-analytics-app certifi==2023.7.22 \ --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 @@ -202,24 +189,7 @@ charset-normalizer==3.3.2 \ click==8.1.7 \ --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de - # via - # celery - # click-didyoumean - # click-plugins - # click-repl - # rq -click-didyoumean==0.3.0 \ - --hash=sha256:a0713dc7a1de3f06bc0df5a9567ad19ead2d3d5689b434768a6145bff77c0667 \ - --hash=sha256:f184f0d851d96b6d29297354ed981b7dd71df7ff500d82fa6d11f0856bee8035 - # via celery -click-plugins==1.1.1 \ - --hash=sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b \ - --hash=sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8 - # via celery -click-repl==0.3.0 \ - --hash=sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9 \ - --hash=sha256:fb7e06deb8da8de86180a33a9da97ac316751c094c6899382da7feeeeb51b812 - # via celery + # via rq cryptography==42.0.4 \ --hash=sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b \ --hash=sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce \ @@ -281,7 +251,6 @@ django==3.2.24 \ # django-debug-toolbar # django-extensions # django-filter - # django-google-analytics-app # django-health-check # django-modelcluster # django-permissionedforms @@ -333,10 +302,6 @@ django-filter==2.4.0 \ # via # -r requirements.in # wagtail -django-google-analytics-app==5.0.5 \ - --hash=sha256:63dfd6a9700ac91b7994ade300018b12321b958949c3f63ccbffd2732354b62b \ - --hash=sha256:ef1d565b7f22c856c646892b871bb5a399762d1ba7eb9041c977340d531f766a - # via -r requirements.in django-health-check==3.16.5 \ --hash=sha256:1edfd49293ccebbce29f9da609c407f307aee240ab799ab4201031341ae78c0f \ --hash=sha256:8d66781a0ea82b1a8b44878187b38a27370e94f18287312e39be0593e72d8983 @@ -427,10 +392,6 @@ inflection==0.5.1 \ --hash=sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417 \ --hash=sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2 # via drf-yasg -kombu==5.3.3 \ - --hash=sha256:1491df826cfc5178c80f3e89dd6dfba68e484ef334db81070eb5cb8094b31167 \ - --hash=sha256:6cd5c5d5ef77538434b8f81f3e265c414269418645dbb47dbf130a8a05c3e357 - # via celery l18n==2021.3 \ --hash=sha256:1956e890d673d17135cc20913253c154f6bc1c00266c22b7d503cc1a5a42d848 \ --hash=sha256:78495d1df95b6f7dcc694d1ba8994df709c463a1cbac1bf016e1b9a5ce7280b9 @@ -637,10 +598,6 @@ polib==1.2.0 \ # via # django-translation-manager # wagtail-localize -prompt-toolkit==3.0.41 \ - --hash=sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0 \ - --hash=sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2 - # via click-repl psycopg2==2.9.9 \ --hash=sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981 \ --hash=sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516 \ @@ -670,10 +627,6 @@ pyjwt[crypto]==2.8.0 \ # -r requirements.in # django-allauth # djangorestframework-simplejwt -python-dateutil==2.8.2 \ - --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ - --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 - # via celery python3-openid==3.2.0 \ --hash=sha256:33fbf6928f401e0b790151ed2b5290b02545e8775f982485205a066f874aaeaf \ --hash=sha256:6626f771e0417486701e0b4daff762e7212e820ca5b29fcc0d05f6f8736dfa6b @@ -759,7 +712,6 @@ requests==2.31.0 \ --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 # via # django-allauth - # django-google-analytics-app # django-translation-manager # pywebpush # requests-oauthlib @@ -795,11 +747,9 @@ six==1.16.0 \ # bleach # django-comments-xtd # django-compressor - # django-google-analytics-app # html5lib # l18n # libsass - # python-dateutil soupsieve==2.5 \ --hash=sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690 \ --hash=sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7 @@ -810,10 +760,6 @@ sqlparse==0.4.4 \ # via # django # django-debug-toolbar -structlog==23.2.0 \ - --hash=sha256:16a167e87b9fa7fae9a972d5d12805ef90e04857a93eba479d4be3801a6a1482 \ - --hash=sha256:334666b94707f89dbc4c81a22a8ccd34449f0201d5b1ee097a030b577fa8c858 - # via django-google-analytics-app tablib[xls,xlsx]==3.5.0 \ --hash=sha256:9821caa9eca6062ff7299fa645e737aecff982e6b2b42046928a6413c8dabfd9 \ --hash=sha256:f6661dfc45e1d4f51fa8a6239f9c8349380859a5bfaa73280645f046d6c96e33 @@ -836,10 +782,6 @@ typing-extensions==4.8.0 \ --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef # via wagtail-localize -tzdata==2023.3 \ - --hash=sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a \ - --hash=sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda - # via celery uritemplate==4.1.1 \ --hash=sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0 \ --hash=sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e @@ -850,13 +792,6 @@ urllib3==1.26.18 \ # via # elasticsearch # requests -vine==5.1.0 \ - --hash=sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc \ - --hash=sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0 - # via - # amqp - # celery - # kombu wagtail==3.0.3 \ --hash=sha256:111ed9a0a6ff26d5d881d52deb4bf52b627d79a53c43829611752dbb68a9192f \ --hash=sha256:23b3e541401355ea183372582050ea52b049c956dd5b506197f957bb68423ab3 @@ -896,10 +831,6 @@ wagtailsvg==0.0.37 \ --hash=sha256:4b30433809614fbac09f9088b4aed42a1bfe56f9fb581b858606187cb177ca6b \ --hash=sha256:dc4d698748bde32034b1eac2275cf159597ca8e399d3830e96391f761aa0cacf # via -r requirements.in -wcwidth==0.2.10 \ - --hash=sha256:390c7454101092a6a5e43baad8f83de615463af459201709556b6e4b1c861f97 \ - --hash=sha256:aec5179002dd0f0d40c456026e74a729661c9d468e1ed64405e3a6c2176ca36f - # via prompt-toolkit webencodings==0.5.1 \ --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923