aboutsummaryrefslogtreecommitdiffstats
path: root/app/controllers
diff options
context:
space:
mode:
authorjpl2017-03-20 16:46:20 +0100
committerjpl2017-03-20 16:46:20 +0100
commitcfc35aca0f1383069e1f2cc5ed1026d085a1fc1d (patch)
treed194a26f6ea698a32b7f45b58abc59b10e0ae83c /app/controllers
parent423b5636c4a8ee1eae530e690e8fb1d3b3aa1c05 (diff)
parent516971ceec5919e93105e3b01492090ba2a106cf (diff)
downloadchouette-core-cfc35aca0f1383069e1f2cc5ed1026d085a1fc1d.tar.bz2
Merge branch 'master' into staging
Diffstat (limited to 'app/controllers')
-rw-r--r--app/controllers/autocomplete_stop_areas_controller.rb6
-rw-r--r--app/controllers/autocomplete_time_tables_controller.rb25
-rw-r--r--app/controllers/devise/cas_sessions_controller.rb127
-rw-r--r--app/controllers/imports_controller.rb8
-rw-r--r--app/controllers/journey_patterns_collections_controller.rb2
-rw-r--r--app/controllers/line_footnotes_controller.rb4
-rw-r--r--app/controllers/referential_lines_controller.rb18
-rw-r--r--app/controllers/referentials_controller.rb6
-rw-r--r--app/controllers/vehicle_journeys_collections_controller.rb19
-rw-r--r--app/controllers/vehicle_journeys_controller.rb75
-rw-r--r--app/controllers/workbenches_controller.rb46
11 files changed, 291 insertions, 45 deletions
diff --git a/app/controllers/autocomplete_stop_areas_controller.rb b/app/controllers/autocomplete_stop_areas_controller.rb
index 78b4247ec..6daa8a169 100644
--- a/app/controllers/autocomplete_stop_areas_controller.rb
+++ b/app/controllers/autocomplete_stop_areas_controller.rb
@@ -5,7 +5,7 @@ class AutocompleteStopAreasController < InheritedResources::Base
def around
stop_area = referential.stop_areas.find params[:id]
- @stop_areas = stop_area.around(referential.stop_areas, 100)
+ @stop_areas = stop_area.around(referential.stop_areas.where(area_type: params[:target_type]), 300)
end
protected
@@ -17,8 +17,8 @@ class AutocompleteStopAreasController < InheritedResources::Base
scope = scope.possible_parents if relation_parent?
scope = scope.possible_parents if relation_children?
end
- args = [].tap{|arg| 3.times{arg << "%#{params[:q]}%"}}
- @stop_areas = scope.where("name ILIKE ? OR registration_number ILIKE ? OR objectid ILIKE ?", *args).limit(50)
+ args = [].tap{|arg| 4.times{arg << "%#{params[:q]}%"}}
+ @stop_areas = scope.where("name ILIKE ? OR city_name ILIKE ? OR registration_number ILIKE ? OR objectid ILIKE ?", *args).limit(50)
@stop_areas
end
diff --git a/app/controllers/autocomplete_time_tables_controller.rb b/app/controllers/autocomplete_time_tables_controller.rb
index ce3824b7a..e977a28b0 100644
--- a/app/controllers/autocomplete_time_tables_controller.rb
+++ b/app/controllers/autocomplete_time_tables_controller.rb
@@ -1,25 +1,28 @@
class AutocompleteTimeTablesController < InheritedResources::Base
respond_to :json, :only => [:index]
+ before_action :switch_referential
include ReferentialSupport
+ def switch_referential
+ Apartment::Tenant.switch!(referential.slug)
+ end
+
+ def referential
+ @referential ||= current_organisation.referentials.find params[:referential_id]
+ end
+
protected
def select_time_tables
+ scope = referential.time_tables
if params[:route_id]
- referential.time_tables.joins( vehicle_journeys: :route).where( "routes.id IN (#{params[:route_id]})")
- else
- referential.time_tables
- end
- end
-
- def referential_time_tables
- @referential_time_tables ||= select_time_tables
+ scope = scope.joins(vehicle_journeys: :route).where( "routes.id IN (#{params[:route_id]})")
+ end
+ scope
end
def collection
- comment_selection = referential_time_tables.select{ |p| p.comment =~ /#{params[:q]}/i }
- tag_selection = referential_time_tables.tagged_with( params[:q], :wild => true)
- @time_tables = (comment_selection + tag_selection).uniq
+ @time_tables = select_time_tables.search(params[:q]).result.paginate(page: params[:page])
end
end
diff --git a/app/controllers/devise/cas_sessions_controller.rb b/app/controllers/devise/cas_sessions_controller.rb
new file mode 100644
index 000000000..ecc7e9f7e
--- /dev/null
+++ b/app/controllers/devise/cas_sessions_controller.rb
@@ -0,0 +1,127 @@
+class Devise::CasSessionsController < Devise::SessionsController
+ include DeviseCasAuthenticatable::SingleSignOut::DestroySession
+
+ unless Rails.version =~/^4/
+ unloadable
+ end
+
+ skip_before_filter :verify_authenticity_token, :only => [:single_sign_out]
+
+ def new
+ if memcache_checker.session_store_memcache? && !memcache_checker.alive?
+ raise "memcache is down, can't get session data from it"
+ end
+
+ redirect_to(cas_login_url)
+ end
+
+ def service
+ redirect_to after_sign_in_path_for(warden.authenticate!(:scope => resource_name))
+ end
+
+ def unregistered
+ end
+
+ def destroy
+ # if :cas_create_user is false a CAS session might be open but not signed_in
+ # in such case we destroy the session here
+ if signed_in?(resource_name)
+ sign_out(resource_name)
+ else
+ reset_session
+ end
+
+ redirect_to(cas_logout_url)
+ end
+
+ def single_sign_out
+ if ::Devise.cas_enable_single_sign_out
+ session_index = read_session_index
+ if session_index
+ logger.debug "Intercepted single-sign-out request for CAS session #{session_index}."
+ session_id = ::DeviseCasAuthenticatable::SingleSignOut::Strategies.current_strategy.find_session_id_by_index(session_index)
+ if session_id
+ logger.debug "Found Session ID #{session_id} with index key #{session_index}"
+ destroy_cas_session(session_index, session_id)
+ end
+ else
+ logger.warn "Ignoring CAS single-sign-out request as no session index could be parsed from the parameters."
+ end
+ else
+ logger.warn "Ignoring CAS single-sign-out request as feature is not currently enabled."
+ end
+
+ render :nothing => true
+ end
+
+ private
+
+ def read_session_index
+ if request.headers['CONTENT_TYPE'] =~ %r{^multipart/}
+ false
+ elsif request.post? && params['logoutRequest'] =~
+ %r{^<samlp:LogoutRequest.*?<samlp:SessionIndex>(.*)</samlp:SessionIndex>}m
+ $~[1]
+ else
+ false
+ end
+ end
+
+ def destroy_cas_session(session_index, session_id)
+ if destroy_session_by_id(session_id)
+ logger.debug "Destroyed session #{session_id} corresponding to service ticket #{session_index}."
+ end
+ ::DeviseCasAuthenticatable::SingleSignOut::Strategies.current_strategy.delete_session_index(session_index)
+ end
+
+ def cas_login_url
+ flash.clear # Fix 2742
+ ::Devise.cas_client.add_service_to_login_url(::Devise.cas_service_url(request.url, devise_mapping))
+ end
+ helper_method :cas_login_url
+
+ def request_url
+ return @request_url if @request_url
+ @request_url = request.protocol.dup
+ @request_url << request.host
+ @request_url << ":#{request.port.to_s}" unless request.port == 80
+ @request_url
+ end
+
+ def cas_destination_url
+ return unless ::Devise.cas_logout_url_param == 'destination'
+ if !::Devise.cas_destination_url.blank?
+ url = Devise.cas_destination_url
+ else
+ url = request_url.dup
+ url << after_sign_out_path_for(resource_name)
+ end
+ end
+
+ def cas_follow_url
+ return unless ::Devise.cas_logout_url_param == 'follow'
+ if !::Devise.cas_follow_url.blank?
+ url = Devise.cas_follow_url
+ else
+ url = request_url.dup
+ url << after_sign_out_path_for(resource_name)
+ end
+ end
+
+ def cas_service_url
+ ::Devise.cas_service_url(request_url.dup, devise_mapping)
+ end
+
+ def cas_logout_url
+ begin
+ ::Devise.cas_client.logout_url(cas_destination_url, cas_follow_url, cas_service_url)
+ rescue ArgumentError
+ # Older rubycas-clients don't accept a service_url
+ ::Devise.cas_client.logout_url(cas_destination_url, cas_follow_url)
+ end
+ end
+
+ def memcache_checker
+ @memcache_checker ||= DeviseCasAuthenticatable::MemcacheChecker.new(Rails.configuration)
+ end
+end
diff --git a/app/controllers/imports_controller.rb b/app/controllers/imports_controller.rb
index 3eab7e66b..9b2101584 100644
--- a/app/controllers/imports_controller.rb
+++ b/app/controllers/imports_controller.rb
@@ -21,6 +21,14 @@ class ImportsController < BreadcrumbController
end
end
+ def download
+ if params[:token] == resource.token_download
+ send_file resource.file.path
+ else
+ user_not_authorized
+ end
+ end
+
private
def import_params
diff --git a/app/controllers/journey_patterns_collections_controller.rb b/app/controllers/journey_patterns_collections_controller.rb
index d96d7f9c7..4d1a06fd3 100644
--- a/app/controllers/journey_patterns_collections_controller.rb
+++ b/app/controllers/journey_patterns_collections_controller.rb
@@ -10,7 +10,7 @@ class JourneyPatternsCollectionsController < ChouetteController
alias_method :route, :parent
def show
- @q = route.journey_patterns.includes(:stop_points)
+ @q = route.journey_patterns.search(params[:q]).result(distinct: true).includes(:stop_points)
@ppage = 10
@journey_patterns ||= @q.paginate(page: params[:page], per_page: @ppage).order(:name)
diff --git a/app/controllers/line_footnotes_controller.rb b/app/controllers/line_footnotes_controller.rb
index 192f902c8..8f7a38512 100644
--- a/app/controllers/line_footnotes_controller.rb
+++ b/app/controllers/line_footnotes_controller.rb
@@ -1,6 +1,9 @@
class LineFootnotesController < ChouetteController
defaults :resource_class => Chouette::Line, :instance_name => 'line'
include PolicyChecker
+ before_action :check_policy, only: [:edit, :update, :destroy]
+ respond_to :json, :only => :show
+
belongs_to :referential
def show
@@ -34,6 +37,7 @@ class LineFootnotesController < ChouetteController
def resource
@referential = Referential.find params[:referential_id]
@line = @referential.lines.find params[:line_id]
+ @footnotes = @line.footnotes
end
def line_params
diff --git a/app/controllers/referential_lines_controller.rb b/app/controllers/referential_lines_controller.rb
index 4842cebc1..5d36e7da7 100644
--- a/app/controllers/referential_lines_controller.rb
+++ b/app/controllers/referential_lines_controller.rb
@@ -23,18 +23,22 @@ class ReferentialLinesController < ChouetteController
end
def show
- @map = LineMap.new(resource).with_helpers(self)
+ @routes = resource.routes
- @q = @line.routes.ransack(params[:q])
+ case sort_route_column
+ when "stop_points", "journey_patterns"
+ left_join = %Q{LEFT JOIN "#{sort_route_column}" ON "#{sort_route_column}"."route_id" = "routes"."id"}
- if sort_route_column && sort_route_direction
- @routes ||= @q.result(distinct: true).order(sort_route_column + ' ' + sort_route_direction)
+ @routes = @routes.joins(left_join).group(:id).order("count(#{sort_route_column}.route_id) #{sort_route_direction}")
else
- @routes ||= @q.result(distinct: true).order(:name)
+ @routes = @routes.order("#{sort_route_column} #{sort_route_direction}")
end
+
+ @q = @routes.ransack(params[:q])
+ @routes = @q.result
+
@routes = @routes.paginate(page: params[:page], per_page: 10)
- @group_of_lines = @line.group_of_lines
show! do
build_breadcrumb :show
end
@@ -106,7 +110,7 @@ class ReferentialLinesController < ChouetteController
end
def sort_route_column
- @line.routes.column_names.include?(params[:sort]) ? params[:sort] : 'name'
+ (@line.routes.column_names + %w{stop_points journey_patterns}).include?(params[:sort]) ? params[:sort] : 'name'
end
def sort_route_direction
%w[asc desc].include?(params[:direction]) ? params[:direction] : 'asc'
diff --git a/app/controllers/referentials_controller.rb b/app/controllers/referentials_controller.rb
index 5ff296659..9a9e9b151 100644
--- a/app/controllers/referentials_controller.rb
+++ b/app/controllers/referentials_controller.rb
@@ -81,7 +81,7 @@ class ReferentialsController < BreadcrumbController
end
def lines_collection
- @q = resource.lines.search(params[:q])
+ @q = resource.lines.includes(:company, :network).search(params[:q])
if sort_column && sort_direction
@reflines ||=
@@ -115,8 +115,10 @@ class ReferentialsController < BreadcrumbController
private
def sort_column
- resource.lines.include?(params[:sort]) ? params[:sort] : 'name'
+ sortable_columns = Chouette::Line.column_names + ['networks.name', 'companies.name']
+ params[:sort] if sortable_columns.include?(params[:sort])
end
+
def sort_direction
%w[asc desc].include?(params[:direction]) ? params[:direction] : 'asc'
end
diff --git a/app/controllers/vehicle_journeys_collections_controller.rb b/app/controllers/vehicle_journeys_collections_controller.rb
new file mode 100644
index 000000000..caaa2258e
--- /dev/null
+++ b/app/controllers/vehicle_journeys_collections_controller.rb
@@ -0,0 +1,19 @@
+class VehicleJourneysCollectionsController < ChouetteController
+ respond_to :json
+ belongs_to :referential do
+ belongs_to :line, :parent_class => Chouette::Line do
+ belongs_to :route, :parent_class => Chouette::Route
+ end
+ end
+ alias_method :route, :parent
+
+ def update
+ state = JSON.parse request.raw_post
+ Chouette::VehicleJourney.state_update route, state
+ errors = state.any? {|item| item['errors']}
+
+ respond_to do |format|
+ format.json { render json: state, status: errors ? :unprocessable_entity : :ok }
+ end
+ end
+end
diff --git a/app/controllers/vehicle_journeys_controller.rb b/app/controllers/vehicle_journeys_controller.rb
index 45cb25344..5199d8632 100644
--- a/app/controllers/vehicle_journeys_controller.rb
+++ b/app/controllers/vehicle_journeys_controller.rb
@@ -1,5 +1,9 @@
class VehicleJourneysController < ChouetteController
defaults :resource_class => Chouette::VehicleJourney
+ before_action :check_policy, only: [:edit, :update, :destroy]
+ before_action :user_permissions, only: :index
+ before_action :ransack_params, only: :index
+
respond_to :json, :only => :index
respond_to :js, :only => [:select_journey_pattern, :edit, :new, :index]
@@ -10,6 +14,9 @@ class VehicleJourneysController < ChouetteController
end
include PolicyChecker
+ alias_method :vehicle_journeys, :collection
+ alias_method :route, :parent
+ alias_method :vehicle_journey, :resource
def select_journey_pattern
if params[:journey_pattern_id]
@@ -29,6 +36,34 @@ class VehicleJourneysController < ChouetteController
end
def index
+ @stop_points_list = []
+ route.stop_points.each do |sp|
+ @stop_points_list << {
+ :id => sp.stop_area.id,
+ :route_id => sp.try(:route_id),
+ :object_id => sp.try(:objectid),
+ :position => sp.try(:position),
+ :for_boarding => sp.try(:for_boarding),
+ :for_alighting => sp.try(:for_alighting),
+ :name => sp.stop_area.try(:name),
+ :zip_code => sp.stop_area.try(:zip_code),
+ :city_name => sp.stop_area.try(:city_name),
+ :comment => sp.stop_area.try(:comment),
+ :area_type => sp.stop_area.try(:area_type),
+ :registration_number => sp.stop_area.try(:registration_number),
+ :nearest_topic_name => sp.stop_area.try(:nearest_topic_name),
+ :fare_code => sp.stop_area.try(:fare_code),
+ :longitude => sp.stop_area.try(:longitude),
+ :latitude => sp.stop_area.try(:latitude),
+ :long_lat_type => sp.stop_area.try(:long_lat_type),
+ :country_code => sp.stop_area.try(:country_code),
+ :street_name => sp.stop_area.try(:street_name)
+ }
+ end
+
+ @jp_origin = Chouette::JourneyPattern.find_by(objectid: params[:jp])
+
+
index! do
if collection.out_of_bounds?
redirect_to params.merge(:page => 1)
@@ -37,7 +72,6 @@ class VehicleJourneysController < ChouetteController
end
end
-
# overwrite inherited resources to use delete instead of destroy
# foreign keys will propagate deletion)
def destroy_resource(object)
@@ -45,20 +79,14 @@ class VehicleJourneysController < ChouetteController
end
protected
-
- alias_method :vehicle_journey, :resource
-
def collection
- unless @vehicle_journeys
- @vehicle_filter = VehicleFilter.new adapted_params
- @vehicle_filter.journey_category_model = resource_class.model_name.route_key
- @q = @vehicle_filter.vehicle_journeys.search @vehicle_filter.filtered_params
- @vehicle_journeys = @q.result( :distinct => false ).paginate(:page => params[:page], :per_page => 8)
- end
- matrix
+ @ppage = 20
+ @q = route.sorted_vehicle_journeys('vehicle_journeys').search params[:q]
+ @vehicle_journeys = @q.result.paginate(:page => params[:page], :per_page => @ppage)
+ @footnotes = route.line.footnotes.to_json
+ @matrix = resource_class.matrix(@vehicle_journeys)
@vehicle_journeys
end
- alias_method :vehicle_journeys, :collection
def adapted_params
params.tap do |adapted_params|
@@ -79,7 +107,29 @@ class VehicleJourneysController < ChouetteController
@matrix = resource_class.matrix(@vehicle_journeys)
end
+ def check_policy
+ authorize resource
+ end
+
+ def user_permissions
+ @perms = {}.tap do |perm|
+ ['vehicle_journeys.create', 'vehicle_journeys.edit', 'vehicle_journeys.destroy'].each do |name|
+ perm[name] = current_user.permissions.include?(name)
+ end
+ end
+ @perms = @perms.to_json
+ end
+
private
+ def ransack_params
+ if params[:q]
+ params[:q] = params[:q].reject{|k| params[:q][k] == 'undefined'}
+ [:departure_time_gteq, :departure_time_lteq].each do |filter|
+ time = params[:q]["vehicle_journey_at_stops_#{filter}"]
+ params[:q]["vehicle_journey_at_stops_#{filter}"] = "2000-01-01 #{time}:00 UTC"
+ end
+ end
+ end
def vehicle_journey_params
params.require(:vehicle_journey).permit( { footnote_ids: [] } , :journey_pattern_id, :number, :published_journey_name,
@@ -92,5 +142,4 @@ class VehicleJourneysController < ChouetteController
:stop_point_id,
:departure_time] } )
end
-
end
diff --git a/app/controllers/workbenches_controller.rb b/app/controllers/workbenches_controller.rb
index 3818ea866..cbbf1b058 100644
--- a/app/controllers/workbenches_controller.rb
+++ b/app/controllers/workbenches_controller.rb
@@ -3,13 +3,25 @@ class WorkbenchesController < BreadcrumbController
respond_to :html, :only => [:show]
def show
- scope = Workbench.find(params[:id])
- scope = params[:q] ? scope.all_referentials : scope.referentials.ready
- @q = scope.ransack(params[:q])
+ scope = Workbench.find(params[:id])
+ scope = params[:q] ? scope.all_referentials : scope.referentials.ready
+ periode = ransack_periode
+ scope = scope.in_periode(periode) if periode
+ @q = scope.ransack(params[:q])
+
@q.organisation_name_eq_any ||= current_organisation.name unless params[:q]
+ @wbench_refs = @q.result
+ # @wbench_refs = Workbench.find(params[:id]).referentials
+
+ case sort_column
+ when "lines"
+ @wbench_refs = @wbench_refs.joins(:metadatas).group("referentials.id").order("sum(array_length(referential_metadata.line_ids,1)) #{sort_direction}")
+ else
+ @wbench_refs = @wbench_refs.order("#{sort_column} #{sort_direction}")
+ end
+
+ @wbench_refs = @wbench_refs.paginate(page: params[:page], per_page: 30)
- @collection = @q.result(distinct: true)
- @wbench_refs = @collection.order(sort_column + ' ' + sort_direction).paginate(page: params[:page], per_page: 30)
show! do
build_breadcrumb :show
end
@@ -17,18 +29,36 @@ class WorkbenchesController < BreadcrumbController
def delete_referentials
referentials = resource.referentials.where(id: params[:referentials])
- if referentials.destroy_all
- flash[:notice] = t('notice.referentials.deleted')
+ referentials.each do |referential|
+ ReferentialDestroyWorker.perform_async(referential.id)
+ referential.update_attribute(:ready, false)
end
+ flash[:notice] = t('notice.referentials.deleted')
redirect_to resource
end
private
def sort_column
- Workbench.find(params[:id]).referentials.include?(params[:sort]) ? params[:sort] : 'name'
+ (Workbench.find(params[:id]).referentials.column_names + %w{lines}).include?(params[:sort]) ? params[:sort] : 'name'
end
+
def sort_direction
%w[asc desc].include?(params[:direction]) ? params[:direction] : 'asc'
end
+ def ransack_periode
+ return false unless params[:q] && params[:q]['validity_period']
+ periode = params[:q]['validity_period']
+ return false if periode['end_lteq(1i)'].empty? || periode['begin_gteq(1i)'].empty?
+
+ start_range = Date.civil(periode["begin_gteq(1i)"].to_i, periode["begin_gteq(2i)"].to_i, periode["begin_gteq(3i)"].to_i)
+ end_range = Date.civil(periode["end_lteq(1i)"].to_i, periode["end_lteq(2i)"].to_i, periode["end_lteq(3i)"].to_i)
+
+ if start_range > end_range
+ flash.now[:error] = t('referentials.errors.validity_period')
+ false
+ else
+ start_range..end_range
+ end
+ end
end