diff --git a/settings/common.py b/settings/common.py index 09e99e81..89885837 100644 --- a/settings/common.py +++ b/settings/common.py @@ -305,3 +305,5 @@ if "test" in sys.argv: print ("\033[1;91mNo django tests.\033[0m") print ("Try: \033[1;33mpy.test\033[0m") sys.exit(0) + +DEFAULT_AVATAR_URL = "" diff --git a/taiga/users/gravatar.py b/taiga/users/gravatar.py new file mode 100644 index 00000000..dc48dba8 --- /dev/null +++ b/taiga/users/gravatar.py @@ -0,0 +1,26 @@ +import hashlib +from urllib.parse import urlencode + +from django.conf import settings + +GRAVATAR_BASE_URL = "http://www.gravatar.com/avatar/{}?{}" + + +def get_gravatar_url(email: str, **options) -> str: + """Get the gravatar url associated to an email. + + :param options: Additional options to gravatar: + - `d` defines what image url to show if no gravatar exists + - `s` defines the size of the avatar. + By default these options are: + - `d` is `settings.DEFAULT_AVATAR_URL` + - `s` gravatar's default value which is 80x80 px + + :return: Gravatar url. + """ + defaults = {'d': settings.DEFAULT_AVATAR_URL} + defaults.update(options) + email_hash = hashlib.md5(email.lower().encode()).hexdigest() + url = GRAVATAR_BASE_URL.format(email_hash, urlencode(defaults)) + + return url diff --git a/taiga/users/serializers.py b/taiga/users/serializers.py index 80ba9b15..1108a14d 100644 --- a/taiga/users/serializers.py +++ b/taiga/users/serializers.py @@ -18,12 +18,13 @@ from django.utils.translation import ugettext_lazy as _ from rest_framework import serializers -from taiga.projects.models import Project -from .models import User, Role +from .models import User +from .gravatar import get_gravatar_url class UserSerializer(serializers.ModelSerializer): full_name_display = serializers.SerializerMethodField("get_full_name_display") + photo = serializers.SerializerMethodField("get_photo") class Meta: model = User @@ -34,6 +35,10 @@ class UserSerializer(serializers.ModelSerializer): def get_full_name_display(self, obj): return obj.get_full_name() if obj else "" + def get_photo(self, user): + "Return the user photo or her gravatar" + return user.photo or get_gravatar_url(user.email) + class RecoverySerializer(serializers.Serializer): token = serializers.CharField(max_length=200) diff --git a/tests/unit/test_gravatar.py b/tests/unit/test_gravatar.py new file mode 100644 index 00000000..b5e1aa4a --- /dev/null +++ b/tests/unit/test_gravatar.py @@ -0,0 +1,13 @@ +import hashlib + +from taiga.users.gravatar import get_gravatar_url + + +def test_get_gravatar_url(): + email = "user@email.com" + email_hash = hashlib.md5(email.encode()).hexdigest() + url = get_gravatar_url(email, s=40, d="default-image-url") + + assert email_hash in url + assert 's=40' in url + assert 'd=default-image-url' in url