From 39957fa06f702f2c5b307f1c30bf2be5425ab7de Mon Sep 17 00:00:00 2001 From: nandini584 Date: Tue, 26 Mar 2024 10:40:10 +0530 Subject: [PATCH 1/3] added the function get_gravatar_url and written unit test for the same --- wagtail/users/tests/test_utils.py | 17 ++++++++++++++ wagtail/users/utils.py | 38 ++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 13 deletions(-) create mode 100644 wagtail/users/tests/test_utils.py diff --git a/wagtail/users/tests/test_utils.py b/wagtail/users/tests/test_utils.py new file mode 100644 index 0000000000..24a0a024ee --- /dev/null +++ b/wagtail/users/tests/test_utils.py @@ -0,0 +1,17 @@ +from django.test import TestCase +from wagtail.users.utils import get_gravatar_url + +class TestGravatar(TestCase): + def test_gravatar_default(self): + # Test with the default settings + self.assertEqual( + get_gravatar_url("something@example.com"), + "//www.gravatar.com/avatar/76ebd6fecabc982c205dd056e8f0415a?d=mp&s=100", + ) + + def test_gravatar_custom_size(self): + # Test with a custom size (note that the size will be doubled) + self.assertEqual( + get_gravatar_url("something@example.com", size=100), + "//www.gravatar.com/avatar/76ebd6fecabc982c205dd056e8f0415a?d=mp&s=200", + ) diff --git a/wagtail/users/utils.py b/wagtail/users/utils.py index ef3f0e6bb9..c01361a5af 100644 --- a/wagtail/users/utils.py +++ b/wagtail/users/utils.py @@ -1,7 +1,7 @@ from django.conf import settings from django.utils.http import urlencode from django.utils.translation import gettext_lazy as _ - +from urllib.parse import parse_qs, urlencode, urlparse, urlunparse from wagtail.compat import AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME from wagtail.coreutils import safe_md5 @@ -26,28 +26,40 @@ def user_can_delete_user(current_user, user_to_delete): def get_gravatar_url(email, size=50): - default = "mm" - size = ( - int(size) * 2 - ) # requested at retina size by default and scaled down at point of use with css + """ + Generates a Gravatar URL for the given email with customizable size and default image. + See https://gravatar.com/site/implement/images/ for Gravatar image options. + """ gravatar_provider_url = getattr( settings, "WAGTAIL_GRAVATAR_PROVIDER_URL", "//www.gravatar.com/avatar" ) - if (not email) or (gravatar_provider_url is None): + if not email or not gravatar_provider_url: return None + # Set default image type and adjust size for retina displays + default = "mp" + size *= 2 # Retina display support + + # Parse the provided URL and extract query parameters + parsed_url = urlparse(gravatar_provider_url) + query_params = parse_qs(parsed_url.query) email_bytes = email.lower().encode("utf-8") - hash = safe_md5(email_bytes, usedforsecurity=False).hexdigest() - gravatar_url = "{gravatar_provider_url}/{hash}?{params}".format( - gravatar_provider_url=gravatar_provider_url.rstrip("/"), - hash=hash, - params=urlencode({"s": size, "d": default}), - ) + email_hash = safe_md5(email_bytes).hexdigest() + email_hash='/'+ email_hash + + # Merge default parameters with those extracted from the provided URL + query_params.update({"d": default, "s": str(size)}) + query_string = urlencode(query_params, doseq=True) + + # Rebuild the URL with the merged parameters + gravatar_url = urlunparse(( + parsed_url.scheme, parsed_url.netloc, parsed_url.path + email_hash, + parsed_url.params, query_string, parsed_url.fragment + )) return gravatar_url - def get_deleted_user_display_name(user_id): # Use a string placeholder as the user id could be non-numeric return _("user %(id)s (deleted)") % {"id": user_id} From 2ae381b2fd8ef4261da31b5250c76bd6c24449ce Mon Sep 17 00:00:00 2001 From: nandini584 Date: Tue, 26 Mar 2024 10:54:44 +0530 Subject: [PATCH 2/3] sorted imports --- wagtail/users/utils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wagtail/users/utils.py b/wagtail/users/utils.py index c01361a5af..eac6967171 100644 --- a/wagtail/users/utils.py +++ b/wagtail/users/utils.py @@ -1,7 +1,9 @@ +from urllib.parse import parse_qs, urlencode, urlparse, urlunparse + from django.conf import settings from django.utils.http import urlencode from django.utils.translation import gettext_lazy as _ -from urllib.parse import parse_qs, urlencode, urlparse, urlunparse + from wagtail.compat import AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME from wagtail.coreutils import safe_md5 From c95c3c3ba4228a0fb995eb977bf9c0898eba8b95 Mon Sep 17 00:00:00 2001 From: nandini584 Date: Tue, 26 Mar 2024 10:56:50 +0530 Subject: [PATCH 3/3] removed the unsued urlencoded --- wagtail/users/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wagtail/users/utils.py b/wagtail/users/utils.py index eac6967171..41f2f514a7 100644 --- a/wagtail/users/utils.py +++ b/wagtail/users/utils.py @@ -1,4 +1,4 @@ -from urllib.parse import parse_qs, urlencode, urlparse, urlunparse +from urllib.parse import parse_qs, urlparse, urlunparse from django.conf import settings from django.utils.http import urlencode