aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/controllers/journey_patterns_controller.rb7
-rw-r--r--app/policies/journey_pattern_policy.rb22
-rw-r--r--app/views/journey_patterns/show.html.slim13
-rw-r--r--app/views/routes/show.html.slim7
-rw-r--r--db/migrate/20170117163532_give_journey_patterns_permissions_to_users.rb8
-rw-r--r--db/schema.rb2
-rw-r--r--spec/features/journey_pattern_spec.rb47
-rw-r--r--spec/features/routes_spec.rb74
-rw-r--r--spec/support/devise.rb6
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