From 2c725e2779f2dbefbd50b6992933e85433f74e47 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Mon, 17 Mar 2014 14:50:28 -0400 Subject: [PATCH] FEATURE: Trust level 4 abilities: pin/unpin, close, archive, make invisible, split/merge topic --- .../javascripts/discourse/models/user.js | 3 +++ .../discourse/templates/topic.js.handlebars | 2 +- .../templates/topic_admin_menu.js.handlebars | 2 ++ lib/guardian.rb | 22 ++++++++++++++++++- lib/guardian/topic_guardian.rb | 22 +------------------ spec/components/guardian_spec.rb | 8 +++++++ 6 files changed, 36 insertions(+), 23 deletions(-) diff --git a/app/assets/javascripts/discourse/models/user.js b/app/assets/javascripts/discourse/models/user.js index 7f1694f08..c09e53feb 100644 --- a/app/assets/javascripts/discourse/models/user.js +++ b/app/assets/javascripts/discourse/models/user.js @@ -123,6 +123,9 @@ Discourse.User = Discourse.Model.extend({ return Discourse.Site.currentProp('trustLevels').findProperty('id', parseInt(this.get('trust_level'), 10)); }.property('trust_level'), + isElder: Em.computed.equal('trust_level', 4), + canManageTopic: Em.computed.or('staff', 'isElder'), + isSuspended: Em.computed.equal('suspended', true), suspended: function() { diff --git a/app/assets/javascripts/discourse/templates/topic.js.handlebars b/app/assets/javascripts/discourse/templates/topic.js.handlebars index 210706123..74019d6b0 100644 --- a/app/assets/javascripts/discourse/templates/topic.js.handlebars +++ b/app/assets/javascripts/discourse/templates/topic.js.handlebars @@ -150,7 +150,7 @@ {{render quoteButton}} {{/if}} -{{#if currentUser.staff}} +{{#if currentUser.canManageTopic}} {{render topicAdminMenu content}} {{/if}} diff --git a/app/assets/javascripts/discourse/templates/topic_admin_menu.js.handlebars b/app/assets/javascripts/discourse/templates/topic_admin_menu.js.handlebars index 5c569f98b..e6e97348a 100644 --- a/app/assets/javascripts/discourse/templates/topic_admin_menu.js.handlebars +++ b/app/assets/javascripts/discourse/templates/topic_admin_menu.js.handlebars @@ -58,9 +58,11 @@ {{/if}} + {{#if currentUser.staff}}
  • + {{/if}} {{else}} diff --git a/lib/guardian.rb b/lib/guardian.rb index dbe0526d8..e26a04baf 100644 --- a/lib/guardian.rb +++ b/lib/guardian.rb @@ -71,6 +71,26 @@ class Guardian end end + def can_create?(klass, parent=nil) + return false unless authenticated? && klass + + # If no parent is provided, we look for a can_create_klass? + # custom method. + # + # If a parent is provided, we look for a method called + # can_create_klass_on_parent? + target = klass.name.underscore + if parent.present? + return false unless can_see?(parent) + target << "_on_#{parent.class.name.underscore}" + end + create_method = :"can_create_#{target}?" + + return send(create_method, parent) if respond_to?(create_method) + + true + end + # Can the user edit the obj def can_edit?(obj) can_do?(:edit, obj) @@ -82,7 +102,7 @@ class Guardian end def can_moderate?(obj) - obj && is_staff? + obj && authenticated? && (is_staff? || (obj.is_a?(Topic) && @user.has_trust_level?(:elder))) end alias :can_move_posts? :can_moderate? alias :can_see_flags? :can_moderate? diff --git a/lib/guardian/topic_guardian.rb b/lib/guardian/topic_guardian.rb index 50d240de2..3e08af064 100644 --- a/lib/guardian/topic_guardian.rb +++ b/lib/guardian/topic_guardian.rb @@ -1,25 +1,5 @@ #mixin for all guardian methods dealing with topic permisions module TopicGuardian - # Can the user create a topic in the forum - def can_create?(klass, parent=nil) - return false unless authenticated? && klass - - # If no parent is provided, we look for a can_i_create_klass? - # custom method. - # - # If a parent is provided, we look for a method called - # can_i_create_klass_on_parent? - target = klass.name.underscore - if parent.present? - return false unless can_see?(parent) - target << "_on_#{parent.class.name.underscore}" - end - create_method = :"can_create_#{target}?" - - return send(create_method, parent) if respond_to?(create_method) - - true - end def can_remove_allowed_users?(topic) is_staff? @@ -41,7 +21,7 @@ module TopicGuardian # No users can create posts on deleted topics return false if topic.trashed? - is_staff? || (not(topic.closed? || topic.archived? || topic.trashed?) && can_create_post?(topic)) + is_staff? || (authenticated? && user.has_trust_level?(:elder)) || (not(topic.closed? || topic.archived? || topic.trashed?) && can_create_post?(topic)) end # Editing Method diff --git a/spec/components/guardian_spec.rb b/spec/components/guardian_spec.rb index 39267f947..936704940 100644 --- a/spec/components/guardian_spec.rb +++ b/spec/components/guardian_spec.rb @@ -409,6 +409,10 @@ describe Guardian do it "allows new posts from admins" do Guardian.new(admin).can_create?(Post, topic).should be_true end + + it "allows new posts from elders" do + Guardian.new(elder).can_create?(Post, topic).should be_true + end end context 'archived topic' do @@ -728,6 +732,10 @@ describe Guardian do Guardian.new(admin).can_moderate?(topic).should be_true end + it 'returns true when trust level 4' do + Guardian.new(elder).can_moderate?(topic).should be_true + end + end end