From 8896d651364cedcff29f2b28f5f182f63133b2c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Thu, 7 Jul 2016 11:05:39 +0200 Subject: [PATCH] Fix project members photo --- taiga/base/api/serializers.py | 12 +++++++++++ taiga/projects/history/serializers.py | 4 ++-- taiga/projects/serializers.py | 31 +++++++++++++++++---------- taiga/timeline/serializers.py | 4 ++-- taiga/users/serializers.py | 8 +++---- taiga/users/services.py | 11 +++++++++- taiga/webhooks/serializers.py | 4 ++-- 7 files changed, 52 insertions(+), 22 deletions(-) diff --git a/taiga/base/api/serializers.py b/taiga/base/api/serializers.py index f2dfd849..2ee05db8 100644 --- a/taiga/base/api/serializers.py +++ b/taiga/base/api/serializers.py @@ -1235,3 +1235,15 @@ class LightSerializer(serpy.Serializer): super().__init__(*args, **kwargs) self.context = context self.view = view + + +class LightDictSerializer(serpy.DictSerializer): + def __init__(self, *args, **kwargs): + kwargs.pop("read_only", None) + kwargs.pop("partial", None) + kwargs.pop("files", None) + context = kwargs.pop("context", {}) + view = kwargs.pop("view", {}) + super().__init__(*args, **kwargs) + self.context = context + self.view = view diff --git a/taiga/projects/history/serializers.py b/taiga/projects/history/serializers.py index 8407810f..224cc6df 100644 --- a/taiga/projects/history/serializers.py +++ b/taiga/projects/history/serializers.py @@ -19,7 +19,7 @@ from taiga.base.api import serializers from taiga.base.fields import I18NJsonField, Field, MethodField -from taiga.users.services import get_photo_or_gravatar_url +from taiga.users.services import get_user_photo_or_gravatar_url HISTORY_ENTRY_I18N_FIELDS = ("points", "status", "severity", "priority", "type") @@ -46,7 +46,7 @@ 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_photo_or_gravatar_url(entry.owner) + user["photo"] = get_user_photo_or_gravatar_url(entry.owner) if entry.owner: user["is_active"] = entry.owner.is_active diff --git a/taiga/projects/serializers.py b/taiga/projects/serializers.py index 96b8d0ba..d4c93155 100644 --- a/taiga/projects/serializers.py +++ b/taiga/projects/serializers.py @@ -22,7 +22,7 @@ from taiga.base.api import serializers from taiga.base.fields import Field, MethodField, I18NField from taiga.permissions import services as permissions_services -from taiga.users.services import get_photo_or_gravatar_url +from taiga.users.services import get_user_photo_or_gravatar_url, get_photo_or_gravatar_url from taiga.users.serializers import UserBasicInfoSerializer from taiga.permissions.services import calculate_permissions @@ -97,6 +97,23 @@ class IssueTypeSerializer(serializers.LightSerializer): # Members ###################################################### +class MembershipDictSerializer(serializers.LightDictSerializer): + role_name = Field() + full_name = Field() + full_name_display = MethodField() + is_active = Field() + id = Field() + color = Field() + username = Field() + photo = 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']) + + class MembershipSerializer(serializers.LightSerializer): id = Field() user = Field(attr="user_id") @@ -130,7 +147,7 @@ class MembershipSerializer(serializers.LightSerializer): return obj.user.color if obj.user else None def get_photo(self, obj): - return get_photo_or_gravatar_url(obj.user) + return get_user_photo_or_gravatar_url(obj.user) def get_project_name(self, obj): return obj.project.name if obj and obj.project else "" @@ -369,15 +386,7 @@ class ProjectDetailSerializer(ProjectSerializer): if obj.members_attr is None: return [] - ret = [] - for m in obj.members_attr: - m["full_name_display"] = m["full_name"] or m["username"] or m["email"] - del(m["email"]) - del(m["complete_user_name"]) - if not m["id"] is None: - ret.append(m) - - return ret + return MembershipDictSerializer([m for m in obj.members_attr if m['id'] is not None], many=True).data def get_total_memberships(self, obj): if obj.members_attr is None: diff --git a/taiga/timeline/serializers.py b/taiga/timeline/serializers.py index 07b1985a..a7f607c9 100644 --- a/taiga/timeline/serializers.py +++ b/taiga/timeline/serializers.py @@ -20,7 +20,7 @@ from django.contrib.auth import get_user_model from taiga.base.api import serializers from taiga.base.fields import Field, MethodField -from taiga.users.services import get_photo_or_gravatar_url, get_big_photo_or_gravatar_url +from taiga.users.services import get_user_photo_or_gravatar_url, get_big_photo_or_gravatar_url from . import models @@ -56,7 +56,7 @@ class TimelineSerializer(serializers.LightSerializer): obj.data["user"] = { "id": user.pk, "name": user.get_full_name(), - "photo": get_photo_or_gravatar_url(user), + "photo": get_user_photo_or_gravatar_url(user), "big_photo": get_big_photo_or_gravatar_url(user), "username": user.username, "is_profile_visible": user.is_active and not user.is_system, diff --git a/taiga/users/serializers.py b/taiga/users/serializers.py index a28f5ce3..a943183d 100644 --- a/taiga/users/serializers.py +++ b/taiga/users/serializers.py @@ -24,7 +24,7 @@ from taiga.base.fields import PgArrayField, Field, MethodField, I18NField from taiga.base.utils.thumbnails import get_thumbnail_url from taiga.projects.models import Project -from .services import get_photo_or_gravatar_url, get_big_photo_or_gravatar_url +from .services import get_user_photo_or_gravatar_url, get_big_photo_or_gravatar_url from .gravatar import get_gravatar_url from collections import namedtuple @@ -61,7 +61,7 @@ class UserSerializer(serializers.LightSerializer): return obj.get_full_name() if obj else "" def get_photo(self, user): - return get_photo_or_gravatar_url(user) + return get_user_photo_or_gravatar_url(user) def get_big_photo(self, user): return get_big_photo_or_gravatar_url(user) @@ -115,7 +115,7 @@ class UserBasicInfoSerializer(serializers.LightSerializer): return obj.get_full_name() def get_photo(self, obj): - return get_photo_or_gravatar_url(obj) + return get_user_photo_or_gravatar_url(obj) def get_big_photo(self, obj): return get_big_photo_or_gravatar_url(obj) @@ -237,7 +237,7 @@ class HighLightedContentSerializer(serializers.LightSerializer): UserData = namedtuple("UserData", ["photo", "email"]) user_data = UserData(photo=obj.assigned_to_photo, email=obj.assigned_to_email or "") - return get_photo_or_gravatar_url(user_data) + return get_user_photo_or_gravatar_url(user_data) def get_tags_colors(self, obj): tags = getattr(obj, "tags", []) diff --git a/taiga/users/services.py b/taiga/users/services.py index 5397c46b..73ae2d74 100644 --- a/taiga/users/services.py +++ b/taiga/users/services.py @@ -82,7 +82,16 @@ def get_photo_url(photo): return None -def get_photo_or_gravatar_url(user): +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) diff --git a/taiga/webhooks/serializers.py b/taiga/webhooks/serializers.py index 624e107c..f08f4ae7 100644 --- a/taiga/webhooks/serializers.py +++ b/taiga/webhooks/serializers.py @@ -25,7 +25,7 @@ from taiga.front.templatetags.functions import resolve as resolve_front_url from taiga.projects.services import get_logo_big_thumbnail_url from taiga.users.gravatar import get_gravatar_url -from taiga.users.services import get_photo_or_gravatar_url +from taiga.users.services import get_user_photo_or_gravatar_url ######################################################################## @@ -82,7 +82,7 @@ class UserSerializer(serializers.LightSerializer): return obj.get_full_name() def get_photo(self, obj): - return get_photo_or_gravatar_url(obj) + return get_user_photo_or_gravatar_url(obj) def to_value(self, instance): if instance is None: