This reverts commit a1c8f4ee9d
.
This commit is contained in:
parent
3f8b67d1c1
commit
f15c0fddf3
|
@ -23,6 +23,8 @@ export default class Rule extends RestModel {
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
possible_filters_id = ["thread", "watch", "follow", "mute"];
|
||||||
|
|
||||||
get available_filters() {
|
get available_filters() {
|
||||||
const available = [];
|
const available = [];
|
||||||
const provider = this.channel.provider;
|
const provider = this.channel.provider;
|
||||||
|
@ -46,11 +48,6 @@ export default class Rule extends RestModel {
|
||||||
name: I18n.t("chat_integration.filter.follow"),
|
name: I18n.t("chat_integration.filter.follow"),
|
||||||
icon: "circle",
|
icon: "circle",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
id: "tag_added",
|
|
||||||
name: I18n.t("chat_integration.filter.tag_added"),
|
|
||||||
icon: "tag",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
id: "mute",
|
id: "mute",
|
||||||
name: I18n.t("chat_integration.filter.mute"),
|
name: I18n.t("chat_integration.filter.mute"),
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { action } from "@ember/object";
|
import { action } from "@ember/object";
|
||||||
|
import { getOwner } from "@ember/owner";
|
||||||
import Group from "discourse/models/group";
|
import Group from "discourse/models/group";
|
||||||
import DiscourseRoute from "discourse/routes/discourse";
|
import DiscourseRoute from "discourse/routes/discourse";
|
||||||
|
|
||||||
|
@ -13,10 +14,14 @@ export default class AdminPluginsChatIntegrationProvider extends DiscourseRoute
|
||||||
Group.findAll(),
|
Group.findAll(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
const enabledFilters =
|
||||||
|
getOwner(this).lookup("model:rule").possible_filters_id;
|
||||||
channels.forEach((channel) => {
|
channels.forEach((channel) => {
|
||||||
channel.set(
|
channel.set(
|
||||||
"rules",
|
"rules",
|
||||||
channel.rules.map((rule) => {
|
channel.rules
|
||||||
|
.filter((rule) => enabledFilters.includes(rule.filter))
|
||||||
|
.map((rule) => {
|
||||||
rule = this.store.createRecord("rule", rule);
|
rule = this.store.createRecord("rule", rule);
|
||||||
rule.set("channel", channel);
|
rule.set("channel", channel);
|
||||||
return rule;
|
return rule;
|
||||||
|
|
|
@ -15,11 +15,11 @@ module DiscourseChatIntegration
|
||||||
# Abort if the post is blank
|
# Abort if the post is blank
|
||||||
return if post.blank?
|
return if post.blank?
|
||||||
|
|
||||||
# Abort if post is not either regular, or a 'tags_changed'/'category_changed' small action
|
# Abort if post is not either regular or a 'category_changed' small action
|
||||||
if (post.post_type != Post.types[:regular]) &&
|
if (post.post_type != Post.types[:regular]) &&
|
||||||
!(
|
!(
|
||||||
post.post_type == Post.types[:small_action] &&
|
post.post_type == Post.types[:small_action] &&
|
||||||
%w[tags_changed category_changed].include?(post.action_code)
|
%w[category_changed].include?(post.action_code)
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
@ -55,34 +55,7 @@ module DiscourseChatIntegration
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if post.action_code == "tags_changed"
|
matching_rules = matching_rules.select { |rule| rule.filter != "tag_added" } # ignore tag_added rules, now uses Automation
|
||||||
# Post is a small_action post regarding tags changing for the topic. Check if any tags were _added_
|
|
||||||
# and if so, corresponding rules with `filter: tag_added`
|
|
||||||
tags_added = post.custom_fields["tags_added"]
|
|
||||||
tags_added = [tags_added].compact if !tags_added.is_a?(Array)
|
|
||||||
return if tags_added.blank?
|
|
||||||
|
|
||||||
tags_removed = post.custom_fields["tags_removed"]
|
|
||||||
tags_removed = [tags_removed].compact if !tags_removed.is_a?(Array)
|
|
||||||
|
|
||||||
unchanged_tags = topic.tags.map(&:name) - tags_added - tags_removed
|
|
||||||
|
|
||||||
matching_rules =
|
|
||||||
matching_rules.select do |rule|
|
|
||||||
# Only rules that match this post, are ones where the filter is "tag_added"
|
|
||||||
next false if rule.filter != "tag_added"
|
|
||||||
next true if rule.tags.blank?
|
|
||||||
|
|
||||||
# Skip if the topic already has one of the tags in the rule, applied
|
|
||||||
next false if unchanged_tags.any? && (unchanged_tags & rule.tags).any?
|
|
||||||
|
|
||||||
# We don't need to do any additional filtering here because topics are filtered
|
|
||||||
# by tag later
|
|
||||||
true
|
|
||||||
end
|
|
||||||
else
|
|
||||||
matching_rules = matching_rules.select { |rule| rule.filter != "tag_added" }
|
|
||||||
end
|
|
||||||
|
|
||||||
# If tagging is enabled, thow away rules that don't apply to this topic
|
# If tagging is enabled, thow away rules that don't apply to this topic
|
||||||
if SiteSetting.tagging_enabled
|
if SiteSetting.tagging_enabled
|
||||||
|
@ -97,7 +70,7 @@ module DiscourseChatIntegration
|
||||||
|
|
||||||
# Sort by order of precedence
|
# Sort by order of precedence
|
||||||
t_prec = { "group_message" => 0, "group_mention" => 1, "normal" => 2 } # Group things win
|
t_prec = { "group_message" => 0, "group_mention" => 1, "normal" => 2 } # Group things win
|
||||||
f_prec = { "mute" => 0, "thread" => 1, "watch" => 2, "follow" => 3, "tag_added" => 4 } #(mute always wins; thread beats watch beats follow)
|
f_prec = { "mute" => 0, "thread" => 1, "watch" => 2, "follow" => 3 } #(mute always wins; thread beats watch beats follow)
|
||||||
sort_func =
|
sort_func =
|
||||||
proc { |a, b| [t_prec[a.type], f_prec[a.filter]] <=> [t_prec[b.type], f_prec[b.filter]] }
|
proc { |a, b| [t_prec[a.type], f_prec[a.filter]] <=> [t_prec[b.type], f_prec[b.filter]] }
|
||||||
matching_rules = matching_rules.sort(&sort_func)
|
matching_rules = matching_rules.sort(&sort_func)
|
||||||
|
|
|
@ -37,7 +37,6 @@ en:
|
||||||
mute: 'Mute'
|
mute: 'Mute'
|
||||||
follow: 'First post only'
|
follow: 'First post only'
|
||||||
watch: 'All posts and replies'
|
watch: 'All posts and replies'
|
||||||
tag_added: 'Tag added to topic'
|
|
||||||
thread: 'All posts with threaded replies'
|
thread: 'All posts with threaded replies'
|
||||||
rule_table:
|
rule_table:
|
||||||
filter: "Filter"
|
filter: "Filter"
|
||||||
|
|
|
@ -316,38 +316,6 @@ RSpec.describe DiscourseChatIntegration::Manager do
|
||||||
expect(provider.sent_to_channel_ids).to contain_exactly(chan1.id)
|
expect(provider.sent_to_channel_ids).to contain_exactly(chan1.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "With `create_post_for_category_and_tag_changes` enabled" do
|
|
||||||
before(:each) { SiteSetting.create_post_for_category_and_tag_changes = true }
|
|
||||||
|
|
||||||
let(:admin) { Fabricate(:admin) }
|
|
||||||
let(:other_topic) { Fabricate(:topic) }
|
|
||||||
let(:other_topic_post) { Fabricate(:post, topic: topic) }
|
|
||||||
|
|
||||||
it "should trigger follow rules for specific categories when topic category changes" do
|
|
||||||
DiscourseChatIntegration::Rule.create!(
|
|
||||||
channel: chan1,
|
|
||||||
filter: "follow",
|
|
||||||
category_id: category.id,
|
|
||||||
)
|
|
||||||
|
|
||||||
PostRevisor.new(other_topic_post).revise!(admin, category_id: category.id)
|
|
||||||
|
|
||||||
manager.trigger_notifications(topic.ordered_posts.last.id)
|
|
||||||
|
|
||||||
expect(provider.sent_to_channel_ids).to contain_exactly(chan1.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "shouldn't trigger follow rules with wildcard category match" do
|
|
||||||
DiscourseChatIntegration::Rule.create!(channel: chan1, filter: "follow", category_id: nil)
|
|
||||||
|
|
||||||
PostRevisor.new(other_topic_post).revise!(admin, category_id: category.id)
|
|
||||||
|
|
||||||
manager.trigger_notifications(topic.ordered_posts.last.id)
|
|
||||||
|
|
||||||
expect(provider.sent_to_channel_ids).to contain_exactly
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "with tags enabled" do
|
describe "with tags enabled" do
|
||||||
let(:tag) { Fabricate(:tag, name: "gsoc") }
|
let(:tag) { Fabricate(:tag, name: "gsoc") }
|
||||||
let(:tagged_topic) { Fabricate(:topic, category_id: category.id, tags: [tag]) }
|
let(:tagged_topic) { Fabricate(:topic, category_id: category.id, tags: [tag]) }
|
||||||
|
@ -377,82 +345,6 @@ RSpec.describe DiscourseChatIntegration::Manager do
|
||||||
|
|
||||||
expect(provider.sent_to_channel_ids).to contain_exactly(chan1.id)
|
expect(provider.sent_to_channel_ids).to contain_exactly(chan1.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "with create_small_action_post_for_tag_changes enabled" do
|
|
||||||
fab!(:admin) { Fabricate(:admin, refresh_auto_groups: true) }
|
|
||||||
fab!(:additional_tag) { Fabricate(:tag) }
|
|
||||||
|
|
||||||
before { SiteSetting.create_post_for_category_and_tag_changes = true }
|
|
||||||
|
|
||||||
def set_new_tags_and_return_small_action_post(tags)
|
|
||||||
PostRevisor.new(tagged_first_post).revise!(admin, tags: tags)
|
|
||||||
|
|
||||||
tagged_topic.ordered_posts.last
|
|
||||||
end
|
|
||||||
|
|
||||||
it "should notify when rule is set up for tag additions for a category with no tag filter" do
|
|
||||||
post = set_new_tags_and_return_small_action_post([tag.name, additional_tag.name])
|
|
||||||
|
|
||||||
DiscourseChatIntegration::Rule.create!(
|
|
||||||
channel: chan1,
|
|
||||||
filter: "tag_added",
|
|
||||||
category_id: category.id,
|
|
||||||
)
|
|
||||||
|
|
||||||
manager.trigger_notifications(post.id)
|
|
||||||
expect(provider.sent_to_channel_ids).to contain_exactly(chan1.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "notifies when topic has a tag added that matches the rule" do
|
|
||||||
post = set_new_tags_and_return_small_action_post([tag.name, additional_tag.name])
|
|
||||||
|
|
||||||
DiscourseChatIntegration::Rule.create!(
|
|
||||||
channel: chan1,
|
|
||||||
filter: "tag_added",
|
|
||||||
category_id: category.id,
|
|
||||||
tags: [additional_tag.name],
|
|
||||||
)
|
|
||||||
|
|
||||||
manager.trigger_notifications(post.id)
|
|
||||||
expect(provider.sent_to_channel_ids).to contain_exactly(chan1.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "doesn't notify when a new regular post is created" do
|
|
||||||
DiscourseChatIntegration::Rule.create!(
|
|
||||||
channel: chan1,
|
|
||||||
filter: "tag_added",
|
|
||||||
category_id: nil,
|
|
||||||
tags: [tag.name],
|
|
||||||
)
|
|
||||||
|
|
||||||
post = Fabricate(:post, topic: tagged_topic)
|
|
||||||
manager.trigger_notifications(post.id)
|
|
||||||
expect(provider.sent_to_channel_ids).to contain_exactly
|
|
||||||
end
|
|
||||||
|
|
||||||
it "doesn't notify when topic has an unchanged tag present in the rule, even if a new tag is added" do
|
|
||||||
post = set_new_tags_and_return_small_action_post([tag.name, additional_tag.name])
|
|
||||||
|
|
||||||
DiscourseChatIntegration::Rule.create!(
|
|
||||||
channel: chan1,
|
|
||||||
filter: "tag_added",
|
|
||||||
category_id: category.id,
|
|
||||||
tags: [tag.name],
|
|
||||||
)
|
|
||||||
|
|
||||||
manager.trigger_notifications(post.id)
|
|
||||||
expect(provider.sent_to_channel_ids).to contain_exactly
|
|
||||||
end
|
|
||||||
|
|
||||||
it "doesn't notify for small action 'tags_changed' posts unless a matching rule exists" do
|
|
||||||
post = set_new_tags_and_return_small_action_post([additional_tag.name])
|
|
||||||
|
|
||||||
DiscourseChatIntegration::Rule.create!(channel: chan1, filter: "watch", category_id: nil) # Wildcard watch
|
|
||||||
|
|
||||||
manager.trigger_notifications(post.id)
|
|
||||||
expect(provider.sent_to_channel_ids).to contain_exactly
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue