FIX: add assigned fields to suggested topic serializer (#199)

With hard refresh, information about assigned user disappeared from suggested topics.
This commit is contained in:
Krzysztof Kotlarek 2021-09-09 16:59:06 +10:00 committed by GitHub
parent ab9e6f0684
commit f58b78e027
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 75 additions and 21 deletions

View File

@ -4,4 +4,12 @@ class Assignment < ActiveRecord::Base
belongs_to :topic
belongs_to :assigned_to, polymorphic: true
belongs_to :assigned_by_user, class_name: "User"
def assigned_to_user?
assigned_to_type == 'User'
end
def assigned_to_group?
assigned_to_type == 'Group'
end
end

View File

@ -17,7 +17,7 @@ class AssignedTopicSerializer < BasicTopicSerializer
end
def include_assigned_to_user?
object.assigned_to.is_a?(User)
object.assignment.assigned_to_user?
end
def assigned_to_group
@ -25,6 +25,6 @@ class AssignedTopicSerializer < BasicTopicSerializer
end
def include_assigned_to_group?
object.assigned_to.is_a?(Group)
object.assignment.assigned_to_group?
end
end

View File

@ -179,7 +179,7 @@ class ::TopicAssigner
first_post = @topic.posts.find_by(post_number: 1)
first_post.publish_change_to_clients!(:revised, reload_topic: true)
serializer = assign_to.is_a?(User) ? BasicUserSerializer : BasicGroupSerializer
serializer = assignment.assigned_to_user? ? BasicUserSerializer : BasicGroupSerializer
Jobs.enqueue(:assign_notification,
topic_id: @topic.id,
@ -199,7 +199,7 @@ class ::TopicAssigner
user_ids: allowed_user_ids
)
if assign_to.is_a?(User)
if assignment.assigned_to_user?
if !TopicUser.exists?(
user_id: assign_to.id,
topic_id: @topic.id,
@ -226,7 +226,7 @@ class ::TopicAssigner
nil,
bump: false,
post_type: SiteSetting.assigns_public ? Post.types[:small_action] : Post.types[:whisper],
action_code: assign_to.is_a?(User) ? "assigned" : "assigned_group",
action_code: assignment.assigned_to_user? ? "assigned" : "assigned_group",
custom_fields: { "action_code_who" => assign_to.is_a?(User) ? assign_to.username : assign_to.name }
)
@ -244,7 +244,7 @@ class ::TopicAssigner
assigned_by_id: @assigned_by.id,
assigned_by_username: @assigned_by.username
}
if assign_to.is_a?(User)
if assignment.assigned_to_user?
payload.merge!({
assigned_to_id: assign_to.id,
assigned_to_username: assign_to.username,
@ -275,7 +275,7 @@ class ::TopicAssigner
assigned_to_id: assignment.assigned_to.id,
assigned_to_type: assignment.assigned_to_type)
if assignment.assigned_to_type == "User"
if assignment.assigned_to_user?
if TopicUser.exists?(
user_id: assignment.assigned_to_id,
topic: @topic,
@ -301,7 +301,7 @@ class ::TopicAssigner
bump: false,
post_type: post_type,
custom_fields: { "action_code_who" => assigned_to.is_a?(User) ? assigned_to.username : assigned_to.name },
action_code: assigned_to.is_a?(User) ? "unassigned" : "unassigned_group",
action_code: assignment.assigned_to_user? ? "unassigned" : "unassigned_group",
)
end
@ -315,7 +315,7 @@ class ::TopicAssigner
unassigned_by_id: @assigned_by.id,
unassigned_by_username: @assigned_by.username
}
if assigned_to.is_a?(User)
if assignment.assigned_to_user?
payload.merge!({
unassigned_to_id: assigned_to.id,
unassigned_to_username: assigned_to.username,

View File

@ -201,16 +201,16 @@ after_initialize do
assignments = Assignment.strict_loading.where(topic: topics)
assignments_map = assignments.index_by(&:topic_id)
user_ids = assignments.filter { |assignment| assignment.assigned_to_type == "User" }.map(&:assigned_to_id)
user_ids = assignments.filter { |assignment| assignment.assigned_to_user? }.map(&:assigned_to_id)
users_map = User.where(id: user_ids).select(UserLookup.lookup_columns).index_by(&:id)
group_ids = assignments.filter { |assignment| assignment.assigned_to_type == "Group" }.map(&:assigned_to_id)
group_ids = assignments.filter { |assignment| assignment.assigned_to_group? }.map(&:assigned_to_id)
groups_map = Group.where(id: group_ids).index_by(&:id)
topics.each do |topic|
assignment = assignments_map[topic.id]
assigned_to = users_map[assignment.assigned_to_id] if assignment&.assigned_to_type == "User"
assigned_to = groups_map[assignment.assigned_to_id] if assignment&.assigned_to_type == "Group"
assigned_to = users_map[assignment.assigned_to_id] if assignment&.assigned_to_user?
assigned_to = groups_map[assignment.assigned_to_id] if assignment&.assigned_to_group?
topic.preload_assigned_to(assigned_to)
end
end
@ -412,7 +412,7 @@ after_initialize do
end
add_to_serializer(:topic_view, :include_assigned_to_user?) do
(SiteSetting.assigns_public || scope.can_assign?) && object.topic.assigned_to&.is_a?(User)
(SiteSetting.assigns_public || scope.can_assign?) && object.topic.assignment&.assigned_to_user?
end
add_to_serializer(:topic_view, :assigned_to_group, false) do
@ -420,7 +420,24 @@ after_initialize do
end
add_to_serializer(:topic_view, :include_assigned_to_group?) do
(SiteSetting.assigns_public || scope.can_assign?) && object.topic.assigned_to&.is_a?(Group)
(SiteSetting.assigns_public || scope.can_assign?) && object.topic.assignment&.assigned_to_group?
end
# SuggestedTopic serializer
add_to_serializer(:suggested_topic, :assigned_to_user, false) do
DiscourseAssign::Helpers.build_assigned_to_user(object.assigned_to, object)
end
add_to_serializer(:suggested_topic, :include_assigned_to_user?) do
(SiteSetting.assigns_public || scope.can_assign?) && object.assignment&.assigned_to_user?
end
add_to_serializer(:suggested_topic, :assigned_to_group, false) do
DiscourseAssign::Helpers.build_assigned_to_group(object.assigned_to, object)
end
add_to_serializer(:suggested_topic, :include_assigned_to_group?) do
(SiteSetting.assigns_public || scope.can_assign?) && object.assignment&.assigned_to_group?
end
# TopicListItem serializer
@ -429,7 +446,7 @@ after_initialize do
end
add_to_serializer(:topic_list_item, :include_assigned_to_user?) do
(SiteSetting.assigns_public || scope.can_assign?) && object.assigned_to&.is_a?(User)
(SiteSetting.assigns_public || scope.can_assign?) && object.assignment&.assigned_to_user?
end
add_to_serializer(:topic_list_item, :assigned_to_group) do
@ -437,7 +454,7 @@ after_initialize do
end
add_to_serializer(:topic_list_item, :include_assigned_to_group?) do
(SiteSetting.assigns_public || scope.can_assign?) && object.assigned_to&.is_a?(Group)
(SiteSetting.assigns_public || scope.can_assign?) && object.assignment&.assigned_to_group?
end
# SearchTopicListItem serializer
@ -446,7 +463,7 @@ after_initialize do
end
add_to_serializer(:search_topic_list_item, 'include_assigned_to_user?') do
(SiteSetting.assigns_public || scope.can_assign?) && object.assigned_to&.is_a?(User)
(SiteSetting.assigns_public || scope.can_assign?) && object.assignment&.assigned_to_user?
end
add_to_serializer(:search_topic_list_item, :assigned_to_group, false) do
@ -454,7 +471,7 @@ after_initialize do
end
add_to_serializer(:search_topic_list_item, 'include_assigned_to_group?') do
(SiteSetting.assigns_public || scope.can_assign?) && object.assigned_to&.is_a?(Group)
(SiteSetting.assigns_public || scope.can_assign?) && object.assignment&.assigned_to_group?
end
# TopicsBulkAction
@ -507,7 +524,7 @@ after_initialize do
end
add_to_serializer(:flagged_topic, :include_assigned_to_user?) do
object.assigned_to&.is_a?(User)
object.assignment&.assigned_to_user?
end
add_to_serializer(:flagged_topic, :assigned_to_group) do
@ -515,7 +532,7 @@ after_initialize do
end
add_to_serializer(:flagged_topic, :include_assigned_to_group?) do
object.assigned_to&.is_a?(Group)
object.assignment&.assigned_to_group?
end
# Reviewable

View File

@ -0,0 +1,29 @@
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe SuggestedTopicSerializer do
fab!(:user) { Fabricate(:user) }
fab!(:group) { Fabricate(:group, assignable_level: Group::ALIAS_LEVELS[:everyone]) }
fab!(:group_user) { Fabricate(:group_user, group: group, user: user) }
fab!(:topic) { Fabricate(:topic) }
fab!(:post) { Fabricate(:post, topic: topic) }
fab!(:topic2) { Fabricate(:topic) }
fab!(:post2) { Fabricate(:post, topic: topic2) }
fab!(:guardian) { Guardian.new(user) }
fab!(:serializer) { described_class.new(topic, scope: guardian) }
fab!(:serializer2) { described_class.new(topic2, scope: guardian) }
before do
SiteSetting.assign_enabled = true
SiteSetting.assign_allowed_on_groups = group.id.to_s
end
it "adds information about assignee for users and groups" do
TopicAssigner.new(topic, user).assign(user)
expect(serializer.as_json[:suggested_topic][:assigned_to_user][:username]).to eq(user.username)
TopicAssigner.new(topic2, user).assign(group)
expect(serializer2.as_json[:suggested_topic][:assigned_to_group][:name]).to eq(group.name)
end
end