Skip to content

Commit

Permalink
Including the gravatar id in the responses and not generating the gra…
Browse files Browse the repository at this point in the history
…vatar avatar url by default
  • Loading branch information
superalex committed Jul 8, 2016
1 parent c3022f4 commit 20a7595
Show file tree
Hide file tree
Showing 9 changed files with 77 additions and 120 deletions.
4 changes: 0 additions & 4 deletions settings/common.py
Expand Up @@ -477,10 +477,6 @@
},
}

# GRAVATAR_DEFAULT_AVATAR = "img/user-noimage.png"
GRAVATAR_DEFAULT_AVATAR = ""
GRAVATAR_AVATAR_SIZE = THN_AVATAR_SIZE

TAGS_PREDEFINED_COLORS = ["#fce94f", "#edd400", "#c4a000", "#8ae234",
"#73d216", "#4e9a06", "#d3d7cf", "#fcaf3e",
"#f57900", "#ce5c00", "#729fcf", "#3465a4",
Expand Down
6 changes: 4 additions & 2 deletions taiga/projects/history/serializers.py
Expand Up @@ -19,7 +19,8 @@
from taiga.base.api import serializers
from taiga.base.fields import I18NJsonField, Field, MethodField

from taiga.users.services import get_user_photo_or_gravatar_url
from taiga.users.services import get_user_photo_url
from taiga.users.gravatar import get_user_gravatar_id


HISTORY_ENTRY_I18N_FIELDS = ("points", "status", "severity", "priority", "type")
Expand All @@ -46,7 +47,8 @@ class HistoryEntrySerializer(serializers.LightSerializer):
def get_user(self, entry):
user = {"pk": None, "username": None, "name": None, "photo": None, "is_active": False}
user.update(entry.user)
user["photo"] = get_user_photo_or_gravatar_url(entry.owner)
user["photo"] = get_user_photo_url(entry.owner)
user["gravatar_id"] = get_user_gravatar_id(entry.owner)

if entry.owner:
user["is_active"] = entry.owner.is_active
Expand Down
15 changes: 12 additions & 3 deletions taiga/projects/serializers.py
Expand Up @@ -22,7 +22,8 @@
from taiga.base.fields import Field, MethodField, I18NField

from taiga.permissions import services as permissions_services
from taiga.users.services import get_user_photo_or_gravatar_url, get_photo_or_gravatar_url
from taiga.users.services import get_photo_url, get_user_photo_url
from taiga.users.gravatar import get_gravatar_id, get_user_gravatar_id
from taiga.users.serializers import UserBasicInfoSerializer

from taiga.permissions.services import calculate_permissions
Expand Down Expand Up @@ -106,12 +107,16 @@ class MembershipDictSerializer(serializers.LightDictSerializer):
color = Field()
username = Field()
photo = MethodField()
gravatar_id = MethodField()

def get_full_name_display(self, obj):
return obj["full_name"] or obj["username"] or obj["email"]

def get_photo(self, obj):
return get_photo_or_gravatar_url(obj['photo'], obj['email'])
return get_photo_url(obj['photo'])

def get_gravatar_id(self, obj):
return get_gravatar_id(obj['email'])


class MembershipSerializer(serializers.LightSerializer):
Expand All @@ -129,6 +134,7 @@ class MembershipSerializer(serializers.LightSerializer):
is_user_active = MethodField()
color = MethodField()
photo = MethodField()
gravatar_id = MethodField()
project_name = MethodField()
project_slug = MethodField()
invited_by = UserBasicInfoSerializer()
Expand All @@ -147,7 +153,10 @@ def get_color(self, obj):
return obj.user.color if obj.user else None

def get_photo(self, obj):
return get_user_photo_or_gravatar_url(obj.user)
return get_user_photo_url(obj.user)

def get_gravatar_id(self, obj):
return get_user_gravatar_id(obj.user)

def get_project_name(self, obj):
return obj.project.name if obj and obj.project else ""
Expand Down
8 changes: 5 additions & 3 deletions taiga/timeline/serializers.py
Expand Up @@ -20,7 +20,8 @@

from taiga.base.api import serializers
from taiga.base.fields import Field, MethodField
from taiga.users.services import get_user_photo_or_gravatar_url, get_big_photo_or_gravatar_url
from taiga.users.services import get_user_photo_url, get_user_big_photo_url
from taiga.users.gravatar import get_user_gravatar_id

from . import models

Expand Down Expand Up @@ -56,8 +57,9 @@ def get_data(self, obj):
obj.data["user"] = {
"id": user.pk,
"name": user.get_full_name(),
"photo": get_user_photo_or_gravatar_url(user),
"big_photo": get_big_photo_or_gravatar_url(user),
"photo": get_user_photo_url(user),
"big_photo": get_user_big_photo_url(user),
"gravatar_id": get_user_gravatar_id(user),
"username": user.username,
"is_profile_visible": user.is_active and not user.is_system,
"date_joined": user.date_joined
Expand Down
45 changes: 11 additions & 34 deletions taiga/users/gravatar.py
Expand Up @@ -18,45 +18,22 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.

import hashlib
import copy

from urllib.parse import urlencode

from django.conf import settings
from django.templatetags.static import static
def get_gravatar_id(email: str) -> str:
"""Get the gravatar id associated to an email.
GRAVATAR_BASE_URL = "//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.
- `default` defines what image url to show if no gravatar exists
- `size` defines the size of the avatar.
:return: Gravatar url.
:return: Gravatar id.
"""

params = copy.copy(options)
return hashlib.md5(email.lower().encode()).hexdigest()

default_avatar = getattr(settings, "GRAVATAR_DEFAULT_AVATAR", None)
default_size = getattr(settings, "GRAVATAR_AVATAR_SIZE", None)
def get_user_gravatar_id(user: object) -> str:
"""Get the gravatar id associated to a user.
avatar = options.get("default", None)
size = options.get("size", None)

if avatar:
params["default"] = avatar
elif default_avatar:
params["default"] = static(default_avatar)

if size:
params["size"] = size
elif default_size:
params["size"] = default_size

email_hash = hashlib.md5(email.lower().encode()).hexdigest()
url = GRAVATAR_BASE_URL.format(email_hash, urlencode(params))
:return: Gravatar id.
"""
if user and user.email:
return get_gravatar_id(user.email)

return url
return None
34 changes: 24 additions & 10 deletions taiga/users/serializers.py
Expand Up @@ -24,8 +24,8 @@
from taiga.base.utils.thumbnails import get_thumbnail_url

from taiga.projects.models import Project
from .services import get_user_photo_or_gravatar_url, get_big_photo_or_gravatar_url
from .gravatar import get_gravatar_url
from .services import get_user_photo_url, get_big_photo_url, get_user_big_photo_url
from taiga.users.gravatar import get_user_gravatar_id

from collections import namedtuple

Expand Down Expand Up @@ -53,21 +53,21 @@ class UserSerializer(serializers.LightSerializer):
is_active = Field()
photo = MethodField()
big_photo = MethodField()
gravatar_url = MethodField()
gravatar_id = MethodField()
roles = MethodField()
projects_with_me = MethodField()

def get_full_name_display(self, obj):
return obj.get_full_name() if obj else ""

def get_photo(self, user):
return get_user_photo_or_gravatar_url(user)
return get_user_photo_url(user)

def get_big_photo(self, user):
return get_big_photo_or_gravatar_url(user)
return get_user_big_photo_url(user)

def get_gravatar_url(self, user):
return get_gravatar_url(user.email)
def get_gravatar_id(self, user):
return get_user_gravatar_id(user)

def get_roles(self, user):
return user.memberships. order_by("role__name").values_list("role__name", flat=True).distinct()
Expand Down Expand Up @@ -108,17 +108,21 @@ class UserBasicInfoSerializer(serializers.LightSerializer):
full_name_display = MethodField()
photo = MethodField()
big_photo = MethodField()
gravatar_id = MethodField()
is_active = Field()
id = Field()

def get_full_name_display(self, obj):
return obj.get_full_name()

def get_photo(self, obj):
return get_user_photo_or_gravatar_url(obj)
return get_user_photo_url(obj)

def get_big_photo(self, obj):
return get_big_photo_or_gravatar_url(obj)
return get_user_big_photo_url(obj)

def get_gravatar_id(self, obj):
return get_user_gravatar_id(obj)

def to_value(self, instance):
if instance is None:
Expand Down Expand Up @@ -181,6 +185,7 @@ class HighLightedContentSerializer(serializers.LightSerializer):
assigned_to_username = Field()
assigned_to_full_name = Field()
assigned_to_photo = MethodField()
assigned_to_gravatar_id = MethodField()

is_watcher = MethodField()
total_watchers = Field()
Expand Down Expand Up @@ -237,7 +242,16 @@ def get_assigned_to_photo(self, obj):

UserData = namedtuple("UserData", ["photo", "email"])
user_data = UserData(photo=obj.assigned_to_photo, email=obj.assigned_to_email or "")
return get_user_photo_or_gravatar_url(user_data)
return get_user_photo_url(user_data)

def get_assigned_to_gravatar_id(self, obj):
type = getattr(obj, "type", "")
if type == "project":
return None

UserData = namedtuple("UserData", ["photo", "email"])
user_data = UserData(photo=obj.assigned_to_photo, email=obj.assigned_to_email or "")
return get_user_gravatar_id(user_data)

def get_tags_colors(self, obj):
tags = getattr(obj, "tags", [])
Expand Down
38 changes: 13 additions & 25 deletions taiga/users/services.py
Expand Up @@ -37,9 +37,6 @@
from taiga.projects.notifications.choices import NotifyLevel
from taiga.projects.notifications.services import get_projects_watched

from .gravatar import get_gravatar_url



def get_user_by_username_or_email(username_or_email):
user_model = get_user_model()
Expand Down Expand Up @@ -75,47 +72,38 @@ def get_and_validate_user(*, username:str, password:str) -> bool:

def get_photo_url(photo):
"""Get a photo absolute url and the photo automatically cropped."""
if not photo:
return None
try:
url = get_thumbnailer(photo)[settings.THN_AVATAR_SMALL].url
return get_absolute_url(url)
except InvalidImageFormatError as e:
return None


def get_photo_or_gravatar_url(photo=None, email=None):
"""Get the user's photo/gravatar url."""
if photo:
return get_photo_url(photo)
if email:
return get_gravatar_url(email)
return settings.GRAVATAR_DEFAULT_AVATAR


def get_user_photo_or_gravatar_url(user):
"""Get the user's photo/gravatar url."""
if user:
return get_photo_url(user.photo) if user.photo else get_gravatar_url(user.email)
return settings.GRAVATAR_DEFAULT_AVATAR
def get_user_photo_url(user):
"""Get the user's photo url."""
if not user:
return None
return get_photo_url(user.photo)


def get_big_photo_url(photo):
"""Get a big photo absolute url and the photo automatically cropped."""
if not photo:
return None
try:
url = get_thumbnailer(photo)[settings.THN_AVATAR_BIG].url
return get_absolute_url(url)
except InvalidImageFormatError as e:
return None


def get_big_photo_or_gravatar_url(user):
"""Get the user's big photo/gravatar url."""
def get_user_big_photo_url(user):
"""Get the user's big photo url."""
if not user:
return ""

if user.photo:
return get_big_photo_url(user.photo)
else:
return get_gravatar_url(user.email, size=settings.THN_AVATAR_BIG_SIZE)
return None
return get_big_photo_url(user.photo)


def get_visible_project_ids(from_user, by_user):
Expand Down
16 changes: 8 additions & 8 deletions taiga/webhooks/serializers.py
Expand Up @@ -24,14 +24,14 @@

from taiga.projects.services import get_logo_big_thumbnail_url

from taiga.users.gravatar import get_gravatar_url
from taiga.users.services import get_user_photo_or_gravatar_url

from taiga.users.services import get_user_photo_url
from taiga.users.gravatar import get_user_gravatar_id

########################################################################
# WebHooks
########################################################################


class WebhookSerializer(serializers.LightSerializer):
id = Field()
project = Field(attr="project_id")
Expand Down Expand Up @@ -64,25 +64,25 @@ class WebhookLogSerializer(serializers.LightSerializer):
class UserSerializer(serializers.LightSerializer):
id = Field(attr="pk")
permalink = MethodField()
gravatar_url = MethodField()
username = MethodField()
full_name = MethodField()
photo = MethodField()
gravatar_id = MethodField()

def get_permalink(self, obj):
return resolve_front_url("user", obj.username)

def get_gravatar_url(self, obj):
return get_gravatar_url(obj.email)

def get_username(self, obj):
return obj.get_username()

def get_full_name(self, obj):
return obj.get_full_name()

def get_photo(self, obj):
return get_user_photo_or_gravatar_url(obj)
return get_user_photo_url(obj)

def get_gravatar_id(self, obj):
return get_user_gravatar_id(obj)

def to_value(self, instance):
if instance is None:
Expand Down
31 changes: 0 additions & 31 deletions tests/unit/test_gravatar.py

This file was deleted.

0 comments on commit 20a7595

Please sign in to comment.