diff options
| -rw-r--r-- | app/controllers/journey_patterns_controller.rb | 7 | ||||
| -rw-r--r-- | app/policies/journey_pattern_policy.rb | 22 | ||||
| -rw-r--r-- | app/views/journey_patterns/show.html.slim | 13 | ||||
| -rw-r--r-- | app/views/routes/show.html.slim | 7 | ||||
| -rw-r--r-- | db/migrate/20170117163532_give_journey_patterns_permissions_to_users.rb | 8 | ||||
| -rw-r--r-- | db/schema.rb | 2 | ||||
| -rw-r--r-- | spec/features/journey_pattern_spec.rb | 47 | ||||
| -rw-r--r-- | spec/features/routes_spec.rb | 74 | ||||
| -rw-r--r-- | spec/support/devise.rb | 6 |
9 files changed, 134 insertions, 52 deletions
diff --git a/app/controllers/journey_patterns_controller.rb b/app/controllers/journey_patterns_controller.rb index b7cdccc72..69f16321e 100644 --- a/app/controllers/journey_patterns_controller.rb +++ b/app/controllers/journey_patterns_controller.rb @@ -15,6 +15,8 @@ class JourneyPatternsController < ChouetteController alias_method :route, :parent alias_method :journey_pattern, :resource + before_action :check_policy, only: [:edit, :update, :destroy] + def index index! do |format| format.html { redirect_to referential_line_route_path(@referential,@line,@route) } @@ -51,9 +53,12 @@ class JourneyPatternsController < ChouetteController @journey_patterns ||= @q.result(:distinct => true).order(:name) end - private + def check_policy + authorize resource + end + def journey_pattern_params params.require(:journey_pattern).permit(:route_id, :objectid, :object_version, :creation_time, :creator_id, :name, :comment, :registration_number, :published_name, :departure_stop_point_id, :arrival_stop_point_id, {:stop_point_ids => []}) end diff --git a/app/policies/journey_pattern_policy.rb b/app/policies/journey_pattern_policy.rb new file mode 100644 index 000000000..95ab23318 --- /dev/null +++ b/app/policies/journey_pattern_policy.rb @@ -0,0 +1,22 @@ +class JourneyPatternPolicy < ApplicationPolicy + class Scope < Scope + def resolve + scope + end + end + + def create? + user.has_permission?('journey_patterns.create') + end + + def edit? + user.has_permission?('journey_patterns.edit') + end + + def destroy? + user.has_permission?('journey_patterns.destroy') + end + + def update? ; edit? end + def new? ; create? end +end diff --git a/app/views/journey_patterns/show.html.slim b/app/views/journey_patterns/show.html.slim index 0fee1a257..417e4dc16 100644 --- a/app/views/journey_patterns/show.html.slim +++ b/app/views/journey_patterns/show.html.slim @@ -30,11 +30,14 @@ h3.journey_pattern_stop_points = t('.stop_points') - content_for :sidebar do ul.actions li - = link_to t('journey_patterns.actions.new'), new_referential_line_route_journey_pattern_path(@referential, @line, @route), class: 'add' + - if policy(@journey_pattern).create? + = link_to t('journey_patterns.actions.new'), new_referential_line_route_journey_pattern_path(@referential, @line, @route), class: 'add' li - = link_to t('journey_patterns.actions.edit'), edit_referential_line_route_journey_pattern_path(@referential, @line, @route, @journey_pattern), class: 'edit' + - if policy(@journey_pattern).edit? + = link_to t('journey_patterns.actions.edit'), edit_referential_line_route_journey_pattern_path(@referential, @line, @route, @journey_pattern), class: 'edit' li - = link_to t('journey_patterns.actions.destroy'), referential_line_route_journey_pattern_path(@referential, @line, @route, @journey_pattern), :method => :delete, :data => {:confirm => t('journey_patterns.actions.destroy_confirm')}, class: 'remove' + - if policy(@journey_pattern).destroy? + = link_to t('journey_patterns.actions.destroy'), referential_line_route_journey_pattern_path(@referential, @line, @route, @journey_pattern), :method => :delete, :data => {:confirm => t('journey_patterns.actions.destroy_confirm')}, class: 'remove' li = link_to edit_referential_line_route_journey_pattern_route_sections_selector_path(@referential, @line, @route, @journey_pattern), class: "edit#{' control-shape' if @journey_pattern.control?}" do = t('journey_patterns.actions.edit_route_sections') @@ -43,5 +46,5 @@ h3.journey_pattern_stop_points = t('.stop_points') li = link_to t('journey_patterns.journey_pattern.vehicle_journey_at_stops'), referential_line_route_vehicle_journeys_path(@referential, @line, @route, :q => {:journey_pattern_id_eq => @journey_pattern.id}), class: 'clock' - - = creation_tag(@journey_pattern)
\ No newline at end of file + + = creation_tag(@journey_pattern) diff --git a/app/views/routes/show.html.slim b/app/views/routes/show.html.slim index 6a1d16c66..e18ec295d 100644 --- a/app/views/routes/show.html.slim +++ b/app/views/routes/show.html.slim @@ -84,7 +84,12 @@ p.after_map span.caret ul.dropdown-menu li = link_to 'Voir', [@referential, @line, @route, journey_pattern], title: "#{Chouette::JourneyPattern.model_name.human.capitalize} #{journey_name(journey_pattern)}" - li = link_to 'Supprimer', referential_line_route_journey_pattern_path(@referential, @line, @route, journey_pattern), method: :delete, data: {confirm: t('journey_patterns.actions.destroy_confirm')} + li + - if policy(journey_pattern).edit? + = link_to t('actions.edit'), edit_referential_line_route_journey_pattern_path(@referential, @line, @route, journey_pattern) + li + - if policy(journey_pattern).destroy? + = link_to t('actions.destroy'), referential_line_route_journey_pattern_path(@referential, @line, @route, journey_pattern), method: :delete, data: {confirm: t('journey_patterns.actions.destroy_confirm')} / .panel-body / .journey_patterns.paginated_content diff --git a/db/migrate/20170117163532_give_journey_patterns_permissions_to_users.rb b/db/migrate/20170117163532_give_journey_patterns_permissions_to_users.rb new file mode 100644 index 000000000..8e403d5cb --- /dev/null +++ b/db/migrate/20170117163532_give_journey_patterns_permissions_to_users.rb @@ -0,0 +1,8 @@ +class GiveJourneyPatternsPermissionsToUsers < ActiveRecord::Migration + def change + User.find_each do |user| + user.permissions += ['journey_patterns.create', 'journey_patterns.edit', 'journey_patterns.destroy'] + user.save! + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 880597573..5fb6cd164 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170116140623) do +ActiveRecord::Schema.define(version: 20170117163532) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" diff --git a/spec/features/journey_pattern_spec.rb b/spec/features/journey_pattern_spec.rb index 1dbd2752d..380241099 100644 --- a/spec/features/journey_pattern_spec.rb +++ b/spec/features/journey_pattern_spec.rb @@ -8,6 +8,53 @@ describe "JourneyPatterns", :type => :feature do let!(:route) { create(:route, :line => line) } let!(:journey_pattern) { create(:journey_pattern, :route => route) } + describe 'show' do + context 'user has permission to create journey patterns' do + it 'shows the create link for journey pattern' do + visit referential_line_route_journey_pattern_path(referential, line, route, journey_pattern) + expect(page).to have_content(I18n.t('journey_patterns.actions.new')) + end + end + + context 'user does not have permission to create journey patterns' do + it 'does not show the create link for journey pattern' do + @user.update_attribute(:permissions, ['journey_patterns.edit', 'journey_patterns.destroy']) + visit referential_line_route_journey_pattern_path(referential, line, route, journey_pattern) + expect(page).not_to have_content(I18n.t('journey_patterns.actions.new')) + end + end + + context 'user has permission to edit journey patterns' do + it 'shows the edit link for journey pattern' do + visit referential_line_route_journey_pattern_path(referential, line, route, journey_pattern) + expect(page).to have_content(I18n.t('journey_patterns.actions.edit')) + end + end + + context 'user does not have permission to edit journey patterns' do + it 'does not show the edit link for journey pattern' do + @user.update_attribute(:permissions, ['journey_patterns.create', 'journey_patterns.destroy']) + visit referential_line_route_journey_pattern_path(referential, line, route, journey_pattern) + expect(page).not_to have_content(I18n.t('journey_patterns.actions.edit')) + end + end + + context 'user has permission to destroy journey patterns' do + it 'shows the destroy link for journey pattern' do + visit referential_line_route_journey_pattern_path(referential, line, route, journey_pattern) + expect(page).to have_content(I18n.t('journey_patterns.actions.destroy')) + end + end + + context 'user does not have permission to edit journey patterns' do + it 'does not show the destroy link for journey pattern' do + @user.update_attribute(:permissions, ['journey_patterns.create', 'journey_patterns.edit']) + visit referential_line_route_journey_pattern_path(referential, line, route, journey_pattern) + expect(page).not_to have_content(I18n.t('journey_patterns.actions.destroy')) + end + end + end + # describe "from routes page to a journey_pattern page" do # it "display route's journey_patterns" do # visit referential_line_route_path(referential,line,route) diff --git a/spec/features/routes_spec.rb b/spec/features/routes_spec.rb index 70d32c777..bc2088712 100644 --- a/spec/features/routes_spec.rb +++ b/spec/features/routes_spec.rb @@ -54,6 +54,38 @@ describe "Routes", :type => :feature do end end + describe 'show' do + context 'user has permission to edit journey patterns' do + it 'shows edit links for journey patterns' do + visit referential_line_route_path(referential, line, route) + expect(page).to have_content(I18n.t('actions.edit')) + end + end + + context 'user does not have permission to edit journey patterns' do + it 'does not show edit links for journey patterns' do + @user.update_attribute(:permissions, ['journey_patterns.create', 'journey_patterns.destroy']) + visit referential_line_route_path(referential, line, route) + expect(page).not_to have_content(I18n.t('actions.edit')) + end + end + + context 'user has permission to destroy journey patterns' do + it 'shows destroy links for journey patterns' do + visit referential_line_route_path(referential, line, route) + expect(page).to have_content(I18n.t('actions.destroy')) + end + end + + context 'user does not have permission to edit journey patterns' do + it 'does not show destroy links for journey patterns' do + @user.update_attribute(:permissions, ['journey_patterns.create', 'journey_patterns.edit']) + visit referential_line_route_path(referential, line, route) + expect(page).not_to have_content(I18n.t('actions.destroy')) + end + end + end + describe 'referential line show' do context 'user has permission to edit routes' do it 'shows edit buttons for routes' do @@ -101,45 +133,3 @@ describe "Routes", :type => :feature do end end end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spec/support/devise.rb b/spec/support/devise.rb index ae166d284..7cfa17f44 100644 --- a/spec/support/devise.rb +++ b/spec/support/devise.rb @@ -3,7 +3,8 @@ module DeviseRequestHelper def login_user organisation = Organisation.where(:code => "first").first_or_create(attributes_for(:organisation)) - @user ||= create(:user, :organisation => organisation, :permissions => ['routes.create', 'routes.edit', 'routes.destroy']) + @user ||= create(:user, :organisation => organisation, + :permissions => ['routes.create', 'routes.edit', 'routes.destroy', 'journey_patterns.create', 'journey_patterns.edit', 'journey_patterns.destroy']) login_as @user, :scope => :user # post_via_redirect user_session_path, 'user[email]' => @user.email, 'user[password]' => @user.password end @@ -34,7 +35,8 @@ module DeviseControllerHelper before(:each) do @request.env["devise.mapping"] = Devise.mappings[:user] organisation = Organisation.where(:code => "first").first_or_create(attributes_for(:organisation)) - user = create(:user, :organisation => organisation, :permissions => ['routes.create', 'routes.edit', 'routes.destroy']) + user = create(:user, :organisation => organisation, + :permissions => ['routes.create', 'routes.edit', 'routes.destroy', 'journey_patterns.create', 'journey_patterns.edit', 'journey_patterns.destroy']) sign_in user end end |
