Improving HighLightedContentSerializer and making more consistent how the assigned_to extra info is shown

remotes/origin/issue/4795/notification_even_they_are_disabled
Alejandro Alonso 2016-07-20 08:38:50 +02:00
parent 2c5716a097
commit 25c74cfb07
3 changed files with 71 additions and 81 deletions

View File

@ -26,7 +26,7 @@ from taiga.base.utils.thumbnails import get_thumbnail_url
from taiga.projects.models import Project from taiga.projects.models import Project
from .services import get_user_photo_url, get_big_photo_url, get_user_big_photo_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 taiga.users.gravatar import get_user_gravatar_id
from taiga.users.models import User
from collections import namedtuple from collections import namedtuple
@ -182,10 +182,8 @@ class HighLightedContentSerializer(serializers.LightSerializer):
project_is_private = MethodField() project_is_private = MethodField()
project_blocked_code = Field() project_blocked_code = Field()
assigned_to_username = Field() assigned_to = Field(attr="assigned_to_id")
assigned_to_full_name = Field() assigned_to_extra_info = MethodField()
assigned_to_photo = MethodField()
assigned_to_gravatar_id = MethodField()
is_watcher = MethodField() is_watcher = MethodField()
total_watchers = Field() total_watchers = Field()
@ -235,23 +233,11 @@ class HighLightedContentSerializer(serializers.LightSerializer):
return get_thumbnail_url(logo, settings.THN_LOGO_SMALL) return get_thumbnail_url(logo, settings.THN_LOGO_SMALL)
return None return None
def get_assigned_to_photo(self, obj): def get_assigned_to_extra_info(self, obj):
type = getattr(obj, "type", "") assigned_to = None
if type == "project": if obj.assigned_to_extra_info is not None:
return None assigned_to = User(**obj.assigned_to_extra_info)
return UserBasicInfoSerializer(assigned_to).data
UserData = namedtuple("UserData", ["photo", "email"])
user_data = UserData(photo=obj.assigned_to_photo, email=obj.assigned_to_email or "")
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): def get_tags_colors(self, obj):
tags = getattr(obj, "tags", []) tags = getattr(obj, "tags", [])

View File

