diff --git a/app/assets/javascripts/admin/helpers/report_helpers.js b/app/assets/javascripts/admin/helpers/report_helpers.js
index c71878d6d65..2f4277ddc05 100644
--- a/app/assets/javascripts/admin/helpers/report_helpers.js
+++ b/app/assets/javascripts/admin/helpers/report_helpers.js
@@ -36,3 +36,21 @@ Handlebars.registerHelper('sumLast', function(property, numDays) {
return sum;
}
});
+
+/**
+ Return the count of users at the given trust level.
+
+ @method valueAtTrustLevel
+ @for Handlebars
+**/
+Handlebars.registerHelper('valueAtTrustLevel', function(property, trustLevel) {
+ var data = Ember.Handlebars.get(this, property);
+ if( data ) {
+ var item = data.find( function(d, i, arr) { return parseInt(d.x,10) === parseInt(trustLevel,10); } );
+ if( item ) {
+ return item.y;
+ } else {
+ return 0;
+ }
+ }
+});
\ No newline at end of file
diff --git a/app/assets/javascripts/admin/templates/dashboard.js.handlebars b/app/assets/javascripts/admin/templates/dashboard.js.handlebars
index bd4cde74b2c..d2e65154042 100644
--- a/app/assets/javascripts/admin/templates/dashboard.js.handlebars
+++ b/app/assets/javascripts/admin/templates/dashboard.js.handlebars
@@ -38,12 +38,27 @@
-
+
+
+ {{i18n admin.dashboard.total_users}}: {{#unless loading}}{{ totalUsers }}{{/unless}}
+
+
+
-
- {{i18n admin.dashboard.total_users}} |
- {{#unless loading}}{{ totalUsers }}{{/unless}} |
-
+
+
+ |
+ 0 |
+ 1 |
+ 2 |
+ 3 |
+ 4 |
+ 5 |
+
+
+ {{#unless loading}}
+ {{ render 'admin_report_trust_levels' users_by_trust_level }}
+ {{/unless}}
diff --git a/app/assets/javascripts/admin/templates/reports/trust_levels_report.js.handlebars b/app/assets/javascripts/admin/templates/reports/trust_levels_report.js.handlebars
new file mode 100644
index 00000000000..842705c2c35
--- /dev/null
+++ b/app/assets/javascripts/admin/templates/reports/trust_levels_report.js.handlebars
@@ -0,0 +1,9 @@
+
+ {{title}} |
+ {{valueAtTrustLevel data 0}} |
+ {{valueAtTrustLevel data 1}} |
+ {{valueAtTrustLevel data 2}} |
+ {{valueAtTrustLevel data 3}} |
+ {{valueAtTrustLevel data 4}} |
+ {{valueAtTrustLevel data 5}} |
+
\ No newline at end of file
diff --git a/app/assets/javascripts/admin/views/report/admin_report_trust_levels_view.js b/app/assets/javascripts/admin/views/report/admin_report_trust_levels_view.js
new file mode 100644
index 00000000000..1731ff38214
--- /dev/null
+++ b/app/assets/javascripts/admin/views/report/admin_report_trust_levels_view.js
@@ -0,0 +1,4 @@
+Discourse.AdminReportTrustLevelsView = Discourse.View.extend({
+ templateName: 'admin/templates/reports/trust_levels_report',
+ tagName: 'tbody'
+});
\ No newline at end of file
diff --git a/app/assets/stylesheets/admin/admin_base.scss b/app/assets/stylesheets/admin/admin_base.scss
index 2d6a1e38c9b..826de9a001c 100644
--- a/app/assets/stylesheets/admin/admin_base.scss
+++ b/app/assets/stylesheets/admin/admin_base.scss
@@ -332,6 +332,10 @@ table {
border-top: none;
}
}
+
+ &.trust-levels {
+ margin-top: 0px;
+ }
}
diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb
index 3bf4263bdce..d40ec8f810e 100644
--- a/app/controllers/admin/dashboard_controller.rb
+++ b/app/controllers/admin/dashboard_controller.rb
@@ -1,8 +1,9 @@
+
class Admin::DashboardController < Admin::AdminController
def index
render_json_dump({
- reports: ['visits', 'signups', 'topics', 'posts', 'flags'].map { |type| Report.find(type) },
+ reports: ['visits', 'signups', 'topics', 'posts', 'flags', 'users_by_trust_level'].map { |type| Report.find(type) },
total_users: User.count
}.merge(
SiteSetting.version_checks? ? {version_check: DiscourseUpdates.check_version} : {}
diff --git a/app/models/report.rb b/app/models/report.rb
index 038fe34ec33..3c6a608739e 100644
--- a/app/models/report.rb
+++ b/app/models/report.rb
@@ -80,6 +80,15 @@ class Report
end
end
+ def self.report_users_by_trust_level(report)
+ report.data = []
+ fetch report do
+ User.counts_by_trust_level.each do |level, count|
+ report.data << {x: level.to_i, y: count}
+ end
+ end
+ end
+
private
diff --git a/app/models/user.rb b/app/models/user.rb
index 1d91355b264..506b57cea6e 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -462,6 +462,10 @@ class User < ActiveRecord::Base
where('created_at > ?', since).group('date(created_at)').order('date(created_at)').count
end
+ def self.counts_by_trust_level
+ group('trust_level').count
+ end
+
protected
def cook
diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml
index 6ebca00232c..63e51aec9cd 100644
--- a/config/locales/server.en.yml
+++ b/config/locales/server.en.yml
@@ -271,6 +271,10 @@ en:
title: "Flags"
xaxis: "Day"
yaxis: "Number of flags"
+ users_by_trust_level:
+ title: "Users per Trust Level"
+ xaxis: "Trust Level"
+ yaxis: "Number of Users"
site_settings:
default_locale: "The default language of this Discourse instance (ISO 639-1 Code)"
diff --git a/spec/models/report_spec.rb b/spec/models/report_spec.rb
index daa7033e7ce..bd37828666b 100644
--- a/spec/models/report_spec.rb
+++ b/spec/models/report_spec.rb
@@ -4,7 +4,6 @@ describe Report do
describe 'visits report' do
-
let(:report) { Report.find('visits', cache: false) }
context "no visits" do
@@ -24,10 +23,7 @@ describe Report do
it "returns a report with data" do
report.data.should be_present
end
-
end
-
-
end
[:signup, :topic, :post, :flag].each do |arg|
@@ -58,6 +54,31 @@ describe Report do
end
end
+ describe 'users by trust level report' do
+ let(:report) { Report.find('users_by_trust_level', cache: false) }
+
+ context "no users" do
+ it "returns an empty report" do
+ report.data.should be_blank
+ end
+ end
+
+ context "with users at different trust levels" do
+ before do
+ 3.times { Fabricate(:user, trust_level: TrustLevel.levels[:new]) }
+ 2.times { Fabricate(:user, trust_level: TrustLevel.levels[:regular]) }
+ Fabricate(:user, trust_level: TrustLevel.levels[:moderator])
+ end
+
+ it "returns a report with data" do
+ report.data.should be_present
+ report.data.find {|d| d[:x] == TrustLevel.levels[:new]} [:y].should == 3
+ report.data.find {|d| d[:x] == TrustLevel.levels[:regular]}[:y].should == 2
+ report.data.find {|d| d[:x] == TrustLevel.levels[:moderator]}[:y].should == 1
+ end
+ end
+ end
+
describe '#fetch' do
context 'signups' do
let(:report) { Report.find('signups', cache: true) }