diff options
| author | jpl | 2017-03-20 16:46:20 +0100 |
|---|---|---|
| committer | jpl | 2017-03-20 16:46:20 +0100 |
| commit | cfc35aca0f1383069e1f2cc5ed1026d085a1fc1d (patch) | |
| tree | d194a26f6ea698a32b7f45b58abc59b10e0ae83c /app/controllers | |
| parent | 423b5636c4a8ee1eae530e690e8fb1d3b3aa1c05 (diff) | |
| parent | 516971ceec5919e93105e3b01492090ba2a106cf (diff) | |
| download | chouette-core-cfc35aca0f1383069e1f2cc5ed1026d085a1fc1d.tar.bz2 | |
Merge branch 'master' into staging
Diffstat (limited to 'app/controllers')
| -rw-r--r-- | app/controllers/autocomplete_stop_areas_controller.rb | 6 | ||||
| -rw-r--r-- | app/controllers/autocomplete_time_tables_controller.rb | 25 | ||||
| -rw-r--r-- | app/controllers/devise/cas_sessions_controller.rb | 127 | ||||
| -rw-r--r-- | app/controllers/imports_controller.rb | 8 | ||||
| -rw-r--r-- | app/controllers/journey_patterns_collections_controller.rb | 2 | ||||
| -rw-r--r-- | app/controllers/line_footnotes_controller.rb | 4 | ||||
| -rw-r--r-- | app/controllers/referential_lines_controller.rb | 18 | ||||
| -rw-r--r-- | app/controllers/referentials_controller.rb | 6 | ||||
| -rw-r--r-- | app/controllers/vehicle_journeys_collections_controller.rb | 19 | ||||
| -rw-r--r-- | app/controllers/vehicle_journeys_controller.rb | 75 | ||||
| -rw-r--r-- | app/controllers/workbenches_controller.rb | 46 |
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 |
