From 3a3c8817358c3487886ce272c58ac359fa51cb37 Mon Sep 17 00:00:00 2001 From: zaziemo Date: Thu, 20 Aug 2015 16:22:54 +0200 Subject: [PATCH 1/8] add new role moderator analogue to admin role #5324 --- app/models/role.rb | 8 ++++++-- spec/models/role_spec.rb | 7 +++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/models/role.rb b/app/models/role.rb index dafc33f37..3f53af442 100644 --- a/app/models/role.rb +++ b/app/models/role.rb @@ -1,11 +1,11 @@ -#NOTE add the person object you want to attach role to... +# NOTE add the person object you want to attach role to... class Role < ActiveRecord::Base belongs_to :person validates :person, presence: true validates :name, uniqueness: {scope: :person_id} - validates :name, inclusion: {in: %w(admin spotlight)} + validates :name, inclusion: {in: %w(admin moderator spotlight)} scope :admins, -> { where(name: "admin") } @@ -17,6 +17,10 @@ class Role < ActiveRecord::Base find_or_create_by(person_id: person.id, name: "admin") end + def self.add_moderator(person) + find_or_create_by(person_id: person.id, name: "moderator") + end + def self.add_spotlight(person) find_or_create_by(person_id: person.id, name: "spotlight") end diff --git a/spec/models/role_spec.rb b/spec/models/role_spec.rb index 82a95a8ff..06225ab5d 100644 --- a/spec/models/role_spec.rb +++ b/spec/models/role_spec.rb @@ -45,6 +45,13 @@ describe Role do end end + describe ".add_moderator" do + it "creates the moderator role" do + Role.add_moderator(person) + expect(person.roles.where(name: "moderator")).to exist + end + end + describe ".add_spotlight" do it "creates the spotlight role" do Role.add_spotlight(person) From bc75371b7a95f8ead5f463caf4ef7fe7db32c021 Mon Sep 17 00:00:00 2001 From: realtin Date: Thu, 20 Aug 2015 17:14:59 +0200 Subject: [PATCH 2/8] report controller renders index for the moderator (#5324) --- app/controllers/application_controller.rb | 7 +++++++ app/controllers/report_controller.rb | 2 +- app/models/role.rb | 4 ++++ app/models/user.rb | 4 ++++ spec/controllers/report_controller_spec.rb | 12 +++++++++++- 5 files changed, 27 insertions(+), 2 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index b8e7b67ff..14996d4c0 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -92,6 +92,13 @@ class ApplicationController < ActionController::Base end end + def redirect_unless_moderator + unless current_user.moderator? || current_user.admin? + redirect_to stream_url, :notice => 'you need to be an admin or moderator to do that' + return + end + end + def set_grammatical_gender if (user_signed_in? && I18n.inflector.inflected_locale?) gender = current_user.gender.to_s.tr('!()[]"\'`*=|/\#.,-:', '').downcase diff --git a/app/controllers/report_controller.rb b/app/controllers/report_controller.rb index 5d8d7c338..c560d2e82 100644 --- a/app/controllers/report_controller.rb +++ b/app/controllers/report_controller.rb @@ -4,7 +4,7 @@ class ReportController < ApplicationController before_filter :authenticate_user! - before_filter :redirect_unless_admin, :except => [:create] + before_filter :redirect_unless_moderator, :except => [:create] def index @reports = Report.where(reviewed: false) diff --git a/app/models/role.rb b/app/models/role.rb index 3f53af442..b5452e8c5 100644 --- a/app/models/role.rb +++ b/app/models/role.rb @@ -17,6 +17,10 @@ class Role < ActiveRecord::Base find_or_create_by(person_id: person.id, name: "admin") end + def self.moderator?(person) + exists?(person_id: person.id, name: "moderator") + end + def self.add_moderator(person) find_or_create_by(person_id: person.id, name: "moderator") end diff --git a/app/models/user.rb b/app/models/user.rb index cf9890d74..137f7d722 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -481,6 +481,10 @@ class User < ActiveRecord::Base Role.is_admin?(self.person) end + def moderator? + Role.moderator?(self.person) + end + def podmin_account? username == AppConfig.admins.account end diff --git a/spec/controllers/report_controller_spec.rb b/spec/controllers/report_controller_spec.rb index 6e63902e2..a10505a20 100644 --- a/spec/controllers/report_controller_spec.rb +++ b/spec/controllers/report_controller_spec.rb @@ -18,7 +18,7 @@ describe ReportController, :type => :controller do expect(response).to redirect_to stream_path end end - + context 'admin signed in' do before do Role.add_admin(alice.person) @@ -28,6 +28,16 @@ describe ReportController, :type => :controller do expect(response).to render_template('index') end end + + context 'moderator signed in' do + before do + Role.add_moderator(alice.person) + end + it 'succeeds and renders index' do + get :index + expect(response).to render_template('index') + end + end end describe '#create' do From b2dc77e1e6cbef4702f9ba23605d775126eea306 Mon Sep 17 00:00:00 2001 From: zaziemo Date: Fri, 21 Aug 2015 11:47:14 +0200 Subject: [PATCH 3/8] change method name for a better understanding of what the befor_filter does and correct test syntax #5324 --- app/controllers/application_controller.rb | 2 +- app/controllers/report_controller.rb | 2 +- spec/controllers/report_controller_spec.rb | 114 ++++++++++----------- 3 files changed, 59 insertions(+), 59 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 14996d4c0..951638b30 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -92,7 +92,7 @@ class ApplicationController < ActionController::Base end end - def redirect_unless_moderator + def redirect_unless_admin_or_moderator unless current_user.moderator? || current_user.admin? redirect_to stream_url, :notice => 'you need to be an admin or moderator to do that' return diff --git a/app/controllers/report_controller.rb b/app/controllers/report_controller.rb index c560d2e82..f0603eceb 100644 --- a/app/controllers/report_controller.rb +++ b/app/controllers/report_controller.rb @@ -4,7 +4,7 @@ class ReportController < ApplicationController before_filter :authenticate_user! - before_filter :redirect_unless_moderator, :except => [:create] + before_filter :redirect_unless_admin_or_moderator, :except => [:create] def index @reports = Report.where(reviewed: false) diff --git a/spec/controllers/report_controller_spec.rb b/spec/controllers/report_controller_spec.rb index a10505a20..528d05c31 100644 --- a/spec/controllers/report_controller_spec.rb +++ b/spec/controllers/report_controller_spec.rb @@ -2,138 +2,138 @@ # licensed under the Affero General Public License version 3 or later. See # the COPYRIGHT file. -require 'spec_helper' +require "spec_helper" -describe ReportController, :type => :controller do +describe ReportController, type: :controller do before do sign_in alice - @message = alice.post(:status_message, :text => "hey", :to => alice.aspects.first.id) + @message = alice.post(:status_message, text: "hey", to: alice.aspects.first.id) @comment = alice.comment!(@message, "flying pigs, everywhere") end - describe '#index' do - context 'admin not signed in' do - it 'is behind redirect_unless_admin' do + describe "#index" do + context "admin not signed in" do + it "is behind redirect_unless_admin" do get :index expect(response).to redirect_to stream_path end end - context 'admin signed in' do + context "admin signed in" do before do Role.add_admin(alice.person) end - it 'succeeds and renders index' do + it "succeeds and renders index" do get :index - expect(response).to render_template('index') + expect(response).to render_template("index") end end - context 'moderator signed in' do + context "moderator signed in" do before do Role.add_moderator(alice.person) end - it 'succeeds and renders index' do + it "succeeds and renders index" do get :index - expect(response).to render_template('index') + expect(response).to render_template("index") end end end - describe '#create' do + describe "#create" do let(:comment_hash) { - {:text =>"facebook, is that you?", - :item_id =>"#{@post.id}"} + {text: "facebook, is that you?", + item_id: "#{@post.id}"} } - context 'report offensive post' do - it 'succeeds' do - put :create, :report => { :item_id => @message.id, :item_type => 'post', :text => 'offensive content' } + context "report offensive post" do + it "succeeds" do + put :create, report: {item_id: @message.id, item_type: "post", text: "offensive content"} expect(response.status).to eq(200) - expect(Report.exists?(:item_id => @message.id, :item_type => 'post')).to be true + expect(Report.exists?(item_id: @message.id, item_type: "post")).to be true end end - context 'report offensive comment' do - it 'succeeds' do - put :create, :report => { :item_id => @comment.id, :item_type => 'comment', :text => 'offensive content' } + context "report offensive comment" do + it "succeeds" do + put :create, report: {item_id: @comment.id, item_type: "comment", text: "offensive content"} expect(response.status).to eq(200) - expect(Report.exists?(:item_id => @comment.id, :item_type => 'comment')).to be true + expect(Report.exists?(item_id: @comment.id, item_type: "comment")).to be true end end end - describe '#update' do - context 'mark post report as user' do - it 'is behind redirect_unless_admin' do - put :update, :id => @message.id, :type => 'post' + describe "#update" do + context "mark post report as user" do + it "is behind redirect_unless_admin_or_moderator" do + put :update, id: @message.id, type: "post" expect(response).to redirect_to stream_path - expect(Report.where(:reviewed => false, :item_id => @message.id, :item_type => 'post')).to be_truthy + expect(Report.where(reviewed: false, item_id: @message.id, item_type: "post")).to be_truthy end end - context 'mark comment report as user' do - it 'is behind redirect_unless_admin' do - put :update, :id => @comment.id, :type => 'comment' + context "mark comment report as user" do + it "is behind redirect_unless_admin" do + put :update, id: @comment.id, type: "comment" expect(response).to redirect_to stream_path - expect(Report.where(:reviewed => false, :item_id => @comment.id, :item_type => 'comment')).to be_truthy + expect(Report.where(reviewed: false, item_id: @comment.id, item_type: "comment")).to be_truthy end end - context 'mark post report as admin' do + context "mark post report as admin" do before do Role.add_admin(alice.person) end - it 'succeeds' do - put :update, :id => @message.id, :type => 'post' + it "succeeds" do + put :update, id: @message.id, type: "post" expect(response.status).to eq(302) - expect(Report.where(:reviewed => true, :item_id => @message.id, :item_type => 'post')).to be_truthy + expect(Report.where(reviewed: true, item_id: @message.id, item_type: "post")).to be_truthy end end - context 'mark comment report as admin' do + context "mark comment report as admin" do before do Role.add_admin(alice.person) end - it 'succeeds' do - put :update, :id => @comment.id, :type => 'comment' + it "succeeds" do + put :update, id: @comment.id, type: "comment" expect(response.status).to eq(302) - expect(Report.where(:reviewed => true, :item_id => @comment.id, :item_type => 'comment')).to be_truthy + expect(Report.where(reviewed: true, item_id: @comment.id, item_type: "comment")).to be_truthy end end end - describe '#destroy' do - context 'destroy post as user' do - it 'is behind redirect_unless_admin' do - delete :destroy, :id => @message.id, :type => 'post' + describe "#destroy" do + context "destroy post as user" do + it "is behind redirect_unless_admin" do + delete :destroy, id: @message.id, type: "post" expect(response).to redirect_to stream_path - expect(Report.where(:reviewed => false, :item_id => @message.id, :item_type => 'post')).to be_truthy + expect(Report.where(reviewed: false, item_id: @message.id, item_type: "post")).to be_truthy end end - context 'destroy comment as user' do - it 'is behind redirect_unless_admin' do - delete :destroy, :id => @comment.id, :type => 'comment' + context "destroy comment as user" do + it "is behind redirect_unless_admin" do + delete :destroy, id: @comment.id, type: "comment" expect(response).to redirect_to stream_path - expect(Report.where(:reviewed => false, :item_id => @comment.id, :item_type => 'comment')).to be_truthy + expect(Report.where(reviewed: false, item_id: @comment.id, item_type: "comment")).to be_truthy end end - context 'destroy post as admin' do + context "destroy post as admin" do before do Role.add_admin(alice.person) end - it 'succeeds' do - delete :destroy, :id => @message.id, :type => 'post' + it "succeeds" do + delete :destroy, id: @message.id, type: "post" expect(response.status).to eq(302) - expect(Report.where(:reviewed => true, :item_id => @message.id, :item_type => 'post')).to be_truthy + expect(Report.where(reviewed: true, item_id: @message.id, item_type: "post")).to be_truthy end end - context 'destroy comment as admin' do + context "destroy comment as admin" do before do Role.add_admin(alice.person) end - it 'succeeds' do - delete :destroy, :id => @comment.id, :type => 'comment' + it "succeeds" do + delete :destroy, id: @comment.id, type: "comment" expect(response.status).to eq(302) - expect(Report.where(:reviewed => true, :item_id => @comment.id, :item_type => 'comment')).to be_truthy + expect(Report.where(reviewed: true, item_id: @comment.id, item_type: "comment")).to be_truthy end end end From 0b420d0308046bfac3f63f341f52a9e2806afa90 Mon Sep 17 00:00:00 2001 From: realtin Date: Fri, 21 Aug 2015 14:18:25 +0200 Subject: [PATCH 4/8] adapt templates to allow moderator to view reports (#5324) --- app/assets/templates/header_tpl.jst.hbs | 2 ++ app/presenters/user_presenter.rb | 5 +++++ app/views/report/index.html.haml | 3 ++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/assets/templates/header_tpl.jst.hbs b/app/assets/templates/header_tpl.jst.hbs index 92ed903fc..199f6ff52 100644 --- a/app/assets/templates/header_tpl.jst.hbs +++ b/app/assets/templates/header_tpl.jst.hbs @@ -81,6 +81,8 @@
  • {{t "header.help"}}
  • {{#if current_user.admin}}
  • {{t "header.admin"}}
  • + {{else if current_user.moderator}} +
  • {{t "header.moderator"}}
  • {{/if}}
  • {{t "header.log_out"}}
  • diff --git a/app/presenters/user_presenter.rb b/app/presenters/user_presenter.rb index 1874570c4..f70bae290 100644 --- a/app/presenters/user_presenter.rb +++ b/app/presenters/user_presenter.rb @@ -11,6 +11,7 @@ class UserPresenter { :notifications_count => notifications_count, :unread_messages_count => unread_messages_count, :admin => admin, + :moderator => moderator, :aspects => aspects, :services => services, :following_count => self.user.contacts.receiving.count, @@ -46,4 +47,8 @@ class UserPresenter def admin user.admin? end + + def moderator + user.moderator? + end end diff --git a/app/views/report/index.html.haml b/app/views/report/index.html.haml index d9a3e4eae..5caf2f719 100644 --- a/app/views/report/index.html.haml +++ b/app/views/report/index.html.haml @@ -1,6 +1,7 @@ .container %div - = render :partial => 'admins/admin_bar' + - if current_user.admin? + = render :partial => 'admins/admin_bar' %div.row %div.span12 From 098c30c2b7dbfd6138de591b3ca379cb4ef9d87e Mon Sep 17 00:00:00 2001 From: realtin Date: Fri, 21 Aug 2015 14:57:30 +0200 Subject: [PATCH 5/8] adapt report spec for the moderator --- spec/controllers/report_controller_spec.rb | 48 ++++++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/spec/controllers/report_controller_spec.rb b/spec/controllers/report_controller_spec.rb index 528d05c31..c214e34d1 100644 --- a/spec/controllers/report_controller_spec.rb +++ b/spec/controllers/report_controller_spec.rb @@ -71,7 +71,7 @@ describe ReportController, type: :controller do end end context "mark comment report as user" do - it "is behind redirect_unless_admin" do + it "is behind redirect_unless_admin_or_moderator" do put :update, id: @comment.id, type: "comment" expect(response).to redirect_to stream_path expect(Report.where(reviewed: false, item_id: @comment.id, item_type: "comment")).to be_truthy @@ -98,18 +98,39 @@ describe ReportController, type: :controller do expect(Report.where(reviewed: true, item_id: @comment.id, item_type: "comment")).to be_truthy end end + + context "mark post report as moderator" do + before do + Role.add_moderator(alice.person) + end + it "succeeds" do + put :update, id: @message.id, type: "post" + expect(response.status).to eq(302) + expect(Report.where(reviewed: true, item_id: @message.id, item_type: "post")).to be_truthy + end + end + context "mark comment report as moderator" do + before do + Role.add_moderator(alice.person) + end + it "succeeds" do + put :update, id: @comment.id, type: "comment" + expect(response.status).to eq(302) + expect(Report.where(reviewed: true, item_id: @comment.id, item_type: "comment")).to be_truthy + end + end end describe "#destroy" do context "destroy post as user" do - it "is behind redirect_unless_admin" do + it "is behind redirect_unless_admin_or_moderator" do delete :destroy, id: @message.id, type: "post" expect(response).to redirect_to stream_path expect(Report.where(reviewed: false, item_id: @message.id, item_type: "post")).to be_truthy end end context "destroy comment as user" do - it "is behind redirect_unless_admin" do + it "is behind redirect_unless_admin_or_moderator" do delete :destroy, id: @comment.id, type: "comment" expect(response).to redirect_to stream_path expect(Report.where(reviewed: false, item_id: @comment.id, item_type: "comment")).to be_truthy @@ -136,5 +157,26 @@ describe ReportController, type: :controller do expect(Report.where(reviewed: true, item_id: @comment.id, item_type: "comment")).to be_truthy end end + + context "destroy post as moderator" do + before do + Role.add_moderator(alice.person) + end + it "succeeds" do + delete :destroy, id: @message.id, type: "post" + expect(response.status).to eq(302) + expect(Report.where(reviewed: true, item_id: @message.id, item_type: "post")).to be_truthy + end + end + context "destroy comment as moderator" do + before do + Role.add_moderator(alice.person) + end + it "succeeds" do + delete :destroy, id: @comment.id, type: "comment" + expect(response.status).to eq(302) + expect(Report.where(reviewed: true, item_id: @comment.id, item_type: "comment")).to be_truthy + end + end end end From 15b186518c47665f3765bf175aa9f94068f05e8c Mon Sep 17 00:00:00 2001 From: realtin Date: Tue, 25 Aug 2015 12:43:56 +0200 Subject: [PATCH 6/8] add moderators to report email recievers and refactor coding style according to pull request comments (#5324) --- app/controllers/application_controller.rb | 30 +++++++-------- app/controllers/report_controller.rb | 14 +++---- app/mailers/report_mailer.rb | 42 +++++++++++---------- app/models/role.rb | 1 + app/models/user.rb | 2 +- app/presenters/user_presenter.rb | 27 +++++++------ app/views/report/index.html.haml | 3 ++ app/workers/mail/report_worker.rb | 3 +- config/locales/diaspora/de.yml | 2 +- config/locales/javascript/javascript.en.yml | 1 + spec/controllers/report_controller_spec.rb | 3 ++ spec/mailers/report_spec.rb | 31 +++++++++------ 12 files changed, 86 insertions(+), 73 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 951638b30..7d1b99d33 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -5,7 +5,7 @@ class ApplicationController < ActionController::Base before_action :force_tablet_html has_mobile_fu - protect_from_forgery :except => :receive + protect_from_forgery except: :receive before_action :ensure_http_referer_is_set before_action :set_locale @@ -15,7 +15,7 @@ class ApplicationController < ActionController::Base before_action :gon_set_current_user before_action :gon_set_preloads - inflection_method :grammatical_gender => :gender + inflection_method grammatical_gender: :gender helper_method :all_aspects, :all_contacts_count, @@ -34,7 +34,7 @@ class ApplicationController < ActionController::Base end def ensure_http_referer_is_set - request.env['HTTP_REFERER'] ||= '/' + request.env["HTTP_REFERER"] ||= "/" end # Overwriting the sign_out redirect path method @@ -67,11 +67,11 @@ class ApplicationController < ActionController::Base end def set_diaspora_header - headers['X-Diaspora-Version'] = AppConfig.version_string + headers["X-Diaspora-Version"] = AppConfig.version_string if AppConfig.git_available? - headers['X-Git-Update'] = AppConfig.git_update if AppConfig.git_update.present? - headers['X-Git-Revision'] = AppConfig.git_revision if AppConfig.git_revision.present? + headers["X-Git-Update"] = AppConfig.git_update if AppConfig.git_update.present? + headers["X-Git-Revision"] = AppConfig.git_revision if AppConfig.git_revision.present? end end @@ -86,17 +86,13 @@ class ApplicationController < ActionController::Base end def redirect_unless_admin - unless current_user.admin? - redirect_to stream_url, :notice => 'you need to be an admin to do that' - return - end + return if current_user.admin? + redirect_to stream_url, notice: "you need to be an admin to do that" end - def redirect_unless_admin_or_moderator - unless current_user.moderator? || current_user.admin? - redirect_to stream_url, :notice => 'you need to be an admin or moderator to do that' - return - end + def redirect_unless_moderator + return if current_user.moderator? || current_user.admin? + redirect_to stream_url, notice: "you need to be an admin or moderator to do that" end def set_grammatical_gender @@ -104,7 +100,7 @@ class ApplicationController < ActionController::Base gender = current_user.gender.to_s.tr('!()[]"\'`*=|/\#.,-:', '').downcase unless gender.empty? i_langs = I18n.inflector.inflected_locales(:gender) - i_langs.delete I18n.locale + i_langs.delete I18n.locale i_langs.unshift I18n.locale i_langs.each do |lang| token = I18n.inflector.true_token(gender, :gender, lang) @@ -149,7 +145,7 @@ class ApplicationController < ActionController::Base return unless user_signed_in? a_ids = session[:a_ids] || [] user = UserPresenter.new(current_user, a_ids) - gon.push({:user => user}) + gon.push(user: user) end def gon_set_preloads diff --git a/app/controllers/report_controller.rb b/app/controllers/report_controller.rb index f0603eceb..8e0826c1f 100644 --- a/app/controllers/report_controller.rb +++ b/app/controllers/report_controller.rb @@ -3,8 +3,8 @@ # the COPYRIGHT file. class ReportController < ApplicationController - before_filter :authenticate_user! - before_filter :redirect_unless_admin_or_moderator, :except => [:create] + before_action :authenticate_user! + before_action :redirect_unless_moderator, except: [:create] def index @reports = Report.where(reviewed: false) @@ -19,19 +19,19 @@ class ReportController < ApplicationController def destroy if (report = Report.where(id: params[:id]).first) && report.destroy_reported_item - flash[:notice] = I18n.t 'report.status.destroyed' + flash[:notice] = I18n.t "report.status.destroyed" else - flash[:error] = I18n.t 'report.status.failed' + flash[:error] = I18n.t "report.status.failed" end - redirect_to :action => :index + redirect_to action: :index end def create report = current_user.reports.new(report_params) if report.save - render :json => true, :status => 200 + render json: true, status: 200 else - render :nothing => true, :status => 409 + render nothing: true, status: 409 end end diff --git a/app/mailers/report_mailer.rb b/app/mailers/report_mailer.rb index b3479cc74..35aafcf3e 100644 --- a/app/mailers/report_mailer.rb +++ b/app/mailers/report_mailer.rb @@ -1,30 +1,32 @@ class ReportMailer < ActionMailer::Base - default :from => AppConfig.mail.sender_address + default from: AppConfig.mail.sender_address - def new_report(type, id) + def self.new_report(type, id) + Role.moderators.map {|role| super(type, id, role) } + end + + def new_report(type, id, role) resource = { - :url => report_index_url, - :type => I18n.t('notifier.report_email.type.' + type), - :id => id + url: report_index_url, + type: I18n.t("notifier.report_email.type." + type), + id: id } - - Role.admins.each do |role| - person = Person.find(role.person_id) - if person.local? - user = User.find_by_id(person.owner_id) - unless user.user_preferences.exists?(:email_type => :someone_reported) - resource[:email] = user.email - format(resource) - end - end + person = Person.find(role.person_id) + return unless person.local? + user = User.find_by_id(person.owner_id) + return if user.user_preferences.exists?(email_type: :someone_reported) + I18n.with_locale(user.language) do + resource[:email] = user.email + format(resource) end end private - def format(resource) - mail(to: resource[:email], subject: I18n.t('notifier.report_email.subject', :type => resource[:type])) do |format| - format.html { render 'report/report_email', :locals => { :resource => resource } } - format.text { render 'report/report_email', :locals => { :resource => resource } } - end + + def format(resource) + mail(to: resource[:email], subject: I18n.t("notifier.report_email.subject", type: resource[:type])) do |format| + format.html { render "report/report_email", locals: {resource: resource} } + format.text { render "report/report_email", locals: {resource: resource} } end + end end diff --git a/app/models/role.rb b/app/models/role.rb index b5452e8c5..d9f60e867 100644 --- a/app/models/role.rb +++ b/app/models/role.rb @@ -8,6 +8,7 @@ class Role < ActiveRecord::Base validates :name, inclusion: {in: %w(admin moderator spotlight)} scope :admins, -> { where(name: "admin") } + scope :moderators, -> { where(name: %w(moderator admin)) } def self.is_admin?(person) exists?(person_id: person.id, name: "admin") diff --git a/app/models/user.rb b/app/models/user.rb index 137f7d722..f3ef55715 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -482,7 +482,7 @@ class User < ActiveRecord::Base end def moderator? - Role.moderator?(self.person) + Role.moderator?(person) end def podmin_account? diff --git a/app/presenters/user_presenter.rb b/app/presenters/user_presenter.rb index f70bae290..076734d96 100644 --- a/app/presenters/user_presenter.rb +++ b/app/presenters/user_presenter.rb @@ -6,17 +6,16 @@ class UserPresenter self.aspects_ids = aspects_ids end - def to_json(options = {}) - self.user.person.as_api_response(:backbone).update( - { :notifications_count => notifications_count, - :unread_messages_count => unread_messages_count, - :admin => admin, - :moderator => moderator, - :aspects => aspects, - :services => services, - :following_count => self.user.contacts.receiving.count, - :configured_services => self.configured_services, - } + def to_json(options={}) + user.person.as_api_response(:backbone).update( + notifications_count: notifications_count, + unread_messages_count: unread_messages_count, + admin: admin, + moderator: moderator, + aspects: aspects, + services: services, + following_count: user.contacts.receiving.count, + configured_services: configured_services ).to_json(options) end @@ -25,14 +24,14 @@ class UserPresenter end def configured_services - user.services.map{|service| service.provider } + user.services.map(&:provider) end def aspects @aspects ||= begin aspects = AspectPresenter.as_collection(user.aspects) - no_aspects = self.aspects_ids.empty? - aspects.each{ |a| a[:selected] = no_aspects || self.aspects_ids.include?(a[:id].to_s) } + no_aspects = aspects_ids.empty? + aspects.each {|a| a[:selected] = no_aspects || aspects_ids.include?(a[:id].to_s) } end end diff --git a/app/views/report/index.html.haml b/app/views/report/index.html.haml index 5caf2f719..69645271f 100644 --- a/app/views/report/index.html.haml +++ b/app/views/report/index.html.haml @@ -1,3 +1,6 @@ +- content_for :head do + = stylesheet_link_tag :admin + .container %div - if current_user.admin? diff --git a/app/workers/mail/report_worker.rb b/app/workers/mail/report_worker.rb index 6d272f486..ede0f0867 100644 --- a/app/workers/mail/report_worker.rb +++ b/app/workers/mail/report_worker.rb @@ -4,9 +4,8 @@ module Workers sidekiq_options queue: :mail def perform(type, id) - ReportMailer.new_report(type, id).deliver_now + ReportMailer.new_report(type, id).each(&:deliver_now) end end end end - diff --git a/config/locales/diaspora/de.yml b/config/locales/diaspora/de.yml index f28c8eecf..3203c2b73 100644 --- a/config/locales/diaspora/de.yml +++ b/config/locales/diaspora/de.yml @@ -1433,4 +1433,4 @@ de: welcome: "Willkommen!" will_paginate: next_label: "nächstes »" - previous_label: "« voriges" \ No newline at end of file + previous_label: "« voriges" diff --git a/config/locales/javascript/javascript.en.yml b/config/locales/javascript/javascript.en.yml index c7f01c680..9104fff90 100644 --- a/config/locales/javascript/javascript.en.yml +++ b/config/locales/javascript/javascript.en.yml @@ -219,6 +219,7 @@ en: settings: "Settings" help: "Help" admin: "Admin" + moderator: "Moderator" log_out: "Log out" notifications: "Notifications" diff --git a/spec/controllers/report_controller_spec.rb b/spec/controllers/report_controller_spec.rb index c214e34d1..e5d5a49eb 100644 --- a/spec/controllers/report_controller_spec.rb +++ b/spec/controllers/report_controller_spec.rb @@ -1,3 +1,4 @@ + # Copyright (c) 2010-2011, Diaspora Inc. This file is # licensed under the Affero General Public License version 3 or later. See # the COPYRIGHT file. @@ -103,12 +104,14 @@ describe ReportController, type: :controller do before do Role.add_moderator(alice.person) end + it "succeeds" do put :update, id: @message.id, type: "post" expect(response.status).to eq(302) expect(Report.where(reviewed: true, item_id: @message.id, item_type: "post")).to be_truthy end end + context "mark comment report as moderator" do before do Role.add_moderator(alice.person) diff --git a/spec/mailers/report_spec.rb b/spec/mailers/report_spec.rb index b5ec54642..32c2afdb1 100644 --- a/spec/mailers/report_spec.rb +++ b/spec/mailers/report_spec.rb @@ -2,31 +2,40 @@ # licensed under the Affero General Public License version 3 or later. See # the COPYRIGHT file. -require 'spec_helper' +require "spec_helper" -describe Report, :type => :mailer do - describe '#make_notification' do +describe Report, type: :mailer do + describe "#make_notification" do before do - @remote = FactoryGirl.create(:person, :diaspora_handle => "remote@remote.net") - @user = FactoryGirl.create(:user_with_aspect, :username => "local") + @remote = FactoryGirl.create(:person, diaspora_handle: "remote@remote.net") + @user = FactoryGirl.create(:user_with_aspect, username: "local", language: "de") + @user2 = FactoryGirl.create(:user_with_aspect, username: "locally") Role.add_admin(@user.person) + Role.add_moderator(@user2.person) end - + it "should deliver successfully" do expect { - ReportMailer.new_report('post', 666).deliver_now + ReportMailer.new_report("post", 666).each(&:deliver_now) }.to_not raise_error end - + it "should be added to the delivery queue" do expect { - ReportMailer.new_report('post', 666).deliver_now - }.to change(ActionMailer::Base.deliveries, :size).by(1) + ReportMailer.new_report("post", 666).each(&:deliver_now) + }.to change(ActionMailer::Base.deliveries, :size).by(2) end it "should include correct recipient" do - ReportMailer.new_report('post', 666).deliver_now + ReportMailer.new_report("post", 666).each(&:deliver_now) expect(ActionMailer::Base.deliveries[0].to[0]).to include(@user.email) + expect(ActionMailer::Base.deliveries[1].to[0]).to include(@user2.email) + end + + it "should send mail in recipent's prefered language" do + ReportMailer.new_report("post", 666).each(&:deliver_now) + expect(ActionMailer::Base.deliveries[0].subject).to match("Ein neuer post wurde als anstößig markiert") + expect(ActionMailer::Base.deliveries[1].subject).to match("A new post was marked as offensive") end end end From c2c6ed5dea50a8ac50141c404afda9e17f7a3126 Mon Sep 17 00:00:00 2001 From: zaziemo Date: Wed, 2 Sep 2015 10:09:35 +0200 Subject: [PATCH 7/8] refactor moderator role and add specs #5324 --- app/controllers/application_controller.rb | 2 +- app/models/role.rb | 2 +- spec/models/role_spec.rb | 17 ++++++++++++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7d1b99d33..0bcd4a59d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -91,7 +91,7 @@ class ApplicationController < ActionController::Base end def redirect_unless_moderator - return if current_user.moderator? || current_user.admin? + return if current_user.moderator? redirect_to stream_url, notice: "you need to be an admin or moderator to do that" end diff --git a/app/models/role.rb b/app/models/role.rb index d9f60e867..cbe5644ef 100644 --- a/app/models/role.rb +++ b/app/models/role.rb @@ -19,7 +19,7 @@ class Role < ActiveRecord::Base end def self.moderator?(person) - exists?(person_id: person.id, name: "moderator") + moderators.exists?(person_id: person.id) end def self.add_moderator(person) diff --git a/spec/models/role_spec.rb b/spec/models/role_spec.rb index 06225ab5d..e0f21f7bb 100644 --- a/spec/models/role_spec.rb +++ b/spec/models/role_spec.rb @@ -6,7 +6,7 @@ describe Role do describe "validations" do it { should validate_presence_of(:person) } it { should validate_uniqueness_of(:name).scoped_to(:person_id) } - it { should validate_inclusion_of(:name).in_array(%w(admin spotlight)) } + it { should validate_inclusion_of(:name).in_array(%w(admin spotlight moderator)) } end describe "associations" do @@ -15,6 +15,7 @@ describe Role do describe "scopes" do let!(:admin_role) { person.roles.create(name: "admin") } + let!(:moderator_role) { person.roles.create(name: "moderator") } let!(:spotlight_role) { person.roles.create(name: "spotlight") } describe ".admins" do @@ -22,6 +23,20 @@ describe Role do expect(Role.admins).to match_array([admin_role]) end end + + describe ".moderators" do + it "should include admins" do + expect(Role.moderators).to include(admin_role) + end + + it "should include moderators" do + expect(Role.moderators).to include(moderator_role) + end + + it "should not include normal users" do + expect(Role.moderators).to_not include(person) + end + end end describe ".is_admin?" do From d38741d5ebc8ac8a4e0696f172713626ed1f3a6f Mon Sep 17 00:00:00 2001 From: zaziemo Date: Wed, 2 Sep 2015 20:54:35 +0200 Subject: [PATCH 8/8] add more specs to test moderator role fixes #5324 closes #6351 --- Changelog.md | 1 + spec/models/role_spec.rb | 42 ++++++++++++++++++++++++++++------------ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/Changelog.md b/Changelog.md index 41ee68518..6b2a3a7a7 100644 --- a/Changelog.md +++ b/Changelog.md @@ -6,6 +6,7 @@ ## Features * Show spinner on initial stream load [#6384](https://github.com/diaspora/diaspora/pull/6384) +* Add new moderator role. Moderators can view and act on reported posts [#6351](https://github.com/diaspora/diaspora/pull/6351) # 0.5.3.0 diff --git a/spec/models/role_spec.rb b/spec/models/role_spec.rb index e0f21f7bb..225cd4ead 100644 --- a/spec/models/role_spec.rb +++ b/spec/models/role_spec.rb @@ -1,7 +1,11 @@ require "spec_helper" describe Role do - let(:person) { create(:person) } + let!(:person) { create(:person) } + let!(:admin) { create(:person) } + let!(:admin_role) { admin.roles.create(name: "admin") } + let!(:moderator) { create(:person) } + let!(:moderator_role) { moderator.roles.create(name: "moderator") } describe "validations" do it { should validate_presence_of(:person) } @@ -14,10 +18,6 @@ describe Role do end describe "scopes" do - let!(:admin_role) { person.roles.create(name: "admin") } - let!(:moderator_role) { person.roles.create(name: "moderator") } - let!(:spotlight_role) { person.roles.create(name: "spotlight") } - describe ".admins" do it "includes admin roles" do expect(Role.admins).to match_array([admin_role]) @@ -32,10 +32,6 @@ describe Role do it "should include moderators" do expect(Role.moderators).to include(moderator_role) end - - it "should not include normal users" do - expect(Role.moderators).to_not include(person) - end end end @@ -45,10 +41,32 @@ describe Role do end context "when the person is an admin" do - before { person.roles.create(name: "admin") } - it "is true" do - expect(Role.is_admin?(person)).to be true + expect(Role.is_admin?(admin)).to be true + end + end + + context "when the person is a moderator" do + it "is false" do + expect(Role.is_admin?(moderator)).to be false + end + end + end + + describe ".moderator?" do + it "defaults to false" do + expect(Role.moderator?(person)).to be false + end + + context "when the person is a moderator" do + it "is true" do + expect(Role.moderator?(moderator)).to be true + end + end + + context "when the person is an admin" do + it "is true" do + expect(Role.moderator?(admin)).to be true end end end