Skip to content
This repository was archived by the owner on Jul 14, 2025. It is now read-only.

Commit 08a01b2

Browse files
authored
FEATURE: add option to send individual report PM to group members (#369)
This change adds an option to the Schedule a PM with Data Explorer results script, which when selected will send individual PMs to each group member selected in the Send to User, Group or Email field. When this field is not checked, the functionality for groups will work as it did before (ie. send a single PM to the group).
1 parent 7922daf commit 08a01b2

File tree

4 files changed

+28
-4
lines changed

4 files changed

+28
-4
lines changed

config/locales/client.en.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ en:
118118
label: Skip sending PM if there are no results
119119
attach_csv:
120120
label: Attach the CSV file to the PM
121+
users_from_group:
122+
label: Send individual PM to each group member
121123
recurring_data_explorer_result_topic:
122124
fields:
123125
topic_id:

lib/discourse_data_explorer/report_generator.rb

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@ def self.generate(query_id, query_params, recipients, opts = {})
66
query = DiscourseDataExplorer::Query.find(query_id)
77
return [] if !query || recipients.empty?
88

9-
recipients = filter_recipients_by_query_access(recipients, query)
9+
recipients =
10+
filter_recipients_by_query_access(
11+
recipients,
12+
query,
13+
users_from_group: opts[:users_from_group],
14+
)
1015
params = params_to_hash(query_params)
1116

1217
result = DataExplorer.run_query(query, params)
@@ -114,7 +119,7 @@ def self.create_csv_upload(query, result)
114119
UploadCreator.new(tmp, tmp_filename, type: "csv_export").create_for(Discourse.system_user.id)
115120
end
116121

117-
def self.filter_recipients_by_query_access(recipients, query)
122+
def self.filter_recipients_by_query_access(recipients, query, users_from_group: false)
118123
users = User.where(username: recipients)
119124
groups = Group.where(name: recipients)
120125
emails = recipients - users.pluck(:username) - groups.pluck(:name)
@@ -126,7 +131,11 @@ def self.filter_recipients_by_query_access(recipients, query)
126131

127132
groups.each do |group|
128133
if group.id == Group::AUTO_GROUPS[:admins] || query.query_groups.exists?(group_id: group.id)
129-
result << [group.name, "group_name"]
134+
if users_from_group
135+
result.concat(group.users.pluck(:username).map { |username| [username, "username"] })
136+
else
137+
result << [group.name, "group_name"]
138+
end
130139
end
131140
end
132141

plugin.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ module ::DiscourseDataExplorer
8282
field :query_id, component: :choices, required: true, extra: { content: queries }
8383
field :query_params, component: :"key-value", accepts_placeholders: true
8484
field :skip_empty, component: :boolean
85+
field :users_from_group, component: :boolean
8586
field :attach_csv,
8687
component: :boolean,
8788
validator: ->(attach_csv) do
@@ -103,6 +104,7 @@ module ::DiscourseDataExplorer
103104
query_id = fields.dig("query_id", "value")
104105
query_params = fields.dig("query_params", "value") || {}
105106
skip_empty = fields.dig("skip_empty", "value") || false
107+
users_from_group = fields.dig("users_from_group", "value") || false
106108
attach_csv = fields.dig("attach_csv", "value") || false
107109

108110
unless SiteSetting.data_explorer_enabled
@@ -120,7 +122,7 @@ module ::DiscourseDataExplorer
120122
query_id,
121123
query_params,
122124
recipients,
123-
{ skip_empty:, attach_csv:, render_url_columns: true },
125+
{ skip_empty:, users_from_group:, attach_csv:, render_url_columns: true },
124126
)
125127
.each do |pm|
126128
begin

spec/report_generator_spec.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,17 @@
175175
expect(result[2]["target_emails"]).to eq(["[email protected]"])
176176
end
177177

178+
it "extracts users from group when option is selected" do
179+
Fabricate(:query_group, query: query, group: group)
180+
DiscourseDataExplorer::ResultToMarkdown.expects(:convert).returns("le table")
181+
freeze_time
182+
183+
result =
184+
described_class.generate(query.id, query_params, [group.name], { users_from_group: true })
185+
expect(result.length).to eq(1)
186+
expect(result[0]["target_usernames"]).to eq([user.username])
187+
end
188+
178189
it "works with attached csv file" do
179190
SiteSetting.personal_message_enabled_groups = group.id
180191
DiscourseDataExplorer::ResultToMarkdown.expects(:convert).returns("le table")

0 commit comments

Comments
 (0)