Skip to content

Commit

Permalink
Enforce permissions to export results
Browse files Browse the repository at this point in the history
  • Loading branch information
sauloperez committed Oct 5, 2020
1 parent 748bd64 commit 90db955
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ module Decidim
module ActionDelegator
module Admin
class ExportsController < ActionDelegator::Admin::ApplicationController
include NeedsPermission
include Consultations::NeedsConsultation

def create
enforce_permission_to :export_results, :consultation

ExportConsultationResultsJob.perform_later(current_user, current_consultation)

flash[:notice] = t("decidim.admin.exports.notice")

redirect_back(fallback_location: decidim_admin_consultations.results_consultation_path(current_consultation))
end
end
Expand Down
11 changes: 10 additions & 1 deletion app/permissions/decidim/action_delegator/permissions.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ class Permissions < Decidim::DefaultPermissions
def permissions
return permission_action unless user.admin?
return permission_action unless permission_action.scope == :admin
return permission_action unless [:delegation, :setting].include?(permission_action.subject)
return permission_action unless action_delegator_subject?
return permission_action unless consultation_results_exports_action?

allow! if can_perform_action?(permission_action.action, resource)

Expand All @@ -15,6 +16,14 @@ def permissions

private

def consultation_results_exports_action?
permission_action.action == :export_results
end

def action_delegator_subject?
[:delegation, :setting, :consultation].include?(permission_action.subject)
end

def can_perform_action?(action, resource)
if action == :destroy
resource.present?
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# frozen_string_literal: true

require "spec_helper"

module Decidim
module ActionDelegator
describe Admin::ExportsController, type: :controller do
routes { Decidim::ActionDelegator::AdminEngine.routes }

let(:organization) { create(:organization) }
let(:user) { create(:user, :admin, :confirmed, organization: organization) }
let(:consultation) { create(:consultation, :finished, :unpublished_results, organization: organization) }

before do
request.env["decidim.current_organization"] = organization
sign_in user
end

describe "#create" do
it "authorizes the action" do
expect(controller).to receive(:allowed_to?).with(:export_results, :consultation, {})

post :create, params: { consultation_slug: consultation.slug }
end
end
end
end
end

0 comments on commit 90db955

Please sign in to comment.