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 ("\033[1;91mNo django tests.\033[0m")
|
||||||
print ("Try: \033[1;33mpy.test\033[0m")
|
print ("Try: \033[1;33mpy.test\033[0m")
|
||||||
sys.exit(0)
|
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 rest_framework import serializers
|
||||||
|
|
||||||
from taiga.projects.models import Project
|
from .models import User
|
||||||
from .models import User, Role
|
from .gravatar import get_gravatar_url
|
||||||
|
|
||||||
|
|
||||||
class UserSerializer(serializers.ModelSerializer):
|
class UserSerializer(serializers.ModelSerializer):
|
||||||
full_name_display = serializers.SerializerMethodField("get_full_name_display")
|
full_name_display = serializers.SerializerMethodField("get_full_name_display")
|
||||||
|
photo = serializers.SerializerMethodField("get_photo")
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = User
|
model = User
|
||||||
|
@ -34,6 +35,10 @@ class UserSerializer(serializers.ModelSerializer):
|
||||||
def get_full_name_display(self, obj):
|
def get_full_name_display(self, obj):
|
||||||
return obj.get_full_name() if obj else ""
|
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):
|
class RecoverySerializer(serializers.Serializer):
|
||||||
token = serializers.CharField(max_length=200)
|
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