DEV: Improve support for plugins. (#7332)

* DEV: Allow NewPostManager handlers handle PMs.
* DEV: Add custom fields topic option to PostCreator.
* DEV: Add topic_id to serializer data.
* DEV: Wrap topic title from notification item in a span.
This commit is contained in:
Dan Ungureanu 2019-05-25 16:53:03 +03:00 committed by GitHub
parent 6398ded798
commit da39d66e83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 29 additions and 18 deletions

View File

@ -724,6 +724,7 @@ const Composer = RestModel.extend({
} }
const props = { const props = {
topic_id: this.topic.id,
raw: this.reply, raw: this.reply,
raw_old: this.editConflict ? null : this.originalText, raw_old: this.editConflict ? null : this.originalText,
edit_reason: opts.editReason, edit_reason: opts.editReason,

View File

@ -85,6 +85,11 @@ createWidget("notification-item", {
} }
if (this.attrs.fancy_title) { if (this.attrs.fancy_title) {
if (this.attrs.topic_id) {
return `<span data-topic-id="${this.attrs.topic_id}">${
this.attrs.fancy_title
}</span>`;
}
return this.attrs.fancy_title; return this.attrs.fancy_title;
} }

View File

@ -169,7 +169,7 @@
display: none; display: none;
} }
span { span:first-child {
color: $primary; color: $primary;
} }

View File

@ -671,7 +671,7 @@
margin-right: 0.5em; margin-right: 0.5em;
} }
span { span:first-child {
color: $primary; color: $primary;
} }

View File

@ -102,7 +102,7 @@
p { p {
display: inline-block; display: inline-block;
span { span:first-child {
color: $primary; color: $primary;
} }
} }

View File

@ -22,7 +22,7 @@ class NewPostManager
end end
def self.clear_handlers! def self.clear_handlers!
@sorted_handlers = [{ priority: 0, proc: method(:default_handler) }] @sorted_handlers = []
end end
def self.add_handler(priority = 0, &block) def self.add_handler(priority = 0, &block)
@ -178,22 +178,17 @@ class NewPostManager
return result return result
end end
# We never queue private messages
return perform_create_post if @args[:archetype] == Archetype.private_message
if args[:topic_id] && Topic.where(id: args[:topic_id], archetype: Archetype.private_message).exists?
return perform_create_post
end
# Perform handlers until one returns a result # Perform handlers until one returns a result
handled = NewPostManager.handlers.any? do |handler| NewPostManager.handlers.any? do |handler|
result = handler.call(self) result = handler.call(self)
return result if result return result if result
false
end end
perform_create_post unless handled # We never queue private messages
return perform_create_post if @args[:archetype] == Archetype.private_message ||
(args[:topic_id] && Topic.where(id: args[:topic_id], archetype: Archetype.private_message).exists?)
NewPostManager.default_handler(self) || perform_create_post
end end
# Enqueue this post # Enqueue this post

View File

@ -56,6 +56,7 @@ class PostCreator
# pinned_at - Topic pinned time (optional) # pinned_at - Topic pinned time (optional)
# pinned_globally - Is the topic pinned globally (optional) # pinned_globally - Is the topic pinned globally (optional)
# shared_draft - Is the topic meant to be a shared draft # shared_draft - Is the topic meant to be a shared draft
# topic_opts - Options to be overwritten for topic
# #
def initialize(user, opts) def initialize(user, opts)
# TODO: we should reload user in case it is tainted, should take in a user_id as opposed to user # TODO: we should reload user in case it is tainted, should take in a user_id as opposed to user
@ -410,7 +411,8 @@ class PostCreator
def create_topic def create_topic
return if @topic return if @topic
begin begin
topic_creator = TopicCreator.new(@user, guardian, @opts) opts = @opts[:topic_opts] ? @opts.merge(@opts[:topic_opts]) : @opts
topic_creator = TopicCreator.new(@user, guardian, opts)
@topic = topic_creator.create @topic = topic_creator.create
rescue ActiveRecord::Rollback rescue ActiveRecord::Rollback
rollback_from_errors!(topic_creator) rollback_from_errors!(topic_creator)

View File

@ -37,6 +37,9 @@ class TopicCreator
def create def create
topic = Topic.new(setup_topic_params) topic = Topic.new(setup_topic_params)
setup_tags(topic) setup_tags(topic)
if fields = @opts[:custom_fields]
topic.custom_fields = fields
end
DiscourseEvent.trigger(:before_create_topic, topic, self) DiscourseEvent.trigger(:before_create_topic, topic, self)

View File

@ -212,7 +212,7 @@ describe NewPostManager do
handler = -> { nil } handler = -> { nil }
NewPostManager.add_handler(&handler) NewPostManager.add_handler(&handler)
expect(NewPostManager.handlers).to eq([default_handler, handler]) expect(NewPostManager.handlers).to eq([handler])
end end
it "can be added in high priority" do it "can be added in high priority" do
@ -223,7 +223,7 @@ describe NewPostManager do
NewPostManager.add_handler(100, &a) NewPostManager.add_handler(100, &a)
NewPostManager.add_handler(50, &b) NewPostManager.add_handler(50, &b)
NewPostManager.add_handler(101, &c) NewPostManager.add_handler(101, &c)
expect(NewPostManager.handlers).to eq([c, a, b, default_handler]) expect(NewPostManager.handlers).to eq([c, a, b])
end end
end end

View File

@ -54,6 +54,11 @@ describe PostCreator do
expect { creator.create }.to raise_error(Discourse::InvalidAccess) expect { creator.create }.to raise_error(Discourse::InvalidAccess)
end end
it "can be created with custom fields" do
post = PostCreator.create(user, basic_topic_params.merge(topic_opts: { custom_fields: { hello: "world" } }))
expect(post.topic.custom_fields).to eq("hello" => "world")
end
context "reply to post number" do context "reply to post number" do
it "omits reply to post number if received on a new topic" do it "omits reply to post number if received on a new topic" do
p = PostCreator.new(user, basic_topic_params.merge(reply_to_post_number: 3)).create p = PostCreator.new(user, basic_topic_params.merge(reply_to_post_number: 3)).create