@ -137,8 +137,8 @@ def get_stats_for_user(from_user, by_user):
total_num_projects = len(project_ids) total_num_projects = len(project_ids)
roles = [_(r) for r in from_user.memberships.filter(project__id__in=project_ids).values_list( role_names = from_user.memberships.filter(project__id__in=project_ids).values_list("role__name", flat=True)
"role__name", flat=True)] roles = [_(r) for r in role_names]
roles = list(set(roles)) roles = list(set(roles))
User = apps.get_model('users', 'User') User = apps.get_model('users', 'User')
@ -306,7 +306,6 @@ def _build_sql_for_type(for_user, type, table_name, action_table, ref_column="re
def get_watched_list(for_user, from_user, type=None, q=None): def get_watched_list(for_user, from_user, type=None, q=None):
filters_sql = "" filters_sql = ""
and_needed = False
if type: if type:
filters_sql += " AND type = %(type)s " filters_sql += " AND type = %(type)s "
@ -322,7 +321,9 @@ def get_watched_list(for_user, from_user, type=None, q=None):
SELECT entities.*, SELECT entities.*,
projects_project.name as project_name, projects_project.description as description, projects_project.slug as project_slug, projects_project.is_private as project_is_private, projects_project.name as project_name, projects_project.description as description, projects_project.slug as project_slug, projects_project.is_private as project_is_private,
projects_project.blocked_code as project_blocked_code, projects_project.tags_colors, projects_project.logo, projects_project.blocked_code as project_blocked_code, projects_project.tags_colors, projects_project.logo,
users_user.username assigned_to_username, users_user.full_name assigned_to_full_name, users_user.photo assigned_to_photo, users_user.email assigned_to_email users_user.id as assigned_to_id,
row_to_json(users_user) as assigned_to_extra_info
FROM ( FROM (
{userstories_sql} {userstories_sql}
UNION UNION
@ -401,7 +402,6 @@ def get_watched_list(for_user, from_user, type=None, q=None):
def get_liked_list(for_user, from_user, type=None, q=None): def get_liked_list(for_user, from_user, type=None, q=None):
filters_sql = "" filters_sql = ""
and_needed = False
if type: if type:
filters_sql += " AND type = %(type)s " filters_sql += " AND type = %(type)s "
@ -417,7 +417,8 @@ def get_liked_list(for_user, from_user, type=None, q=None):
SELECT entities.*, SELECT entities.*,
projects_project.name as project_name, projects_project.description as description, projects_project.slug as project_slug, projects_project.is_private as project_is_private, projects_project.name as project_name, projects_project.description as description, projects_project.slug as project_slug, projects_project.is_private as project_is_private,
projects_project.blocked_code as project_blocked_code, projects_project.tags_colors, projects_project.logo, projects_project.blocked_code as project_blocked_code, projects_project.tags_colors, projects_project.logo,
users_user.username assigned_to_username, users_user.full_name assigned_to_full_name, users_user.photo assigned_to_photo, users_user.email assigned_to_email users_user.id as assigned_to_id,
row_to_json(users_user) as assigned_to_extra_info
FROM ( FROM (
{projects_sql} {projects_sql}
) as entities ) as entities
@ -484,7 +485,6 @@ def get_liked_list(for_user, from_user, type=None, q=None):
def get_voted_list(for_user, from_user, type=None, q=None): def get_voted_list(for_user, from_user, type=None, q=None):
filters_sql = "" filters_sql = ""
and_needed = False
if type: if type:
filters_sql += " AND type = %(type)s " filters_sql += " AND type = %(type)s "
@ -500,7 +500,8 @@ def get_voted_list(for_user, from_user, type=None, q=None):
SELECT entities.*, SELECT entities.*,
projects_project.name as project_name, projects_project.description as description, projects_project.slug as project_slug, projects_project.is_private as project_is_private, projects_project.name as project_name, projects_project.description as description, projects_project.slug as project_slug, projects_project.is_private as project_is_private,
projects_project.blocked_code as project_blocked_code, projects_project.tags_colors, projects_project.logo, projects_project.blocked_code as project_blocked_code, projects_project.tags_colors, projects_project.logo,
users_user.username assigned_to_username, users_user.full_name assigned_to_full_name, users_user.photo assigned_to_photo, users_user.email assigned_to_email users_user.id as assigned_to_id,
row_to_json(users_user) as assigned_to_extra_info
FROM ( FROM (
{userstories_sql} {userstories_sql}
UNION UNION

View File

@ -558,9 +558,8 @@ def test_get_watched_list_valid_info_for_project():
assert project_watch_info["project_slug"] == None assert project_watch_info["project_slug"] == None
assert project_watch_info["project_is_private"] == None assert project_watch_info["project_is_private"] == None
assert project_watch_info["project_blocked_code"] == None assert project_watch_info["project_blocked_code"] == None
assert project_watch_info["assigned_to_username"] == None assert project_watch_info["assigned_to"] == None
assert project_watch_info["assigned_to_full_name"] == None assert project_watch_info["assigned_to_extra_info"] == None
assert project_watch_info["assigned_to_photo"] == None
def test_get_watched_list_for_project_with_ignored_notify_level(): def test_get_watched_list_for_project_with_ignored_notify_level():
@ -613,9 +612,8 @@ def test_get_liked_list_valid_info():
assert project_like_info["project_slug"] == None assert project_like_info["project_slug"] == None
assert project_like_info["project_is_private"] == None assert project_like_info["project_is_private"] == None
assert project_like_info["project_blocked_code"] == None assert project_like_info["project_blocked_code"] == None
assert project_like_info["assigned_to_username"] == None assert project_like_info["assigned_to"] == None
assert project_like_info["assigned_to_full_name"] == None assert project_like_info["assigned_to_extra_info"] == None
assert project_like_info["assigned_to_photo"] == None
def test_get_watched_list_valid_info_for_not_project_types(): def test_get_watched_list_valid_info_for_not_project_types():
@ -667,9 +665,11 @@ def test_get_watched_list_valid_info_for_not_project_types():
assert instance_watch_info["project_slug"] == instance.project.slug assert instance_watch_info["project_slug"] == instance.project.slug
assert instance_watch_info["project_is_private"] == instance.project.is_private assert instance_watch_info["project_is_private"] == instance.project.is_private
assert instance_watch_info["project_blocked_code"] == instance.project.blocked_code assert instance_watch_info["project_blocked_code"] == instance.project.blocked_code
assert instance_watch_info["assigned_to_username"] == instance.assigned_to.username assert instance_watch_info["assigned_to"] != None
assert instance_watch_info["assigned_to_full_name"] == instance.assigned_to.full_name assert instance_watch_info["assigned_to_extra_info"]["username"] == instance.assigned_to.username
assert instance_watch_info["assigned_to_photo"] != "" assert instance_watch_info["assigned_to_extra_info"]["full_name_display"] == instance.assigned_to.get_full_name()
assert instance_watch_info["assigned_to_extra_info"]["photo"] == None
assert instance_watch_info["assigned_to_extra_info"]["gravatar_id"] != None
def test_get_voted_list_valid_info(): def test_get_voted_list_valid_info():
@ -724,9 +724,12 @@ def test_get_voted_list_valid_info():
assert instance_vote_info["project_slug"] == instance.project.slug assert instance_vote_info["project_slug"] == instance.project.slug
assert instance_vote_info["project_is_private"] == instance.project.is_private assert instance_vote_info["project_is_private"] == instance.project.is_private
assert instance_vote_info["project_blocked_code"] == instance.project.blocked_code assert instance_vote_info["project_blocked_code"] == instance.project.blocked_code
assert instance_vote_info["assigned_to_username"] == instance.assigned_to.username assert instance_vote_info["assigned_to"] != None
assert instance_vote_info["assigned_to_full_name"] == instance.assigned_to.full_name assert instance_vote_info["assigned_to_extra_info"]["username"] == instance.assigned_to.username
assert instance_vote_info["assigned_to_photo"] != "" assert instance_vote_info["assigned_to_extra_info"]["full_name_display"] == instance.assigned_to.get_full_name()
assert instance_vote_info["assigned_to_extra_info"]["photo"] == None
assert instance_vote_info["assigned_to_extra_info"]["gravatar_id"] != None
def test_get_watched_list_with_liked_and_voted_objects(client): def test_get_watched_list_with_liked_and_voted_objects(client):