From c165b56f3cebe8e500434ca86c647955ba944b61 Mon Sep 17 00:00:00 2001 From: Xinhui Date: Fri, 12 May 2017 11:27:41 +0200 Subject: Fix sort line transport mode alphabetically Refs #3109 --- app/helpers/lines_helper.rb | 14 +++++++++++--- app/views/lines/_filters.html.slim | 4 ++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/helpers/lines_helper.rb b/app/helpers/lines_helper.rb index 80073af62..45e6cd939 100644 --- a/app/helpers/lines_helper.rb +++ b/app/helpers/lines_helper.rb @@ -5,6 +5,14 @@ module LinesHelper line.number end + def sorted_transport_submode + Chouette::Line.transport_submode.values.sort_by{|m| t("enumerize.line.transport_submode.#{m}") } + end + + def sorted_transport_mode + Chouette::Line.transport_mode.values.sort_by{|m| t("enumerize.line.transport_mode.#{m}") } + end + def colors?(line) line.text_color.present? || line.color.present? end @@ -12,15 +20,15 @@ module LinesHelper def text_color(line) line.text_color.blank? ? "black" : "##{line.text_color}" end - + def background_color(line) line.color.blank? ? "white" : "#"+line.color end - + def number_style(line) if colors?(line) number_style = "color: #{text_color(line)}; background-color: #{background_color(line)};" - else + else number_style = "" end diff --git a/app/views/lines/_filters.html.slim b/app/views/lines/_filters.html.slim index b52aa73e9..a0188f562 100644 --- a/app/views/lines/_filters.html.slim +++ b/app/views/lines/_filters.html.slim @@ -17,11 +17,11 @@ .form-group.togglable = f.label @lines.human_attribute_name(:transport_mode), required: false, class: 'control-label' - = f.input :transport_mode_eq_any, collection: Chouette::Line.transport_mode.values, as: :check_boxes, label: false, label_method: lambda{|l| ("" + t("enumerize.line.transport_mode.#{l}") + "").html_safe}, required: false, wrapper_html: { class: 'checkbox_list'} + = f.input :transport_mode_eq_any, collection: sorted_transport_mode, as: :check_boxes, label: false, label_method: lambda{|l| ("" + t("enumerize.line.transport_mode.#{l}") + "").html_safe}, required: false, wrapper_html: { class: 'checkbox_list'} .form-group.togglable = f.label @lines.human_attribute_name(:transport_submode), required: false, class: 'control-label' - = f.input :transport_submode_eq_any, collection: Chouette::Line.transport_submode.values, as: :check_boxes, label: false, label_method: lambda{|l| ("" + t("enumerize.line.transport_submode.#{l}") + "").html_safe}, required: false, wrapper_html: { class: 'checkbox_list'} + = f.input :transport_submode_eq_any, collection: sorted_transport_submode, as: :check_boxes, label: false, label_method: lambda{|l| ("" + t("enumerize.line.transport_submode.#{l}") + "").html_safe}, required: false, wrapper_html: { class: 'checkbox_list'} .actions = link_to 'Effacer', @workbench, class: 'btn btn-link' -- cgit v1.2.3 From 972500267f28f233d5670277c02d43fae5ad8e7b Mon Sep 17 00:00:00 2001 From: Xinhui Date: Fri, 12 May 2017 11:48:55 +0200 Subject: VehicleJourneys#index Temp disable filter by departure time Refs #3358 --- .../es6_browserified/vehicle_journeys/reducers/filters.js | 7 ++++--- app/controllers/vehicle_journeys_controller.rb | 3 +-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/filters.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/filters.js index cd065e362..80b62c6b4 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/filters.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/filters.js @@ -53,9 +53,10 @@ const filters = (state = {}, action) => { let params = { 'q[journey_pattern_id_eq]': state.query.journeyPattern.id || undefined, 'q[time_tables_id_eq]': state.query.timetable.id || undefined, - 'q[vehicle_journey_at_stops_departure_time_gteq]': (state.query.interval.start.hour + ':' + state.query.interval.start.minute), - 'q[vehicle_journey_at_stops_departure_time_lteq]': (state.query.interval.end.hour + ':' + state.query.interval.end.minute), - 'q[vehicle_journey_without_departure_time]' : state.query.withoutSchedule + // Fixme 3358 + // 'q[vehicle_journey_at_stops_departure_time_gteq]': (state.query.interval.start.hour + ':' + state.query.interval.start.minute), + // 'q[vehicle_journey_at_stops_departure_time_lteq]': (state.query.interval.end.hour + ':' + state.query.interval.end.minute), + // 'q[vehicle_journey_without_departure_time]' : state.query.withoutSchedule } let queryString = actions.encodeParams(params) return _.assign({}, state, {queryString: queryString}) diff --git a/app/controllers/vehicle_journeys_controller.rb b/app/controllers/vehicle_journeys_controller.rb index a44a03886..cca75af5b 100644 --- a/app/controllers/vehicle_journeys_controller.rb +++ b/app/controllers/vehicle_journeys_controller.rb @@ -78,7 +78,6 @@ class VehicleJourneysController < ChouetteController protected def collection scope = route.vehicle_journeys.with_stops - @q = scope.search filtered_ransack_params # Fixme 3358 @@ -94,7 +93,6 @@ class VehicleJourneysController < ChouetteController def ransack_periode_filter if params[:q] && params[:q][:vehicle_journey_at_stops_departure_time_gteq] - params[:q] = params[:q].reject{|k| params[:q][k] == 'undefined'} between = [:departure_time_gteq, :departure_time_lteq].map do |filter| "2000-01-01 #{params[:q]["vehicle_journey_at_stops_#{filter}"]}:00 UTC" end @@ -108,6 +106,7 @@ class VehicleJourneysController < ChouetteController def filtered_ransack_params if params[:q] + params[:q] = params[:q].reject{|k| params[:q][k] == 'undefined'} params[:q].except(:vehicle_journey_at_stops_departure_time_gteq, :vehicle_journey_at_stops_departure_time_lteq) end end -- cgit v1.2.3 From 012a2e5cdcf62d60325a951929850b4e08b24530 Mon Sep 17 00:00:00 2001 From: Thomas Haddad Date: Fri, 12 May 2017 11:59:52 +0200 Subject: Fix broken filters vj spec (queries were modified) Signed-off-by: Thomas Shawarma Haddad --- spec/javascripts/vehicle_journeys/reducers/filters_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/javascripts/vehicle_journeys/reducers/filters_spec.js b/spec/javascripts/vehicle_journeys/reducers/filters_spec.js index d5cdff430..1dea403cb 100644 --- a/spec/javascripts/vehicle_journeys/reducers/filters_spec.js +++ b/spec/javascripts/vehicle_journeys/reducers/filters_spec.js @@ -144,7 +144,7 @@ describe('filters reducer', () => { }) it('should handle CREATE_QUERY_STRING', () => { - let strResult = "q%5Bjourney_pattern_id_eq%5D=undefined&q%5Btime_tables_id_eq%5D=undefined&q%5Bvehicle_journey_at_stops_departure_time_gteq%5D=11%3A11&q%5Bvehicle_journey_at_stops_departure_time_lteq%5D=22%3A22&q%5Bvehicle_journey_without_departure_time%5D=true" + let strResult = 'q%5Bjourney_pattern_id_eq%5D=undefined&q%5Btime_tables_id_eq%5D=undefined' expect( statusReducer(state, { type: 'CREATE_QUERY_STRING', -- cgit v1.2.3 From 2ab2023f3a4922857b2343cbd67049b3ec8f8c9c Mon Sep 17 00:00:00 2001 From: Xinhui Date: Fri, 12 May 2017 14:38:18 +0200 Subject: Refactoring spec time_table disjoin Refs #3303 --- app/models/chouette/time_table.rb | 3 ++ spec/models/chouette/time_table_spec.rb | 67 +++++++++++++++++++-------------- 2 files changed, 42 insertions(+), 28 deletions(-) diff --git a/app/models/chouette/time_table.rb b/app/models/chouette/time_table.rb index 60684411a..41effe3eb 100644 --- a/app/models/chouette/time_table.rb +++ b/app/models/chouette/time_table.rb @@ -495,6 +495,7 @@ class Chouette::TimeTable < Chouette::TridentActiveRecord add_included_day d end end + self.convert_continuous_dates_to_periods end # if remained excluded dates are valid in other tt , remove it from result self.dates.each do |date| @@ -528,6 +529,7 @@ class Chouette::TimeTable < Chouette::TridentActiveRecord self.dates.to_a.sort! { |a,b| a.date <=> b.date} self.save! end + self.convert_continuous_dates_to_periods end @@ -546,6 +548,7 @@ class Chouette::TimeTable < Chouette::TridentActiveRecord self.periods.to_a.sort! { |a,b| a.period_start <=> b.period_start} self.save! end + self.convert_continuous_dates_to_periods end def duplicate diff --git a/spec/models/chouette/time_table_spec.rb b/spec/models/chouette/time_table_spec.rb index 1d0fa8585..505ca12be 100644 --- a/spec/models/chouette/time_table_spec.rb +++ b/spec/models/chouette/time_table_spec.rb @@ -1198,6 +1198,7 @@ end expect(subject.dates[2].date).to eq(Date.new(2014,7,20)) end end + context "timetable with dates against timetable with dates and periods all covered" do before do subject.periods.clear @@ -1218,12 +1219,15 @@ end subject.disjoin! another_tt subject.reload end + it "should have 0 result periods" do expect(subject.periods.size).to eq(0) end + it "should have no remained day_types" do subject.int_day_types == 0 end + it "should have 0 dates left" do expect(subject.dates.size).to eq(0) end @@ -1243,12 +1247,15 @@ end subject.disjoin! another_tt subject.reload end + it "should have 0 result periods" do expect(subject.periods.size).to eq(0) end + it "should have 0 day_types" do expect(subject.int_day_types).to eq(0) end + it "should have 6 dates " do expect(subject.dates.size).to eq(6) expect(subject.dates[0].date).to eq(Date.new(2014,8,11)) @@ -1274,24 +1281,26 @@ end subject.disjoin! another_tt subject.reload end - it "should have 0 result periods" do - expect(subject.periods.size).to eq(0) + + it "should have 3 result periods" do + expect(subject.periods.size).to eq(3) + [ + ['2014-08-11', '2014-08-13'], + ['2014-08-18', '2014-08-20'], + ['2014-08-25', '2014-08-27'] + ].each_with_index do |period, index| + expect(subject.periods[index].period_start.to_s).to eq(period[0]) + expect(subject.periods[index].period_end.to_s).to eq(period[1]) + end end + it "should have 0 day_types" do expect(subject.int_day_types).to eq(0) end - it "should have 10 dates " do - expect(subject.dates.size).to eq(10) - expect(subject.dates[0].date).to eq(Date.new(2014,8,6)) - expect(subject.dates[1].date).to eq(Date.new(2014,8,11)) - expect(subject.dates[2].date).to eq(Date.new(2014,8,12)) - expect(subject.dates[3].date).to eq(Date.new(2014,8,13)) - expect(subject.dates[4].date).to eq(Date.new(2014,8,18)) - expect(subject.dates[5].date).to eq(Date.new(2014,8,19)) - expect(subject.dates[6].date).to eq(Date.new(2014,8,20)) - expect(subject.dates[7].date).to eq(Date.new(2014,8,25)) - expect(subject.dates[8].date).to eq(Date.new(2014,8,26)) - expect(subject.dates[9].date).to eq(Date.new(2014,8,27)) + + it "should have 1 dates " do + expect(subject.dates.size).to eq(1) + expect(subject.dates.first.date.to_s).to eq('2014-08-06') end end @@ -1311,24 +1320,26 @@ end subject.disjoin! another_tt subject.reload end - it "should have same 0 result periods" do - expect(subject.periods.size).to eq(0) + + it "should have same 3 result periods" do + expect(subject.periods.size).to eq(3) + [ + ['2014-08-11', '2014-08-13'], + ['2014-08-18', '2014-08-20'], + ['2014-08-25', '2014-08-27'] + ].each_with_index do |period, index| + expect(subject.periods[index].period_start.to_s).to eq(period[0]) + expect(subject.periods[index].period_end.to_s).to eq(period[1]) + end end + it "should have 0 day_types" do expect(subject.int_day_types).to eq(0) end - it "should have only 10 dates " do - expect(subject.dates.size).to eq(10) - expect(subject.dates[0].date).to eq(Date.new(2014,8,6)) - expect(subject.dates[1].date).to eq(Date.new(2014,8,11)) - expect(subject.dates[2].date).to eq(Date.new(2014,8,12)) - expect(subject.dates[3].date).to eq(Date.new(2014,8,13)) - expect(subject.dates[4].date).to eq(Date.new(2014,8,18)) - expect(subject.dates[5].date).to eq(Date.new(2014,8,19)) - expect(subject.dates[6].date).to eq(Date.new(2014,8,20)) - expect(subject.dates[7].date).to eq(Date.new(2014,8,25)) - expect(subject.dates[8].date).to eq(Date.new(2014,8,26)) - expect(subject.dates[9].date).to eq(Date.new(2014,8,27)) + + it "should have only 1 dates " do + expect(subject.dates.size).to eq(1) + expect(subject.dates.first.date.to_s).to eq('2014-08-06') end end -- cgit v1.2.3 From ce44691bb446cc5e48accc58ad0613a511f10431 Mon Sep 17 00:00:00 2001 From: Xinhui Date: Fri, 12 May 2017 15:05:12 +0200 Subject: Refactoring spec time_tables intersect --- spec/models/time_table_combination_spec.rb | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/spec/models/time_table_combination_spec.rb b/spec/models/time_table_combination_spec.rb index 4c99a14fa..059fe9e81 100644 --- a/spec/models/time_table_combination_spec.rb +++ b/spec/models/time_table_combination_spec.rb @@ -54,6 +54,7 @@ describe TimeTableCombination, :type => :model do subject.combine source.reload end + it "should add combined to source" do expect(source.periods.size).to eq(1) expect(source.periods[0].period_start).to eq(Date.new(2014,8,1)) @@ -78,14 +79,17 @@ describe TimeTableCombination, :type => :model do subject.combine source.reload end + it "should intersect combined to source" do expect(source.int_day_types).to eq(0) - expect(source.periods.size).to eq(0) - expect(source.dates.size).to eq(17) - expect(source.dates[0].date).to eq(Date.new(2014,8,15)) - expect(source.dates[16].date).to eq(Date.new(2014,8,31)) + expect(source.periods.size).to eq(1) + expect(source.dates.size).to eq(0) + + expect(source.periods.first.period_start.to_s).to eq('2014-08-15') + expect(source.periods.first.period_end.to_s).to eq('2014-08-31') end end + context "when operation is disjoin" do before(:each) do source.periods.clear @@ -104,12 +108,14 @@ describe TimeTableCombination, :type => :model do subject.combine source.reload end + it "should disjoin combined to source" do expect(source.int_day_types).to eq(0) - expect(source.periods.size).to eq(0) - expect(source.dates.size).to eq(14) - expect(source.dates[0].date).to eq(Date.new(2014,8,1)) - expect(source.dates[13].date).to eq(Date.new(2014,8,14)) + expect(source.periods.size).to eq(1) + expect(source.dates.size).to eq(0) + + expect(source.periods.first.period_start.to_s).to eq('2014-08-01') + expect(source.periods.first.period_end.to_s).to eq('2014-08-14') end end end -- cgit v1.2.3 From 6097f648e611956d8ef0e7c6c358f962e6a6d1f7 Mon Sep 17 00:00:00 2001 From: Xinhui Date: Fri, 12 May 2017 15:33:32 +0200 Subject: Edit vehicle_journeys/show json format Refs #3356 --- app/models/chouette/vehicle_journey.rb | 4 +--- app/views/vehicle_journeys/show.rabl | 2 +- spec/models/chouette/vehicle_journey_spec.rb | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index 297e462f0..c25978ab1 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -51,9 +51,7 @@ module Chouette at_stops = self.vehicle_journey_at_stops.to_a.dup (route.stop_points.map(&:id) - at_stops.map(&:stop_point_id)).each do |id| # Set stop_point id for fake vjas with no departure time yep. - params = {} - params[:stop_point_id] = id if journey_pattern.stop_points.map(&:id).include?(id) - at_stops.insert(route.stop_points.map(&:id).index(id), Chouette::VehicleJourneyAtStop.new(params)) + at_stops.insert(route.stop_points.map(&:id).index(id), Chouette::VehicleJourneyAtStop.new(stop_point_id: id)) end at_stops end diff --git a/app/views/vehicle_journeys/show.rabl b/app/views/vehicle_journeys/show.rabl index 7db9b531d..1ef9bc6b5 100644 --- a/app/views/vehicle_journeys/show.rabl +++ b/app/views/vehicle_journeys/show.rabl @@ -31,7 +31,7 @@ end child(:vehicle_journey_at_stops_matrix, :object_root => false) do |vehicle_stops| node do |vehicle_stop| - node(:dummy) { !vehicle_stop.stop_point_id? } + node(:dummy) { !vehicle_stop.id? } node(:stop_area_object_id) do vehicle_stop.stop_point ? vehicle_stop.stop_point.stop_area.objectid : nil end diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb index b22183ab6..4bca8f488 100644 --- a/spec/models/chouette/vehicle_journey_spec.rb +++ b/spec/models/chouette/vehicle_journey_spec.rb @@ -197,7 +197,7 @@ describe Chouette::VehicleJourney, :type => :model do expect(vehicle_journey.reload.vehicle_journey_at_stops).to be_empty at_stops = vehicle_journey.reload.vehicle_journey_at_stops_matrix - at_stops.map{|stop| expect(stop.stop_point_id).to be_nil } + at_stops.map{|stop| expect(stop.id).to be_nil } expect(at_stops.count).to eq route.stop_points.count end -- cgit v1.2.3 From 806b4e72d5f084cffab136c0c81427e82162efd9 Mon Sep 17 00:00:00 2001 From: jpl Date: Fri, 12 May 2017 15:41:28 +0200 Subject: Refs #3356: clean VJ dummy management (headlined class) --- .../es6_browserified/vehicle_journeys/components/VehicleJourney.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js index 6f338f747..c39c81bb1 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js @@ -15,6 +15,7 @@ class VehicleJourney extends Component { bool = true this.previousCity = sp.stop_area_cityname } + return bool } @@ -73,7 +74,7 @@ class VehicleJourney extends Component { {this.props.value.vehicle_journey_at_stops.map((vj, i) =>
-
+
{this.props.filters.toggleArrivals &&
-- cgit v1.2.3 From 5ee1bd5730e65575f1a7ea179565231b15ecff39 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Fri, 12 May 2017 12:31:44 +0200 Subject: vehicle_journey_spec.rb: Fix whitespace --- spec/models/chouette/vehicle_journey_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb index 4bca8f488..7ddb82b70 100644 --- a/spec/models/chouette/vehicle_journey_spec.rb +++ b/spec/models/chouette/vehicle_journey_spec.rb @@ -284,7 +284,7 @@ describe Chouette::VehicleJourney, :type => :model do first stop that they make" do journey_missing_stop = create(:vehicle_journey) journey_early = create( - :vehicle_journey, + :vehicle_journey, route: journey_missing_stop.route, journey_pattern: journey_missing_stop.journey_pattern ) -- cgit v1.2.3 From 2b7c72e6ac639a8098a99295f5681f44a84859e1 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Fri, 12 May 2017 12:34:04 +0200 Subject: VehicleJourney.with_stops: Fix SQL style Match the style from the `joins` call above, quoting the table and column name, for consistency. --- app/models/chouette/vehicle_journey.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index c25978ab1..39dcafdeb 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -217,7 +217,7 @@ module Chouette AND "vehicle_journey_at_stops"."stop_point_id" = "journey_patterns"."departure_stop_point_id" ') - .order("vehicle_journey_at_stops.departure_time") + .order('"vehicle_journey_at_stops"."departure_time"') end end -- cgit v1.2.3 From ebb4281984bd16bf6ee16fad6d664b7793056d62 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Fri, 12 May 2017 12:47:36 +0200 Subject: VehicleJourney factory: Move departure & arrival time to transient attrs Instead of hard-coding the departure and arrival times of the associated `VehicleJourneyAtStop`s, put the times in transient attributes so that they can be changed for tests that need different stop times. Refs #3370 --- spec/factories/chouette_vehicle_journey.rb | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/spec/factories/chouette_vehicle_journey.rb b/spec/factories/chouette_vehicle_journey.rb index 9ba660800..452909f23 100644 --- a/spec/factories/chouette_vehicle_journey.rb +++ b/spec/factories/chouette_vehicle_journey.rb @@ -11,13 +11,18 @@ FactoryGirl.define do end factory :vehicle_journey do - after(:create) do |vehicle_journey| + transient do + stop_arrival_time '01:00:00' + stop_departure_time '03:00:00' + end + + after(:create) do |vehicle_journey, evaluator| vehicle_journey.journey_pattern.stop_points.each_with_index do |stop_point, index| vehicle_journey.vehicle_journey_at_stops << create(:vehicle_journey_at_stop, :vehicle_journey => vehicle_journey, :stop_point => stop_point, - :arrival_time => '2000-01-01 01:00:00 UTC', - :departure_time => '2000-01-01 03:00:00 UTC') + :arrival_time => "2000-01-01 #{evaluator.stop_arrival_time} UTC", + :departure_time => "2000-01-01 #{evaluator.stop_departure_time} UTC") end end -- cgit v1.2.3 From 0898f39c35f2f853e051269ae0945eafa475d483 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Fri, 12 May 2017 16:14:41 +0200 Subject: VehicleJourney: Add `.departure_time_between` filter A new class method that allows a vehicle journey collection to be filtered by a departure time range. This will eventually replace the `VehicleJourneysController#ransack_periode_filter` method, moving the filter out of Ransack and into this custom code. The reason we're doing this is because when trying to filter, Ransack inserts a duplicate `LEFT OUTER JOIN` on "vehicle_journey_at_stops" from `VehicleJourneysController#collection`. (`route.vehicle_journeys.with_stops` + the filter causes the duplicate column error.) For the moment, this method lives on its own. It needs more work to be integrated such that we can chain it with the `.with_stops` method. In particular, we still have the duplicate join problem. Refs #3370 --- app/models/chouette/vehicle_journey.rb | 21 ++++++++++++++++++ spec/models/chouette/vehicle_journey_spec.rb | 32 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index 39dcafdeb..5d7ddafd7 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -220,5 +220,26 @@ module Chouette .order('"vehicle_journey_at_stops"."departure_time"') end + # Example: + # .departure_time_between('08:00', '09:45') + def self.departure_time_between(start_time, end_time) + self + .select('DISTINCT "vehicle_journeys".*') + .joins(' + LEFT JOIN "vehicle_journey_at_stops" + ON "vehicle_journey_at_stops"."vehicle_journey_id" = + "vehicle_journeys"."id" + ') + .where( + %Q( + "vehicle_journey_at_stops"."departure_time" >= ? + AND "vehicle_journey_at_stops"."departure_time" < ? + OR "vehicle_journey_at_stops"."id" IS NULL + ), + "2000-01-01 #{start_time}:00 UTC", + "2000-01-01 #{end_time}:00 UTC" + ) + end + end end diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb index 7ddb82b70..231cbfaaf 100644 --- a/spec/models/chouette/vehicle_journey_spec.rb +++ b/spec/models/chouette/vehicle_journey_spec.rb @@ -310,6 +310,38 @@ describe Chouette::VehicleJourney, :type => :model do end end + describe ".departure_time_between" do + it "selects vehicle journeys whose departure times are between the + specified range" do + journey_early = create( + :vehicle_journey, + stop_departure_time: '02:00:00' + ) + + route = journey_early.route + journey_pattern = journey_early.journey_pattern + + journey_middle = create( + :vehicle_journey, + route: route, + journey_pattern: journey_pattern, + stop_departure_time: '03:00:00' + ) + journey_late = create( + :vehicle_journey, + route: route, + journey_pattern: journey_pattern, + stop_departure_time: '04:00:00' + ) + + expect(route + .vehicle_journeys + .departure_time_between('02:30', '03:30') + .to_a + ).to eq([journey_middle]) + end + end + subject { create(:vehicle_journey_odd) } describe "in_relation_to_a_journey_pattern methods" do let!(:route) { create(:route)} -- cgit v1.2.3 From 7bf94bc6e6ce6558252252e68419e89a23213573 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Fri, 12 May 2017 16:53:00 +0200 Subject: VehicleJourneysController#collection: Integrate .departure_time_between Add our custom departure time range filter to the query. We pass the times sent from the frontend into the query in order to get the correct vehicle journeys back. Copied the `if params[:q]` check from `#ransack_periode_filter`, but added an additional condition on the existence of `:vehicle_journey_at_stops_departure_time_lteq` instead of blatantly assuming it's there just because its `..._gteq` counterpart is. Adding the filter necessitated some modifications to the `VehicleJourneys.departure_time_between` method. We needed to remove the `SELECT DISTINCT` and join parts of the query, reducing it to a simple "where" condition. These removals were due to the nature of the combination of this method with `VehicleJourneys.with_stops`. The `.with_stops` method already does a join on `vehicle_journey_at_stops`, and there's already a `SELECT DISTINCT` applied to the controller's query. Made the decision to limit this method's use to this specific use-case, and thus expect DISTINCT and the necessary join to already be defined on the `ActiveRecord` query object. We modify the test to implement this requirement. Finally, rename `.departure_time_between` to `.where_departure_time_between` to further indicate that this is a simple `where` condition, without the required extras. Refs #3370 --- app/controllers/vehicle_journeys_controller.rb | 10 ++++++++++ app/models/chouette/vehicle_journey.rb | 19 +++++++++++-------- spec/models/chouette/vehicle_journey_spec.rb | 8 +++++++- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/app/controllers/vehicle_journeys_controller.rb b/app/controllers/vehicle_journeys_controller.rb index cca75af5b..c78613e99 100644 --- a/app/controllers/vehicle_journeys_controller.rb +++ b/app/controllers/vehicle_journeys_controller.rb @@ -78,6 +78,16 @@ class VehicleJourneysController < ChouetteController protected def collection scope = route.vehicle_journeys.with_stops + + if params[:q] && + params[:q][:vehicle_journey_at_stops_departure_time_gteq] && + params[:q][:vehicle_journey_at_stops_departure_time_lteq] + scope = scope.where_departure_time_between( + params[:q][:vehicle_journey_at_stops_departure_time_gteq], + params[:q][:vehicle_journey_at_stops_departure_time_lteq] + ) + end + @q = scope.search filtered_ransack_params # Fixme 3358 diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index 5d7ddafd7..0b4db3d9d 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -220,16 +220,19 @@ module Chouette .order('"vehicle_journey_at_stops"."departure_time"') end + # Requires a SELECT DISTINCT and a join with + # "vehicle_journey_at_stops". + # # Example: - # .departure_time_between('08:00', '09:45') - def self.departure_time_between(start_time, end_time) + # .select('DISTINCT "vehicle_journeys".*') + # .joins(' + # LEFT JOIN "vehicle_journey_at_stops" + # ON "vehicle_journey_at_stops"."vehicle_journey_id" = + # "vehicle_journeys"."id" + # ') + # .where_departure_time_between('08:00', '09:45') + def self.where_departure_time_between(start_time, end_time) self - .select('DISTINCT "vehicle_journeys".*') - .joins(' - LEFT JOIN "vehicle_journey_at_stops" - ON "vehicle_journey_at_stops"."vehicle_journey_id" = - "vehicle_journeys"."id" - ') .where( %Q( "vehicle_journey_at_stops"."departure_time" >= ? diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb index 231cbfaaf..caa4af203 100644 --- a/spec/models/chouette/vehicle_journey_spec.rb +++ b/spec/models/chouette/vehicle_journey_spec.rb @@ -336,7 +336,13 @@ describe Chouette::VehicleJourney, :type => :model do expect(route .vehicle_journeys - .departure_time_between('02:30', '03:30') + .select('DISTINCT "vehicle_journeys".*') + .joins(' + LEFT JOIN "vehicle_journey_at_stops" + ON "vehicle_journey_at_stops"."vehicle_journey_id" = + "vehicle_journeys"."id" + ') + .where_departure_time_between('02:30', '03:30') .to_a ).to eq([journey_middle]) end -- cgit v1.2.3 From b11e7d792b2c3743ca95f7a2d6d5c7bdc4a39105 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Fri, 12 May 2017 17:32:09 +0200 Subject: VehicleJourneysController: When filtering departure_time allow nil stops There's a `params[:q][:vehicle_journey_without_departure_time]` parameter coming in from the frontend that's supposed to allow it to decide whether or not to include vehicle journeys that have nil stops. Allow this parameter to function for the `VehicleJourney.where_departure_time_between` method by conditionally checking an input parameter to determine whether to add the "OR" condition onto the "WHERE" filter. Refs #3370 --- app/controllers/vehicle_journeys_controller.rb | 4 +++- app/models/chouette/vehicle_journey.rb | 12 ++++++++++-- spec/models/chouette/vehicle_journey_spec.rb | 17 +++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/app/controllers/vehicle_journeys_controller.rb b/app/controllers/vehicle_journeys_controller.rb index c78613e99..eebcbb922 100644 --- a/app/controllers/vehicle_journeys_controller.rb +++ b/app/controllers/vehicle_journeys_controller.rb @@ -84,7 +84,9 @@ class VehicleJourneysController < ChouetteController params[:q][:vehicle_journey_at_stops_departure_time_lteq] scope = scope.where_departure_time_between( params[:q][:vehicle_journey_at_stops_departure_time_gteq], - params[:q][:vehicle_journey_at_stops_departure_time_lteq] + params[:q][:vehicle_journey_at_stops_departure_time_lteq], + allow_empty: + params[:q][:vehicle_journey_without_departure_time] == 'true' ) end diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index 0b4db3d9d..852139625 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -231,13 +231,21 @@ module Chouette # "vehicle_journeys"."id" # ') # .where_departure_time_between('08:00', '09:45') - def self.where_departure_time_between(start_time, end_time) + def self.where_departure_time_between( + start_time, + end_time, + allow_empty: false + ) self .where( %Q( "vehicle_journey_at_stops"."departure_time" >= ? AND "vehicle_journey_at_stops"."departure_time" < ? - OR "vehicle_journey_at_stops"."id" IS NULL + #{ + if allow_empty + 'OR "vehicle_journey_at_stops"."id" IS NULL' + end + } ), "2000-01-01 #{start_time}:00 UTC", "2000-01-01 #{end_time}:00 UTC" diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb index caa4af203..7f2305134 100644 --- a/spec/models/chouette/vehicle_journey_spec.rb +++ b/spec/models/chouette/vehicle_journey_spec.rb @@ -346,6 +346,23 @@ describe Chouette::VehicleJourney, :type => :model do .to_a ).to eq([journey_middle]) end + + it "can include vehicle journeys that have nil stops" do + journey = create(:vehicle_journey_empty) + route = journey.route + + expect(route + .vehicle_journeys + .select('DISTINCT "vehicle_journeys".*') + .joins(' + LEFT JOIN "vehicle_journey_at_stops" + ON "vehicle_journey_at_stops"."vehicle_journey_id" = + "vehicle_journeys"."id" + ') + .where_departure_time_between('02:30', '03:30', allow_empty: true) + .to_a + ).to eq([journey]) + end end subject { create(:vehicle_journey_odd) } -- cgit v1.2.3 From 36ebc58343bc82c08672f019b1102c3f49e244fb Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Fri, 12 May 2017 17:41:03 +0200 Subject: VehicleJourneysController#collection: Restore departure time filter Handle temporary fixes from 972500267f28f233d5670277c02d43fae5ad8e7b and 1f6fb9c73206f3984d2f942d5d16fb9c094b2164. Restore the JavaScript because that should function the same way now. Remove the Ransack call as we've moved this departure time filter outside of Ransack and into our own custom method in order to eliminate a duplicated "JOIN" call on "vehicle_journey_at_stops" collision between the `.with_stops` query and Ransack. The new filter lives in `VehicleJourney.where_departure_time_between`. Refs #3370 --- .../es6_browserified/vehicle_journeys/reducers/filters.js | 7 +++---- app/controllers/vehicle_journeys_controller.rb | 4 ---- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/filters.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/filters.js index 80b62c6b4..cd065e362 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/filters.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/filters.js @@ -53,10 +53,9 @@ const filters = (state = {}, action) => { let params = { 'q[journey_pattern_id_eq]': state.query.journeyPattern.id || undefined, 'q[time_tables_id_eq]': state.query.timetable.id || undefined, - // Fixme 3358 - // 'q[vehicle_journey_at_stops_departure_time_gteq]': (state.query.interval.start.hour + ':' + state.query.interval.start.minute), - // 'q[vehicle_journey_at_stops_departure_time_lteq]': (state.query.interval.end.hour + ':' + state.query.interval.end.minute), - // 'q[vehicle_journey_without_departure_time]' : state.query.withoutSchedule + 'q[vehicle_journey_at_stops_departure_time_gteq]': (state.query.interval.start.hour + ':' + state.query.interval.start.minute), + 'q[vehicle_journey_at_stops_departure_time_lteq]': (state.query.interval.end.hour + ':' + state.query.interval.end.minute), + 'q[vehicle_journey_without_departure_time]' : state.query.withoutSchedule } let queryString = actions.encodeParams(params) return _.assign({}, state, {queryString: queryString}) diff --git a/app/controllers/vehicle_journeys_controller.rb b/app/controllers/vehicle_journeys_controller.rb index eebcbb922..10f0dc324 100644 --- a/app/controllers/vehicle_journeys_controller.rb +++ b/app/controllers/vehicle_journeys_controller.rb @@ -92,10 +92,6 @@ class VehicleJourneysController < ChouetteController @q = scope.search filtered_ransack_params - # Fixme 3358 - # grouping = ransack_periode_filter - # @q.build_grouping(grouping) if grouping - @ppage = 20 @vehicle_journeys = @q.result.paginate(:page => params[:page], :per_page => @ppage) @footnotes = route.line.footnotes.to_json -- cgit v1.2.3 From 83f143174002ea8d2758d3a3f79fa1b16be9e9eb Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Fri, 12 May 2017 17:45:14 +0200 Subject: VehicleJourneysController: Remove `#ransack_periode_filter` This method is superseded by `VehicleJourney.where_departure_time_between`. Refs #3370 --- app/controllers/vehicle_journeys_controller.rb | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/app/controllers/vehicle_journeys_controller.rb b/app/controllers/vehicle_journeys_controller.rb index 10f0dc324..bf27551fb 100644 --- a/app/controllers/vehicle_journeys_controller.rb +++ b/app/controllers/vehicle_journeys_controller.rb @@ -99,19 +99,6 @@ class VehicleJourneysController < ChouetteController @vehicle_journeys end - def ransack_periode_filter - if params[:q] && params[:q][:vehicle_journey_at_stops_departure_time_gteq] - between = [:departure_time_gteq, :departure_time_lteq].map do |filter| - "2000-01-01 #{params[:q]["vehicle_journey_at_stops_#{filter}"]}:00 UTC" - end - { - :m => 'or', - :vehicle_journey_at_stops_departure_time_between => between.join(' to '), - :vehicle_journey_at_stops_id_null => params[:q][:vehicle_journey_without_departure_time] - } - end - end - def filtered_ransack_params if params[:q] params[:q] = params[:q].reject{|k| params[:q][k] == 'undefined'} -- cgit v1.2.3 From 19d4f6e53405aa391a01e6340979e3d0d815542a Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Fri, 12 May 2017 17:47:04 +0200 Subject: VehicleJourneysController: Add a comment on departure time filter This section is a little dense. Comment what it is to make it more obvious. Refs #3370 --- app/controllers/vehicle_journeys_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/vehicle_journeys_controller.rb b/app/controllers/vehicle_journeys_controller.rb index bf27551fb..d8cbef478 100644 --- a/app/controllers/vehicle_journeys_controller.rb +++ b/app/controllers/vehicle_journeys_controller.rb @@ -79,6 +79,7 @@ class VehicleJourneysController < ChouetteController def collection scope = route.vehicle_journeys.with_stops + # Apply departure time range filter if params[:q] && params[:q][:vehicle_journey_at_stops_departure_time_gteq] && params[:q][:vehicle_journey_at_stops_departure_time_lteq] -- cgit v1.2.3 From 8cfb32a40ae3f2c48c6a7884a1a8251ee4a48254 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Fri, 12 May 2017 18:06:51 +0200 Subject: Revert "Fix broken filters vj spec (queries were modified)" This reverts commit 012a2e5cdcf62d60325a951929850b4e08b24530. Now that we've fixed the departure time filter on VehicleJourneysController#index (7bf94bc6e6ce6558252252e68419e89a23213573) and re-enabled the supporting JavaScript (36ebc58343bc82c08672f019b1102c3f49e244fb), this temporary test fix can be reverted. --- spec/javascripts/vehicle_journeys/reducers/filters_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/javascripts/vehicle_journeys/reducers/filters_spec.js b/spec/javascripts/vehicle_journeys/reducers/filters_spec.js index 1dea403cb..d5cdff430 100644 --- a/spec/javascripts/vehicle_journeys/reducers/filters_spec.js +++ b/spec/javascripts/vehicle_journeys/reducers/filters_spec.js @@ -144,7 +144,7 @@ describe('filters reducer', () => { }) it('should handle CREATE_QUERY_STRING', () => { - let strResult = 'q%5Bjourney_pattern_id_eq%5D=undefined&q%5Btime_tables_id_eq%5D=undefined' + let strResult = "q%5Bjourney_pattern_id_eq%5D=undefined&q%5Btime_tables_id_eq%5D=undefined&q%5Bvehicle_journey_at_stops_departure_time_gteq%5D=11%3A11&q%5Bvehicle_journey_at_stops_departure_time_lteq%5D=22%3A22&q%5Bvehicle_journey_without_departure_time%5D=true" expect( statusReducer(state, { type: 'CREATE_QUERY_STRING', -- cgit v1.2.3 From 2c32ac2a3372dfaee531734d3cf94f6b522b7c1b Mon Sep 17 00:00:00 2001 From: Xinhui Date: Mon, 15 May 2017 11:32:56 +0200 Subject: Calendar #convert_to_time_tablet Refs #3372 --- app/models/calendar.rb | 11 +++++++++++ spec/models/calendar_spec.rb | 16 ++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/app/models/calendar.rb b/app/models/calendar.rb index 91a17e853..39e0d6d49 100644 --- a/app/models/calendar.rb +++ b/app/models/calendar.rb @@ -19,6 +19,17 @@ class Calendar < ActiveRecord::Base [:contains_date] end + def convert_to_time_table + Chouette::TimeTable.new.tap do |tt| + self.dates.each do |d| + tt.dates << Chouette::TimeTableDate.new(date: d, in_out: true) + end + self.date_ranges.each do |p| + tt.periods << Chouette::TimeTablePeriod.new(period_start: p.begin, period_end: p.end) + end + end + end + class Period include ActiveAttr::Model diff --git a/spec/models/calendar_spec.rb b/spec/models/calendar_spec.rb index 36981961f..33d9676cd 100644 --- a/spec/models/calendar_spec.rb +++ b/spec/models/calendar_spec.rb @@ -9,6 +9,18 @@ RSpec.describe Calendar, :type => :model do it { is_expected.to validate_presence_of(:short_name) } it { is_expected.to validate_uniqueness_of(:short_name) } + describe '#to_time_table' do + let(:calendar) { create(:calendar, date_ranges: [Date.today..(Date.today + 1.month)]) } + + it 'should convert calendar to an instance of Chouette::TimeTable' do + time_table = calendar.convert_to_time_table + expect(time_table).to be_an_instance_of(Chouette::TimeTable) + expect(time_table.periods[0].period_start).to eq(calendar.date_ranges[0].begin) + expect(time_table.periods[0].period_end).to eq(calendar.date_ranges[0].end) + expect(time_table.dates.map(&:date)).to match_array(calendar.dates) + end + end + describe 'validations' do it 'validates that dates and date_ranges do not overlap' do calendar = build(:calendar, dates: [Date.today], date_ranges: [Date.today..Date.tomorrow]) @@ -69,7 +81,6 @@ RSpec.describe Calendar, :type => :model do end describe 'intersect?' do - it 'should detect date in common with other date_ranges' do november = period(begin: '2016-11-01', end: '2016-11-30') mid_november_mid_december = period(begin: '2016-11-15', end: '2016-12-15') @@ -111,7 +122,6 @@ RSpec.describe Calendar, :type => :model do end describe 'DateValue' do - subject { date_value } def date_value(attributes = {}) @@ -141,8 +151,6 @@ RSpec.describe Calendar, :type => :model do end it { is_expected.to validate_presence_of(:value) } - end - end -- cgit v1.2.3