From 90e195b2e7eacb4cd1c54b0908ecedd17d3c70f7 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Thu, 23 Jan 2014 16:40:10 -0500 Subject: [PATCH] More work on trust level 3 requirements page --- .../controllers/admin_user_controller.js | 14 +++++- .../javascripts/admin/models/admin_user.js | 8 +++- .../admin/models/leader_requirements.js | 21 +++++++++ .../admin/templates/user.js.handlebars | 1 + .../admin/templates/user_index.js.handlebars | 2 +- .../user_leader_requirements.js.handlebars | 43 +++++++++++++------ .../stylesheets/common/admin/admin_base.scss | 9 ++++ app/controllers/admin/users_controller.rb | 3 ++ app/models/leader_requirements.rb | 30 +++++++++++-- .../admin_detailed_user_serializer.rb | 2 +- .../leader_requirements_serializer.rb | 11 +++-- config/locales/client.en.yml | 4 ++ config/routes.rb | 1 + 13 files changed, 123 insertions(+), 26 deletions(-) create mode 100644 app/assets/javascripts/admin/models/leader_requirements.js create mode 100644 app/assets/javascripts/admin/templates/user.js.handlebars diff --git a/app/assets/javascripts/admin/controllers/admin_user_controller.js b/app/assets/javascripts/admin/controllers/admin_user_controller.js index aac997c15..c90516fc4 100644 --- a/app/assets/javascripts/admin/controllers/admin_user_controller.js +++ b/app/assets/javascripts/admin/controllers/admin_user_controller.js @@ -1,7 +1,18 @@ +/** + The top-level controller for user pages in admin. + Ember assertion says that this class needs to be defined even if it's empty. + + @class AdminUserController + @extends Discourse.ObjectController + @namespace Discourse + @module Discourse +**/ +Discourse.AdminUserController = Discourse.ObjectController.extend({}); + /** A controller related to viewing a user in the admin section - @class AdminUserController + @class AdminUserIndexController @extends Discourse.ObjectController @namespace Discourse @module Discourse @@ -53,3 +64,4 @@ Discourse.AdminUserIndexController = Discourse.ObjectController.extend({ } }); + diff --git a/app/assets/javascripts/admin/models/admin_user.js b/app/assets/javascripts/admin/models/admin_user.js index 911f4cc45..a55873a61 100644 --- a/app/assets/javascripts/admin/models/admin_user.js +++ b/app/assets/javascripts/admin/models/admin_user.js @@ -341,7 +341,13 @@ Discourse.AdminUser = Discourse.User.extend({ model.setProperties(result); model.set('loadedDetails', true); }); - } + }, + + leaderRequirements: function() { + if (this.get('leader_requirements')) { + return Discourse.LeaderRequirements.create(this.get('leader_requirements')); + } + }.property('leader_requirements') }); diff --git a/app/assets/javascripts/admin/models/leader_requirements.js b/app/assets/javascripts/admin/models/leader_requirements.js new file mode 100644 index 000000000..f4f3d402c --- /dev/null +++ b/app/assets/javascripts/admin/models/leader_requirements.js @@ -0,0 +1,21 @@ +Discourse.LeaderRequirements = Discourse.Model.extend({ + days_visited_percent: function() { + return ((this.get('days_visited') * 100) / this.get('time_period')); + }.property('days_visited', 'time_period'), + + min_days_visited_percent: function() { + return ((this.get('min_days_visited') * 100) / this.get('time_period')); + }.property('min_days_visited', 'time_period'), + + met: function() { + return { + days_visited: this.get('days_visited') >= this.get('min_days_visited'), + topics_with_replies: this.get('num_topics_with_replies') >= this.get('min_topics_with_replies'), + topics_replied_to: this.get('num_topics_replied_to') >= this.get('min_topics_replied_to'), + flagged_posts: this.get('num_flagged_posts') < this.get('max_flagged_posts') + }; + }.property('days_visited', 'min_days_visited', + 'num_topics_with_replies', 'min_topics_with_replies', + 'num_topics_replied_to', 'min_topics_replied_to', + 'num_flagged_posts', 'max_flagged_posts') +}); diff --git a/app/assets/javascripts/admin/templates/user.js.handlebars b/app/assets/javascripts/admin/templates/user.js.handlebars new file mode 100644 index 000000000..e2147cab0 --- /dev/null +++ b/app/assets/javascripts/admin/templates/user.js.handlebars @@ -0,0 +1 @@ +{{outlet}} \ No newline at end of file diff --git a/app/assets/javascripts/admin/templates/user_index.js.handlebars b/app/assets/javascripts/admin/templates/user_index.js.handlebars index eb26722b4..a764d4cf3 100644 --- a/app/assets/javascripts/admin/templates/user_index.js.handlebars +++ b/app/assets/javascripts/admin/templates/user_index.js.handlebars @@ -189,7 +189,7 @@ {{combobox content=trustLevels value=trust_level nameProperty="detailedName"}}
- {{#if leader_requirements}} + {{#if leaderRequirements}} {{#link-to 'adminUser.leaderRequirements' this class="btn"}}{{i18n admin.user.trust_level_3_requirements}}{{/link-to}} {{/if}} diff --git a/app/assets/javascripts/admin/templates/user_leader_requirements.js.handlebars b/app/assets/javascripts/admin/templates/user_leader_requirements.js.handlebars index 9054168a8..9fe0d23c7 100644 --- a/app/assets/javascripts/admin/templates/user_leader_requirements.js.handlebars +++ b/app/assets/javascripts/admin/templates/user_leader_requirements.js.handlebars @@ -1,60 +1,77 @@
-
+

{{username}} - {{i18n admin.user.tl3_requirements.title}}


{{i18n admin.user.tl3_requirements.table_title}}

- {{#with leader_requirements}} + {{#with leaderRequirements}} + + + + + + + + + + - + + + - + + + + + + + + + - + + +
{{i18n admin.user.tl3_requirements.value_heading}}{{i18n admin.user.tl3_requirements.requirement_heading}}
{{i18n admin.user.tl3_requirements.visits}} - {{days_visited_percent}}% ({{days_visited}} / {{time_period}} {{i18n admin.user.tl3_requirements.days}}) + {{days_visited_percent}}% ({{days_visited}} / {{time_period}} {{i18n admin.user.tl3_requirements.days}}) {{min_days_visited_percent}}%
{{i18n admin.user.tl3_requirements.topics_with_replies}} - {{num_topics_with_replies}} - {{num_topics_with_replies}}{{min_topics_with_replies}}
{{i18n admin.user.tl3_requirements.topics_replied_to}} - {{num_topics_replied_to}} - {{num_topics_replied_to}}{{min_topics_replied_to}}
{{i18n admin.user.tl3_requirements.quality_content}} TODO
{{i18n admin.user.tl3_requirements.reading}} TODO
{{i18n admin.user.tl3_requirements.site_promotion}} TODO
{{i18n admin.user.tl3_requirements.flagged_posts}} - {{num_flagged_posts}} - {{num_flagged_posts}}{{max_flagged_posts}} {{i18n max}}
diff --git a/app/assets/stylesheets/common/admin/admin_base.scss b/app/assets/stylesheets/common/admin/admin_base.scss index 27cc5f56d..e70e685ba 100644 --- a/app/assets/stylesheets/common/admin/admin_base.scss +++ b/app/assets/stylesheets/common/admin/admin_base.scss @@ -962,3 +962,12 @@ table.api-keys { width: 95%; } } + +.leader-requirements { + .fa-check { + color: green; + } + .fa-times { + color: red; + } +} \ No newline at end of file diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 9208048e9..27aec1e00 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -161,6 +161,9 @@ class Admin::UsersController < Admin::AdminController end end + def leader_requirements + end + private diff --git a/app/models/leader_requirements.rb b/app/models/leader_requirements.rb index b92ae2a08..349ad3685 100644 --- a/app/models/leader_requirements.rb +++ b/app/models/leader_requirements.rb @@ -4,31 +4,55 @@ class LeaderRequirements include ActiveModel::Serialization - attr_accessor :days_visited, :time_period, :num_topics_with_replies, :num_topics_replied_to, - :num_flagged_posts + attr_accessor :time_period, + :days_visited, :min_days_visited, + :num_topics_with_replies, :min_topics_with_replies, + :num_topics_replied_to, :min_topics_replied_to, + :num_flagged_posts, :max_flagged_posts def initialize(user) @user = user end + # TODO + # def requirements_met? + # false + # end + def time_period 100 # days end def days_visited # This is naive. The user may have visited the site, but not read any posts. - @user.user_visits.where("visited_at >= ?", time_period.days.ago).count + @user.user_visits.where("visited_at > ?", time_period.days.ago).count + end + + def min_days_visited + time_period * 0.5 end def num_topics_with_replies @user.topics.where('posts_count > 1 AND participant_count > 1 AND created_at > ?', time_period.days.ago).count end + def min_topics_with_replies + 5 + end + def num_topics_replied_to @user.posts.select('distinct topic_id').where('created_at > ? AND post_number > 1', time_period.days.ago).count end + def min_topics_replied_to + 10 + end + def num_flagged_posts @user.posts.where('created_at > ? AND (off_topic_count > 0 OR spam_count > 0 OR illegal_count > 0 OR inappropriate_count > 0 OR notify_moderators_count > 0)', time_period.days.ago).count end + + def max_flagged_posts + 5 # TODO what should it be? + end end diff --git a/app/serializers/admin_detailed_user_serializer.rb b/app/serializers/admin_detailed_user_serializer.rb index 404cab2da..975c92ea6 100644 --- a/app/serializers/admin_detailed_user_serializer.rb +++ b/app/serializers/admin_detailed_user_serializer.rb @@ -66,7 +66,7 @@ class AdminDetailedUserSerializer < AdminUserSerializer end def include_leader_requirements? - object.trust_level == TrustLevel.levels[:regular] + object.has_trust_level?(:regular) end end diff --git a/app/serializers/leader_requirements_serializer.rb b/app/serializers/leader_requirements_serializer.rb index a1df3a8d5..88cb08477 100644 --- a/app/serializers/leader_requirements_serializer.rb +++ b/app/serializers/leader_requirements_serializer.rb @@ -1,8 +1,7 @@ class LeaderRequirementsSerializer < ApplicationSerializer - attributes :time_period, :days_visited, :days_visited_percent, - :num_topics_with_replies, :num_topics_replied_to, :num_flagged_posts - - def days_visited_percent - (days_visited * 100) / time_period - end + attributes :time_period, + :days_visited, :min_days_visited, + :num_topics_with_replies, :min_topics_with_replies, + :num_topics_replied_to, :min_topics_replied_to, + :num_flagged_posts, :max_flagged_posts end diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index c27532a5d..b64c1d330 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -108,6 +108,7 @@ en: daily: "daily" weekly: "weekly" every_two_weeks: "every two weeks" + max: "max" character_count: one: "{{count}} character" other: "{{count}} characters" @@ -1486,10 +1487,13 @@ en: block_explanation: "A blocked user can't post or start topics." trust_level_change_failed: "There was a problem changing the user's trust level." suspend_modal_title: "Suspend User" + trust_level_2_users: "Trust Level 2 Users" trust_level_3_requirements: "Trust Level 3 Requirements" tl3_requirements: title: "Requirements for Trust Level 3" table_title: "In the last 100 days:" + value_heading: "Value" + requirement_heading: "Requirement" visits: "Visits" days: "days" topics_with_replies: "Topics with Replies" diff --git a/config/routes.rb b/config/routes.rb index eecb2cd8b..4b232420f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -58,6 +58,7 @@ Discourse::Application.routes.draw do put "block" put "unblock" put "trust_level" + get "leader_requirements" end resources :impersonate, constraints: AdminConstraint.new