Return user's gravatar if has no photo set
If the user has no photo set use her gravatar image if available otherwise use the default avatar image defined in `settings.DEFAULT_AVATAR_URL`remotes/origin/enhancement/email-actions
parent
5892841fe5
commit
5ff7ec1c00
|
@ -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 = ""
|
||||
|
|
|
@ -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
|
|
@ -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)
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue