discourse/app/models/reports/trust_level_growth.rb

78 lines
1.8 KiB
Ruby

# 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)
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