FEATURE: adds trust_level_growth report (#8878)

This commit is contained in:
Joffrey JAFFEUX 2020-02-06 19:44:30 +01:00 committed by GitHub
parent 4b6a47be48
commit 20944e69e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 127 additions and 1 deletions

View File

@ -101,7 +101,6 @@ export default Component.extend({
moment(tooltipItem[0].xLabel, "YYYY-MM-DD").format("LL")
}
},
legend: { display: false },
layout: {
padding: {
left: 0,

View File

@ -380,3 +380,4 @@ require_relative "reports/time_to_first_response"
require_relative "reports/topics_with_no_response"
require_relative "reports/emails"
require_relative "reports/web_crawlers"
require_relative "reports/trust_level_growth"

View File

@ -0,0 +1,78 @@
# frozen_string_literal: true
Report.add_report("trust_level_growth") do |report|
report.modes = [:stacked_chart]
filters = %w[
tl1_reached
tl2_reached
tl3_reached
tl4_reached
]
sql = <<~SQL
SELECT
date(created_at),
(
count(*) filter (WHERE previous_value::integer < 1 AND new_value = '1')
) as tl1_reached,
(
count(*) filter (WHERE previous_value::integer < 2 AND new_value = '2')
) as tl2_reached,
(
count(*) filter (WHERE previous_value::integer < 3 AND new_value = '3')
) as tl3_reached,
(
count(*) filter (WHERE previous_value::integer < 4 AND new_value = '4')
) as tl4_reached
FROM user_histories
WHERE (
created_at >= '#{report.start_date}'
AND created_at <= '#{report.end_date}'
)
AND (
action = #{UserHistory.actions[:change_trust_level]}
OR action = #{UserHistory.actions[:auto_trust_level_change]}
)
GROUP BY date(created_at)
LIMIT #{report.limit || 250}
SQL
data = Hash[ filters.collect { |x| [x, []] } ]
builder = DB.build(sql)
builder.query.each do |row|
filters.each do |filter|
data[filter] << {
x: row.date.strftime("%Y-%m-%d"),
y: row.instance_variable_get("@#{filter}")
}
end
end
tertiary = ColorScheme.hex_for_name('tertiary') || '0088cc'
quaternary = ColorScheme.hex_for_name('quaternary') || 'e45735'
requests = filters.map do |filter|
color = report.rgba_color(quaternary)
if filter == "tl1_reached"
color = report.lighten_color(tertiary, 0.25)
end
if filter == "tl2_reached"
color = report.rgba_color(tertiary)
end
if filter == "tl3_reached"
color = report.lighten_color(quaternary, 0.25)
end
{
req: filter,
label: I18n.t("reports.trust_level_growth.xaxis.#{filter}"),
color: color,
data: data[filter]
}
end
report.data = requests
end

View File

@ -1105,6 +1105,15 @@ en:
xaxis: "Day"
yaxis: "Number of new contributors"
description: "Number of users who made their first post during this period."
trust_level_growth:
title: "Trust Level growth"
xaxis:
tl1_reached: "Reached TL1"
tl2_reached: "Reached TL2"
tl3_reached: "Reached TL3"
tl4_reached: "Reached TL4"
yaxis: "Day"
description: "Number of users who increased their Trust Level during this period."
consolidated_page_views:
title: "Consolidated Pageviews"
xaxis:

View File

@ -1193,4 +1193,43 @@ describe Report do
end
end
end
describe "trust_level_growth" do
before do
freeze_time(Time.now.at_midnight)
Theme.clear_default!
end
let(:reports) { Report.find('trust_level_growth') }
context "with no data" do
it "works" do
reports.data.each do |report|
expect(report[:data]).to be_empty
end
end
end
context "with data" do
fab!(:gwen) { Fabricate(:user) }
fab!(:martin) { Fabricate(:user) }
before do
UserHistory.create(action: UserHistory.actions[:auto_trust_level_change], target_user_id: gwen.id, new_value: TrustLevel[2], previous_value: 1)
UserHistory.create(action: UserHistory.actions[:change_trust_level], target_user_id: martin.id, new_value: TrustLevel[4], previous_value: 0)
end
it "works" do
tl1_reached = reports.data.find { |r| r[:req] == "tl1_reached" }
tl2_reached = reports.data.find { |r| r[:req] == "tl2_reached" }
tl3_reached = reports.data.find { |r| r[:req] == "tl3_reached" }
tl4_reached = reports.data.find { |r| r[:req] == "tl4_reached" }
expect(tl1_reached[:data][0][:y]).to eql(0)
expect(tl2_reached[:data][0][:y]).to eql(1)
expect(tl3_reached[:data][0][:y]).to eql(0)
expect(tl4_reached[:data][0][:y]).to eql(1)
end
end
end
end