mirror of
https://github.com/discourse/discourse.git
synced 2025-05-30 15:28:37 +08:00
FIX: Make category change work with shared drafts (#11705)
It used to change the category of the topic, instead of the destination category (topic.category_id instead of topic.shared_draft.category_id). The shared drafts controls were displayed only if the current category matched the 'shared drafts category', which was not true for shared drafts that had their categories changed (affected by the previous bug).
This commit is contained in:
@ -319,39 +319,44 @@ class TopicsController < ApplicationController
|
||||
guardian.ensure_can_edit!(topic)
|
||||
|
||||
if params[:category_id] && (params[:category_id].to_i != topic.category_id.to_i)
|
||||
category = Category.find_by(id: params[:category_id])
|
||||
|
||||
if category || (params[:category_id].to_i == 0)
|
||||
guardian.ensure_can_move_topic_to_category!(category)
|
||||
if topic.shared_draft
|
||||
topic.shared_draft.update(category_id: params[:category_id])
|
||||
params.delete(:category_id)
|
||||
else
|
||||
return render_json_error(I18n.t('category.errors.not_found'))
|
||||
end
|
||||
category = Category.find_by(id: params[:category_id])
|
||||
|
||||
if category && topic_tags = (params[:tags] || topic.tags.pluck(:name)).reject { |c| c.empty? }
|
||||
if topic_tags.present?
|
||||
allowed_tags = DiscourseTagging.filter_allowed_tags(
|
||||
guardian,
|
||||
category: category
|
||||
).map(&:name)
|
||||
if category || (params[:category_id].to_i == 0)
|
||||
guardian.ensure_can_move_topic_to_category!(category)
|
||||
else
|
||||
return render_json_error(I18n.t('category.errors.not_found'))
|
||||
end
|
||||
|
||||
invalid_tags = topic_tags - allowed_tags
|
||||
if category && topic_tags = (params[:tags] || topic.tags.pluck(:name)).reject { |c| c.empty? }
|
||||
if topic_tags.present?
|
||||
allowed_tags = DiscourseTagging.filter_allowed_tags(
|
||||
guardian,
|
||||
category: category
|
||||
).map(&:name)
|
||||
|
||||
# Do not raise an error on a topic's hidden tags when not modifying tags
|
||||
if params[:tags].blank?
|
||||
invalid_tags.each do |tag_name|
|
||||
if DiscourseTagging.hidden_tag_names.include?(tag_name)
|
||||
invalid_tags.delete(tag_name)
|
||||
invalid_tags = topic_tags - allowed_tags
|
||||
|
||||
# Do not raise an error on a topic's hidden tags when not modifying tags
|
||||
if params[:tags].blank?
|
||||
invalid_tags.each do |tag_name|
|
||||
if DiscourseTagging.hidden_tag_names.include?(tag_name)
|
||||
invalid_tags.delete(tag_name)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
invalid_tags = Tag.where_name(invalid_tags).pluck(:name)
|
||||
invalid_tags = Tag.where_name(invalid_tags).pluck(:name)
|
||||
|
||||
if !invalid_tags.empty?
|
||||
if (invalid_tags & DiscourseTagging.hidden_tag_names).present?
|
||||
return render_json_error(I18n.t('category.errors.disallowed_tags_generic'))
|
||||
else
|
||||
return render_json_error(I18n.t('category.errors.disallowed_topic_tags', tags: invalid_tags.join(", ")))
|
||||
if !invalid_tags.empty?
|
||||
if (invalid_tags & DiscourseTagging.hidden_tag_names).present?
|
||||
return render_json_error(I18n.t('category.errors.disallowed_tags_generic'))
|
||||
else
|
||||
return render_json_error(I18n.t('category.errors.disallowed_topic_tags', tags: invalid_tags.join(", ")))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user