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:
parent
ab9e6f0684
commit
f58b78e027
|
@ -4,4 +4,12 @@ class Assignment < ActiveRecord::Base
|
||||||
belongs_to :topic
|
belongs_to :topic
|
||||||
belongs_to :assigned_to, polymorphic: true
|
belongs_to :assigned_to, polymorphic: true
|
||||||
belongs_to :assigned_by_user, class_name: "User"
|
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
|
end
|
||||||
|
|
|
@ -17,7 +17,7 @@ class AssignedTopicSerializer < BasicTopicSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
def include_assigned_to_user?
|
def include_assigned_to_user?
|
||||||
object.assigned_to.is_a?(User)
|
object.assignment.assigned_to_user?
|
||||||
end
|
end
|
||||||
|
|
||||||
def assigned_to_group
|
def assigned_to_group
|
||||||
|
@ -25,6 +25,6 @@ class AssignedTopicSerializer < BasicTopicSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
def include_assigned_to_group?
|
def include_assigned_to_group?
|
||||||
object.assigned_to.is_a?(Group)
|
object.assignment.assigned_to_group?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -179,7 +179,7 @@ class ::TopicAssigner
|
||||||
first_post = @topic.posts.find_by(post_number: 1)
|
first_post = @topic.posts.find_by(post_number: 1)
|
||||||
first_post.publish_change_to_clients!(:revised, reload_topic: true)
|
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,
|
Jobs.enqueue(:assign_notification,
|
||||||
topic_id: @topic.id,
|
topic_id: @topic.id,
|
||||||
|
@ -199,7 +199,7 @@ class ::TopicAssigner
|
||||||
user_ids: allowed_user_ids
|
user_ids: allowed_user_ids
|
||||||
)
|
)
|
||||||
|
|
||||||
if assign_to.is_a?(User)
|
if assignment.assigned_to_user?
|
||||||
if !TopicUser.exists?(
|
if !TopicUser.exists?(
|
||||||
user_id: assign_to.id,
|
user_id: assign_to.id,
|
||||||
topic_id: @topic.id,
|
topic_id: @topic.id,
|
||||||
|
@ -226,7 +226,7 @@ class ::TopicAssigner
|
||||||
nil,
|
nil,
|
||||||
bump: false,
|
bump: false,
|
||||||
post_type: SiteSetting.assigns_public ? Post.types[:small_action] : Post.types[:whisper],
|
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 }
|
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_id: @assigned_by.id,
|
||||||
assigned_by_username: @assigned_by.username
|
assigned_by_username: @assigned_by.username
|
||||||
}
|
}
|
||||||
if assign_to.is_a?(User)
|
if assignment.assigned_to_user?
|
||||||
payload.merge!({
|
payload.merge!({
|
||||||
assigned_to_id: assign_to.id,
|
assigned_to_id: assign_to.id,
|
||||||
assigned_to_username: assign_to.username,
|
assigned_to_username: assign_to.username,
|
||||||
|
@ -275,7 +275,7 @@ class ::TopicAssigner
|
||||||
assigned_to_id: assignment.assigned_to.id,
|
assigned_to_id: assignment.assigned_to.id,
|
||||||
assigned_to_type: assignment.assigned_to_type)
|
assigned_to_type: assignment.assigned_to_type)
|
||||||
|
|
||||||
if assignment.assigned_to_type == "User"
|
if assignment.assigned_to_user?
|
||||||
if TopicUser.exists?(
|
if TopicUser.exists?(
|
||||||
user_id: assignment.assigned_to_id,
|
user_id: assignment.assigned_to_id,
|
||||||
topic: @topic,
|
topic: @topic,
|
||||||
|
@ -301,7 +301,7 @@ class ::TopicAssigner
|
||||||
bump: false,
|
bump: false,
|
||||||
post_type: post_type,
|
post_type: post_type,
|
||||||
custom_fields: { "action_code_who" => assigned_to.is_a?(User) ? assigned_to.username : assigned_to.name },
|
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
|
end
|
||||||
|
|
||||||
|
@ -315,7 +315,7 @@ class ::TopicAssigner
|
||||||
unassigned_by_id: @assigned_by.id,
|
unassigned_by_id: @assigned_by.id,
|
||||||
unassigned_by_username: @assigned_by.username
|
unassigned_by_username: @assigned_by.username
|
||||||
}
|
}
|
||||||
if assigned_to.is_a?(User)
|
if assignment.assigned_to_user?
|
||||||
payload.merge!({
|
payload.merge!({
|
||||||
unassigned_to_id: assigned_to.id,
|
unassigned_to_id: assigned_to.id,
|
||||||
unassigned_to_username: assigned_to.username,
|
unassigned_to_username: assigned_to.username,
|
||||||
|
|
41
plugin.rb
41
plugin.rb
|
@ -201,16 +201,16 @@ after_initialize do
|
||||||
assignments = Assignment.strict_loading.where(topic: topics)
|
assignments = Assignment.strict_loading.where(topic: topics)
|
||||||
assignments_map = assignments.index_by(&:topic_id)
|
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)
|
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)
|
groups_map = Group.where(id: group_ids).index_by(&:id)
|
||||||
|
|
||||||
topics.each do |topic|
|
topics.each do |topic|
|
||||||
assignment = assignments_map[topic.id]
|
assignment = assignments_map[topic.id]
|
||||||
assigned_to = users_map[assignment.assigned_to_id] if assignment&.assigned_to_type == "User"
|
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_type == "Group"
|
assigned_to = groups_map[assignment.assigned_to_id] if assignment&.assigned_to_group?
|
||||||
topic.preload_assigned_to(assigned_to)
|
topic.preload_assigned_to(assigned_to)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -412,7 +412,7 @@ after_initialize do
|
||||||
end
|
end
|
||||||
|
|
||||||
add_to_serializer(:topic_view, :include_assigned_to_user?) do
|
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
|
end
|
||||||
|
|
||||||
add_to_serializer(:topic_view, :assigned_to_group, false) do
|
add_to_serializer(:topic_view, :assigned_to_group, false) do
|
||||||
|
@ -420,7 +420,24 @@ after_initialize do
|
||||||
end
|
end
|
||||||
|
|
||||||
add_to_serializer(:topic_view, :include_assigned_to_group?) do
|
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
|
end
|
||||||
|
|
||||||
# TopicListItem serializer
|
# TopicListItem serializer
|
||||||
|
@ -429,7 +446,7 @@ after_initialize do
|
||||||
end
|
end
|
||||||
|
|
||||||
add_to_serializer(:topic_list_item, :include_assigned_to_user?) do
|
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
|
end
|
||||||
|
|
||||||
add_to_serializer(:topic_list_item, :assigned_to_group) do
|
add_to_serializer(:topic_list_item, :assigned_to_group) do
|
||||||
|
@ -437,7 +454,7 @@ after_initialize do
|
||||||
end
|
end
|
||||||
|
|
||||||
add_to_serializer(:topic_list_item, :include_assigned_to_group?) do
|
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
|
end
|
||||||
|
|
||||||
# SearchTopicListItem serializer
|
# SearchTopicListItem serializer
|
||||||
|
@ -446,7 +463,7 @@ after_initialize do
|
||||||
end
|
end
|
||||||
|
|
||||||
add_to_serializer(:search_topic_list_item, 'include_assigned_to_user?') do
|
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
|
end
|
||||||
|
|
||||||
add_to_serializer(:search_topic_list_item, :assigned_to_group, false) do
|
add_to_serializer(:search_topic_list_item, :assigned_to_group, false) do
|
||||||
|
@ -454,7 +471,7 @@ after_initialize do
|
||||||
end
|
end
|
||||||
|
|
||||||
add_to_serializer(:search_topic_list_item, 'include_assigned_to_group?') do
|
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
|
end
|
||||||
|
|
||||||
# TopicsBulkAction
|
# TopicsBulkAction
|
||||||
|
@ -507,7 +524,7 @@ after_initialize do
|
||||||
end
|
end
|
||||||
|
|
||||||
add_to_serializer(:flagged_topic, :include_assigned_to_user?) do
|
add_to_serializer(:flagged_topic, :include_assigned_to_user?) do
|
||||||
object.assigned_to&.is_a?(User)
|
object.assignment&.assigned_to_user?
|
||||||
end
|
end
|
||||||
|
|
||||||
add_to_serializer(:flagged_topic, :assigned_to_group) do
|
add_to_serializer(:flagged_topic, :assigned_to_group) do
|
||||||
|
@ -515,7 +532,7 @@ after_initialize do
|
||||||
end
|
end
|
||||||
|
|
||||||
add_to_serializer(:flagged_topic, :include_assigned_to_group?) do
|
add_to_serializer(:flagged_topic, :include_assigned_to_group?) do
|
||||||
object.assigned_to&.is_a?(Group)
|
object.assignment&.assigned_to_group?
|
||||||
end
|
end
|
||||||
|
|
||||||
# Reviewable
|
# Reviewable
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue