diff options
| author | Zog | 2018-01-29 11:54:47 +0100 |
|---|---|---|
| committer | cedricnjanga | 2018-02-06 11:04:59 -0800 |
| commit | 5e1b7a06a9958580fc18a0a4e33ff66ea6adcdf9 (patch) | |
| tree | bc05cba6cd5b2b594b5991f7b1d5b58ebdbddff1 | |
| parent | bde34143629e19273493fba8ba9e50bcd5f0c547 (diff) | |
| download | chouette-core-5e1b7a06a9958580fc18a0a4e33ff66ea6adcdf9.tar.bz2 | |
Refs #5754; Add a filter on purchase_windows on ReferentialVJs#index
| -rw-r--r-- | app/controllers/concerns/ransack_date_filter.rb | 5 | ||||
| -rw-r--r-- | app/controllers/referential_vehicle_journeys_controller.rb | 5 | ||||
| -rw-r--r-- | app/models/chouette/purchase_window.rb | 1 | ||||
| -rw-r--r-- | app/models/chouette/vehicle_journey.rb | 7 | ||||
| -rw-r--r-- | app/views/referential_vehicle_journeys/_filters.html.slim | 8 | ||||
| -rw-r--r-- | config/locales/vehicle_journeys.en.yml | 3 | ||||
| -rw-r--r-- | config/locales/vehicle_journeys.fr.yml | 3 | ||||
| -rw-r--r-- | spec/models/chouette/vehicle_journey_spec.rb | 41 |
8 files changed, 70 insertions, 3 deletions
diff --git a/app/controllers/concerns/ransack_date_filter.rb b/app/controllers/concerns/ransack_date_filter.rb index 0fbde91d3..99889294c 100644 --- a/app/controllers/concerns/ransack_date_filter.rb +++ b/app/controllers/concerns/ransack_date_filter.rb @@ -29,13 +29,14 @@ module RansackDateFilter def ransack_period_range **options return options[:scope] unless !!@begin_range && !!@end_range + scope = options[:scope] if @begin_range > @end_range flash.now[:error] = options[:error_message] else - scope = options[:scope].send options[:query], @begin_range..@end_range + scope = scope.send options[:query], @begin_range..@end_range end scope end end -end
\ No newline at end of file +end diff --git a/app/controllers/referential_vehicle_journeys_controller.rb b/app/controllers/referential_vehicle_journeys_controller.rb index c3fcde0b1..385405b84 100644 --- a/app/controllers/referential_vehicle_journeys_controller.rb +++ b/app/controllers/referential_vehicle_journeys_controller.rb @@ -3,6 +3,10 @@ # class ReferentialVehicleJourneysController < ChouetteController include ReferentialSupport + include RansackDateFilter + + before_action only: [:index] { set_date_time_params("purchase_window", Date) } + defaults :resource_class => Chouette::VehicleJourney, collection_name: :vehicle_journeys requires_feature :referential_vehicle_journeys @@ -12,6 +16,7 @@ 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 = @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/purchase_window.rb b/app/models/chouette/purchase_window.rb index 22bcc1de1..334493015 100644 --- a/app/models/chouette/purchase_window.rb +++ b/app/models/chouette/purchase_window.rb @@ -18,6 +18,7 @@ module Chouette validates_presence_of :name, :referential scope :contains_date, ->(date) { where('date ? <@ any (date_ranges)', date) } + scope :overlap_dates, ->(date_range) { where('daterange(?, ?) && any (date_ranges)', date_range.first, date_range.last + 1.day) } def self.ransackable_scopes(auth_object = nil) [:contains_date] diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index d94b69271..a252d4519 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -52,8 +52,15 @@ module Chouette end } + scope :in_purchase_window, ->(range){ + purchase_windows = Chouette::PurchaseWindow.overlap_dates(range) + sql = purchase_windows.joins(:vehicle_journeys).select('vehicle_journeys.id').uniq.to_sql + where("id IN (#{sql})") + } + # We need this for the ransack object in the filters ransacker :stop_area_ids + ransacker :purchase_window_date_gt # TODO: Remove this validator # We've eliminated this validation because it prevented vehicle journeys diff --git a/app/views/referential_vehicle_journeys/_filters.html.slim b/app/views/referential_vehicle_journeys/_filters.html.slim index 1301d3dab..af8b2de3a 100644 --- a/app/views/referential_vehicle_journeys/_filters.html.slim +++ b/app/views/referential_vehicle_journeys/_filters.html.slim @@ -21,10 +21,16 @@ = f.input :published_journey_name_gteq, label: false, wrapper_html: { class: 'w45'} .form-group.w10.to= I18n.t('vehicle_journeys.form.to') = f.input :published_journey_name_lteq, label: false, wrapper_html: { class: 'w45'} - .form-group.togglable = f.label Chouette::StopArea.model_name.human.pluralize, required: false, class: 'control-label' = f.input :stop_area_ids, collection: @all_stop_areas.select(:id, :name).order(name: :asc), checked: params[:q] && params[:q][:stop_area_ids], as: :check_boxes, label: false, label_method: lambda{|l| ("<span>" + l.name + "</span>").html_safe}, required: false, wrapper_html: { class: 'checkbox_list'}, multiple: true + .form-group.togglable + = 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 + .actions = link_to 'Effacer', referential_vehicle_journeys_path(@referential), class: 'btn btn-link' diff --git a/config/locales/vehicle_journeys.en.yml b/config/locales/vehicle_journeys.en.yml index 1c1f6c6bd..08a9334cc 100644 --- a/config/locales/vehicle_journeys.en.yml +++ b/config/locales/vehicle_journeys.en.yml @@ -67,6 +67,8 @@ en: time_range_filter: "Filter" sidebar: timeless: "Timeless vehicle journeys" + errors: + purchase_window: Invalid purchase window activerecord: models: vehicle_journey: @@ -108,6 +110,7 @@ en: footnote_ids: "Footnotes" departure_time: "Departure" arrival_time: "Arrival" + purchase_window: "Purchase availability" errors: models: vehicle_journey: diff --git a/config/locales/vehicle_journeys.fr.yml b/config/locales/vehicle_journeys.fr.yml index 5749f8f10..8d85d877a 100644 --- a/config/locales/vehicle_journeys.fr.yml +++ b/config/locales/vehicle_journeys.fr.yml @@ -67,6 +67,8 @@ fr: time_range_filter: "Filtrer" sidebar: timeless: "Courses sans horaire" + errors: + purchase_window: Calendrier commercial invalide activerecord: models: vehicle_journey: @@ -108,6 +110,7 @@ fr: footnote_ids: "Notes de bas de page" departure_time: "Départ" arrival_time: "Arrivée" + purchase_window: "Disponibilité commerciale" errors: models: vehicle_journey: diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb index 21bbc1ba8..06f392d65 100644 --- a/spec/models/chouette/vehicle_journey_spec.rb +++ b/spec/models/chouette/vehicle_journey_spec.rb @@ -24,6 +24,47 @@ describe Chouette::VehicleJourney, :type => :model do it_behaves_like 'checksum support', :vehicle_journey end + describe '#in_purchase_window' do + let(:start_date){2.month.ago.to_date} + let(:end_date){1.month.ago.to_date} + + subject{Chouette::VehicleJourney.in_purchase_window start_date..end_date} + + let!(:without_purchase_window){ create :vehicle_journey } + let!(:without_matching_purchase_window){ + pw = create :purchase_window, referential: Referential.first, date_ranges: [(end_date+1.day..end_date+2.days)] + pw2 = create :purchase_window, referential: Referential.first, date_ranges: [(end_date+10.day..end_date+20.days)] + create :vehicle_journey, purchase_windows: [pw, pw2] + } + let!(:included_purchase_window){ + pw = create :purchase_window, referential: Referential.first, date_ranges: [(start_date..end_date)] + pw2 = create :purchase_window, referential: Referential.first + create :vehicle_journey, purchase_windows: [pw, pw2] + } + let!(:overlapping_purchase_window){ + pw = create :purchase_window, referential: Referential.first, date_ranges: [(end_date..end_date+1.day)] + pw2 = create :purchase_window, referential: Referential.first + create :vehicle_journey, purchase_windows: [pw, pw2] + } + + + it "should not include VJ with no purchase window" do + expect(subject).to_not include without_purchase_window + end + + it "should not include VJ with no matching purchase window" do + expect(subject).to_not include without_matching_purchase_window + end + + it "should include VJ with included purchase window" do + expect(subject).to include included_purchase_window + end + + it "should include VJ with overlapping_purchase_window purchase window" do + expect(subject).to include overlapping_purchase_window + end + end + describe "vjas_departure_time_must_be_before_next_stop_arrival_time", skip: "Validation currently commented out because it interferes with day offsets" do |
