FIX: correctly take category/group filters into csv export (#9300)
This commit is contained in:
parent
f8cb46c0e1
commit
aeaea3c154
|
@ -7,6 +7,10 @@ module Jobs
|
||||||
class ExportCsvFile < ::Jobs::Base
|
class ExportCsvFile < ::Jobs::Base
|
||||||
sidekiq_options retry: false
|
sidekiq_options retry: false
|
||||||
|
|
||||||
|
attr_accessor :extra
|
||||||
|
attr_accessor :current_user
|
||||||
|
attr_accessor :entity
|
||||||
|
|
||||||
HEADER_ATTRS_FOR ||= HashWithIndifferentAccess.new(
|
HEADER_ATTRS_FOR ||= HashWithIndifferentAccess.new(
|
||||||
user_archive: ['topic_title', 'categories', 'is_pm', 'post', 'like_count', 'reply_count', 'url', 'created_at'],
|
user_archive: ['topic_title', 'categories', 'is_pm', 'post', 'like_count', 'reply_count', 'url', 'created_at'],
|
||||||
user_list: ['id', 'name', 'username', 'email', 'title', 'created_at', 'last_seen_at', 'last_posted_at', 'last_emailed_at', 'trust_level', 'approved', 'suspended_at', 'suspended_till', 'silenced_till', 'active', 'admin', 'moderator', 'ip_address', 'staged', 'secondary_emails'],
|
user_list: ['id', 'name', 'username', 'email', 'title', 'created_at', 'last_seen_at', 'last_posted_at', 'last_emailed_at', 'trust_level', 'approved', 'suspended_at', 'suspended_till', 'silenced_till', 'active', 'admin', 'moderator', 'ip_address', 'staged', 'secondary_emails'],
|
||||||
|
@ -180,8 +184,13 @@ module Jobs
|
||||||
|
|
||||||
@extra[:start_date] = @extra[:start_date].to_date.beginning_of_day if @extra[:start_date].is_a?(String)
|
@extra[:start_date] = @extra[:start_date].to_date.beginning_of_day if @extra[:start_date].is_a?(String)
|
||||||
@extra[:end_date] = @extra[:end_date].to_date.end_of_day if @extra[:end_date].is_a?(String)
|
@extra[:end_date] = @extra[:end_date].to_date.end_of_day if @extra[:end_date].is_a?(String)
|
||||||
@extra[:category_id] = @extra[:category_id].present? ? @extra[:category_id].to_i : nil
|
@extra[:filters] = {}
|
||||||
@extra[:group_id] = @extra[:group_id].present? ? @extra[:group_id].to_i : nil
|
if @extra[:category_id].present?
|
||||||
|
@extra[:filters][:category] = @extra[:category_id].to_i
|
||||||
|
end
|
||||||
|
if @extra[:group_id].present?
|
||||||
|
@extra[:filters][:group] = @extra[:group_id].to_i
|
||||||
|
end
|
||||||
|
|
||||||
report = Report.find(@extra[:name], @extra)
|
report = Report.find(@extra[:name], @extra)
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@ describe Jobs::ExportCsvFile do
|
||||||
post = Fabricate(:post, topic: topic, user: user)
|
post = Fabricate(:post, topic: topic, user: user)
|
||||||
|
|
||||||
exporter = Jobs::ExportCsvFile.new
|
exporter = Jobs::ExportCsvFile.new
|
||||||
exporter.instance_variable_set(:@current_user, User.find_by(id: user.id))
|
exporter.current_user = User.find_by(id: user.id)
|
||||||
|
|
||||||
rows = []
|
rows = []
|
||||||
exporter.user_archive_export { |row| rows << row }
|
exporter.user_archive_export { |row| rows << row }
|
||||||
|
@ -79,9 +79,9 @@ describe Jobs::ExportCsvFile do
|
||||||
|
|
||||||
let(:exporter) do
|
let(:exporter) do
|
||||||
exporter = Jobs::ExportCsvFile.new
|
exporter = Jobs::ExportCsvFile.new
|
||||||
exporter.instance_variable_set(:@entity, 'report')
|
exporter.entity = 'report'
|
||||||
exporter.instance_variable_set(:@extra, HashWithIndifferentAccess.new(start_date: '2010-01-01', end_date: '2011-01-01'))
|
exporter.extra = HashWithIndifferentAccess.new(start_date: '2010-01-01', end_date: '2011-01-01')
|
||||||
exporter.instance_variable_set(:@current_user, User.find_by(id: user.id))
|
exporter.current_user = User.find_by(id: user.id)
|
||||||
exporter
|
exporter
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ describe Jobs::ExportCsvFile do
|
||||||
user.user_visits.create!(visited_at: '2010-01-01', posts_read: 42)
|
user.user_visits.create!(visited_at: '2010-01-01', posts_read: 42)
|
||||||
Fabricate(:user).user_visits.create!(visited_at: '2010-01-03', posts_read: 420)
|
Fabricate(:user).user_visits.create!(visited_at: '2010-01-03', posts_read: 420)
|
||||||
|
|
||||||
exporter.instance_variable_get(:@extra)['name'] = 'dau_by_mau'
|
exporter.extra['name'] = 'dau_by_mau'
|
||||||
report = exporter.report_export.to_a
|
report = exporter.report_export.to_a
|
||||||
|
|
||||||
expect(report.first).to contain_exactly("Day", "Percent")
|
expect(report.first).to contain_exactly("Day", "Percent")
|
||||||
|
@ -97,11 +97,28 @@ describe Jobs::ExportCsvFile do
|
||||||
expect(report.third).to contain_exactly("2010-01-03", "50.0")
|
expect(report.third).to contain_exactly("2010-01-03", "50.0")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'works with filters' do
|
||||||
|
user.user_visits.create!(visited_at: '2010-01-01', posts_read: 42)
|
||||||
|
|
||||||
|
group = Fabricate(:group)
|
||||||
|
user1 = Fabricate(:user)
|
||||||
|
group_user = Fabricate(:group_user, group: group, user: user1)
|
||||||
|
user1.user_visits.create!(visited_at: '2010-01-03', posts_read: 420)
|
||||||
|
|
||||||
|
exporter.extra['name'] = 'visits'
|
||||||
|
exporter.extra['group_id'] = group.id
|
||||||
|
report = exporter.report_export.to_a
|
||||||
|
|
||||||
|
expect(report.length).to eq(2)
|
||||||
|
expect(report.first).to contain_exactly("Day", "Count")
|
||||||
|
expect(report.second).to contain_exactly("2010-01-03", "1")
|
||||||
|
end
|
||||||
|
|
||||||
it 'works with single-column reports with default label' do
|
it 'works with single-column reports with default label' do
|
||||||
user.user_visits.create!(visited_at: '2010-01-01')
|
user.user_visits.create!(visited_at: '2010-01-01')
|
||||||
Fabricate(:user).user_visits.create!(visited_at: '2010-01-03')
|
Fabricate(:user).user_visits.create!(visited_at: '2010-01-03')
|
||||||
|
|
||||||
exporter.instance_variable_get(:@extra)['name'] = 'visits'
|
exporter.extra['name'] = 'visits'
|
||||||
report = exporter.report_export.to_a
|
report = exporter.report_export.to_a
|
||||||
|
|
||||||
expect(report.first).to contain_exactly("Day", "Count")
|
expect(report.first).to contain_exactly("Day", "Count")
|
||||||
|
@ -113,7 +130,7 @@ describe Jobs::ExportCsvFile do
|
||||||
DiscourseIpInfo.stubs(:get).with("1.1.1.1").returns(location: "Earth")
|
DiscourseIpInfo.stubs(:get).with("1.1.1.1").returns(location: "Earth")
|
||||||
user.user_auth_token_logs.create!(action: "login", client_ip: "1.1.1.1", created_at: '2010-01-01')
|
user.user_auth_token_logs.create!(action: "login", client_ip: "1.1.1.1", created_at: '2010-01-01')
|
||||||
|
|
||||||
exporter.instance_variable_get(:@extra)['name'] = 'staff_logins'
|
exporter.extra['name'] = 'staff_logins'
|
||||||
report = exporter.report_export.to_a
|
report = exporter.report_export.to_a
|
||||||
|
|
||||||
expect(report.first).to contain_exactly("User", "Location", "Login at")
|
expect(report.first).to contain_exactly("User", "Location", "Login at")
|
||||||
|
@ -133,7 +150,7 @@ describe Jobs::ExportCsvFile do
|
||||||
ApplicationRequest.create!(date: '2010-01-02', req_type: 'page_view_crawler', count: 8)
|
ApplicationRequest.create!(date: '2010-01-02', req_type: 'page_view_crawler', count: 8)
|
||||||
ApplicationRequest.create!(date: '2010-01-03', req_type: 'page_view_crawler', count: 9)
|
ApplicationRequest.create!(date: '2010-01-03', req_type: 'page_view_crawler', count: 9)
|
||||||
|
|
||||||
exporter.instance_variable_get(:@extra)['name'] = 'consolidated_page_views'
|
exporter.extra['name'] = 'consolidated_page_views'
|
||||||
report = exporter.report_export.to_a
|
report = exporter.report_export.to_a
|
||||||
|
|
||||||
expect(report[0]).to contain_exactly("Day", "Logged in users", "Anonymous users", "Crawlers")
|
expect(report[0]).to contain_exactly("Day", "Logged in users", "Anonymous users", "Crawlers")
|
||||||
|
|
Loading…
Reference in New Issue