diff options
| author | Zog | 2018-01-29 13:17:14 +0100 |
|---|---|---|
| committer | cedricnjanga | 2018-02-06 11:04:59 -0800 |
| commit | 9f583abe27b77e4a5af5e5428329a91c929f3254 (patch) | |
| tree | 78da8813cf7873cda1594f9fe7aac228e47d3e73 /app | |
| parent | 5e1b7a06a9958580fc18a0a4e33ff66ea6adcdf9 (diff) | |
| download | chouette-core-9f583abe27b77e4a5af5e5428329a91c929f3254.tar.bz2 | |
Refs #5754; Add a filter on calendars for ReferentialVJs#index
Diffstat (limited to 'app')
| -rw-r--r-- | app/controllers/concerns/ransack_date_filter.rb | 25 | ||||
| -rw-r--r-- | app/controllers/referential_vehicle_journeys_controller.rb | 6 | ||||
| -rw-r--r-- | app/models/chouette/time_table.rb | 1 | ||||
| -rw-r--r-- | app/models/chouette/vehicle_journey.rb | 14 | ||||
| -rw-r--r-- | app/views/referential_vehicle_journeys/_filters.html.slim | 10 |
5 files changed, 43 insertions, 13 deletions
diff --git a/app/controllers/concerns/ransack_date_filter.rb b/app/controllers/concerns/ransack_date_filter.rb index 99889294c..055c01130 100644 --- a/app/controllers/concerns/ransack_date_filter.rb +++ b/app/controllers/concerns/ransack_date_filter.rb @@ -3,7 +3,15 @@ module RansackDateFilter included do - def set_date_time_params(param_name, klass) + def begin_range_var prefix + "@#{[prefix, "begin_range"].compact.join('_')}" + end + + def end_range_var prefix + "@#{[prefix, "end_range"].compact.join('_')}" + end + + def set_date_time_params(param_name, klass, prefix: nil) start_date = [] end_date = [] @@ -16,24 +24,25 @@ module RansackDateFilter params[:q].delete([param_name]) if klass == DateTime - @begin_range = klass.new(*start_date,0,0,0) rescue nil - @end_range = klass.new(*end_date,23,59,59) rescue nil + instance_variable_set begin_range_var(prefix), klass.new(*start_date,0,0,0) rescue nil + instance_variable_set end_range_var(prefix), klass.new(*end_date,23,59,59) rescue nil else - @begin_range = klass.new(*start_date) rescue nil - @end_range = klass.new(*end_date) rescue nil + instance_variable_set begin_range_var(prefix), klass.new(*start_date) rescue nil + instance_variable_set end_range_var(prefix), klass.new(*end_date) rescue nil end end end # Fake ransack filter def ransack_period_range **options - return options[:scope] unless !!@begin_range && !!@end_range + prefix = options[:prefix] + return options[:scope] unless !!instance_variable_get(begin_range_var(prefix)) && !!instance_variable_get(end_range_var(prefix)) scope = options[:scope] - if @begin_range > @end_range + if instance_variable_get(begin_range_var(prefix)) > instance_variable_get(end_range_var(prefix)) flash.now[:error] = options[:error_message] else - scope = scope.send options[:query], @begin_range..@end_range + scope = scope.send options[:query], instance_variable_get(begin_range_var(prefix))..instance_variable_get(end_range_var(prefix)) end scope end diff --git a/app/controllers/referential_vehicle_journeys_controller.rb b/app/controllers/referential_vehicle_journeys_controller.rb index 385405b84..a199157dd 100644 --- a/app/controllers/referential_vehicle_journeys_controller.rb +++ b/app/controllers/referential_vehicle_journeys_controller.rb @@ -5,7 +5,8 @@ class ReferentialVehicleJourneysController < ChouetteController include ReferentialSupport include RansackDateFilter - before_action only: [:index] { set_date_time_params("purchase_window", Date) } + before_action only: [:index] { set_date_time_params("purchase_window", Date, prefix: :purchase_window) } + before_action only: [:index] { set_date_time_params("time_table", Date, prefix: :time_table) } defaults :resource_class => Chouette::VehicleJourney, collection_name: :vehicle_journeys @@ -16,7 +17,8 @@ class ReferentialVehicleJourneysController < ChouetteController def collection @q ||= end_of_association_chain @q = @q.with_stop_area_ids(params[:q][:stop_area_ids]) if params[:q] && params[:q][:stop_area_ids] - @q = ransack_period_range(scope: @q, error_message: t('vehicle_journeys.errors.purchase_window'), query: :in_purchase_window) + @q = ransack_period_range(scope: @q, error_message: t('vehicle_journeys.errors.purchase_window'), query: :in_purchase_window, prefix: :purchase_window) + @q = ransack_period_range(scope: @q, error_message: t('vehicle_journeys.errors.time_table'), query: :with_matching_timetable, prefix: :time_table) @q = @q.ransack(params[:q]) @vehicle_journeys ||= @q.result.order(:published_journey_name).includes(:vehicle_journey_at_stops).paginate page: params[:page], per_page: params[:per_page] || 10 @all_companies = Chouette::Company.where("id IN (#{@referential.vehicle_journeys.select(:company_id).to_sql})").distinct diff --git a/app/models/chouette/time_table.rb b/app/models/chouette/time_table.rb index db97dd2fa..07bf35444 100644 --- a/app/models/chouette/time_table.rb +++ b/app/models/chouette/time_table.rb @@ -311,7 +311,6 @@ module Chouette bounding_max = periods_max_date if periods_max_date && (bounding_max.nil? || (bounding_max < periods_max_date)) end - [bounding_min, bounding_max].compact end diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index a252d4519..1756a7098 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -62,6 +62,20 @@ module Chouette ransacker :stop_area_ids ransacker :purchase_window_date_gt + # returns VehicleJourneys with at least 1 day in their time_tables + # included in the given range + def self.with_matching_timetable date_range + out = [] + time_tables = Chouette::TimeTable.where(id: self.joins("INNER JOIN time_tables_vehicle_journeys ON vehicle_journeys.id = time_tables_vehicle_journeys.vehicle_journey_id").pluck('time_tables_vehicle_journeys.time_table_id')).overlapping(date_range) + time_tables = time_tables.select do |time_table| + range = date_range + range = date_range & (time_table.start_date-1.day..time_table.end_date+1.day) || [] if time_table.start_date.present? && time_table.end_date.present? + range.any?{|d| time_table.include_day?(d) } + end + out += time_tables.map{|t| t.vehicle_journey_ids}.flatten + where(id: out) + end + # TODO: Remove this validator # We've eliminated this validation because it prevented vehicle journeys # from being saved with at-stops having a day offset greater than 0, diff --git a/app/views/referential_vehicle_journeys/_filters.html.slim b/app/views/referential_vehicle_journeys/_filters.html.slim index af8b2de3a..bfb5b77dd 100644 --- a/app/views/referential_vehicle_journeys/_filters.html.slim +++ b/app/views/referential_vehicle_journeys/_filters.html.slim @@ -28,8 +28,14 @@ = f.label Chouette::VehicleJourney.human_attribute_name(:purchase_window), class: 'control-label' .filter_menu = f.simple_fields_for :purchase_window do |p| - = p.input :start_date, as: :date, label: t('simple_form.from'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @begin_range, include_blank: @begin_range ? false : true - = p.input :end_date, as: :date, label: t('simple_form.to'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @end_range, include_blank: @end_range ? false : true + = p.input :start_date, as: :date, label: t('simple_form.from'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @purchase_window_begin_range, include_blank: @purchase_window_begin_range ? false : true + = p.input :end_date, as: :date, label: t('simple_form.to'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @purchase_window_end_range, include_blank: @purchase_window_end_range ? false : true + .form-group.togglable + = f.label Chouette::TimeTable.model_name.human, class: 'control-label' + .filter_menu + = f.simple_fields_for :time_table do |p| + = p.input :start_date, as: :date, label: t('simple_form.from'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @time_table_begin_range, include_blank: @time_table_begin_range ? false : true + = p.input :end_date, as: :date, label: t('simple_form.to'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @time_table_end_range, include_blank: @time_table_end_range ? false : true .actions |
