diff options
| author | Robert | 2017-05-15 16:37:30 +0200 |
|---|---|---|
| committer | Robert | 2017-05-15 16:37:30 +0200 |
| commit | 73a8df07f7e05448d1dd9969539601b128840fb2 (patch) | |
| tree | bfefbeed28175b68e96bfd28087810d0bc55ae87 | |
| parent | a0eb6ea4e8f3ae56a691820a50958a4acf92bcb5 (diff) | |
| parent | 2c32ac2a3372dfaee531734d3cf94f6b522b7c1b (diff) | |
| download | chouette-core-73a8df07f7e05448d1dd9969539601b128840fb2.tar.bz2 | |
Merge branch 'master' of github.com:af83/stif-boiv
| -rw-r--r-- | app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js | 3 | ||||
| -rw-r--r-- | app/controllers/vehicle_journeys_controller.rb | 31 | ||||
| -rw-r--r-- | app/helpers/lines_helper.rb | 14 | ||||
| -rw-r--r-- | app/models/calendar.rb | 11 | ||||
| -rw-r--r-- | app/models/chouette/time_table.rb | 3 | ||||
| -rw-r--r-- | app/models/chouette/vehicle_journey.rb | 38 | ||||
| -rw-r--r-- | app/views/lines/_filters.html.slim | 4 | ||||
| -rw-r--r-- | app/views/vehicle_journeys/show.rabl | 2 | ||||
| -rw-r--r-- | spec/factories/chouette_vehicle_journey.rb | 11 | ||||
| -rw-r--r-- | spec/models/calendar_spec.rb | 16 | ||||
| -rw-r--r-- | spec/models/chouette/time_table_spec.rb | 67 | ||||
| -rw-r--r-- | spec/models/chouette/vehicle_journey_spec.rb | 59 | ||||
| -rw-r--r-- | spec/models/time_table_combination_spec.rb | 22 |
13 files changed, 207 insertions, 74 deletions
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 { </div> {this.props.value.vehicle_journey_at_stops.map((vj, i) => <div key={i} className='td text-center'> - <div className={'cellwrap' + (vj.dummy ? ' headlined' : '') + (this.cityNameChecker(vj) ? ' headlined' : '')}> + <div className={'cellwrap' + (this.cityNameChecker(vj) ? ' headlined' : '')}> {this.props.filters.toggleArrivals && <div data-headline='Arrivée à'> <span className={((this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.edit'] == false) ? 'disabled ' : '') + 'input-group time'}> diff --git a/app/controllers/vehicle_journeys_controller.rb b/app/controllers/vehicle_journeys_controller.rb index a44a03886..d8cbef478 100644 --- a/app/controllers/vehicle_journeys_controller.rb +++ b/app/controllers/vehicle_journeys_controller.rb @@ -79,11 +79,19 @@ class VehicleJourneysController < ChouetteController def collection scope = route.vehicle_journeys.with_stops - @q = scope.search filtered_ransack_params + # 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] + scope = scope.where_departure_time_between( + params[:q][:vehicle_journey_at_stops_departure_time_gteq], + params[:q][:vehicle_journey_at_stops_departure_time_lteq], + allow_empty: + params[:q][:vehicle_journey_without_departure_time] == 'true' + ) + end - # Fixme 3358 - # grouping = ransack_periode_filter - # @q.build_grouping(grouping) if grouping + @q = scope.search filtered_ransack_params @ppage = 20 @vehicle_journeys = @q.result.paginate(:page => params[:page], :per_page => @ppage) @@ -92,22 +100,9 @@ class VehicleJourneysController < ChouetteController @vehicle_journeys end - 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 - { - :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'} params[:q].except(:vehicle_journey_at_stops_departure_time_gteq, :vehicle_journey_at_stops_departure_time_lteq) end end 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/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/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/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index 297e462f0..852139625 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 @@ -219,7 +217,39 @@ 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 + + # Requires a SELECT DISTINCT and a join with + # "vehicle_journey_at_stops". + # + # Example: + # .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, + allow_empty: false + ) + self + .where( + %Q( + "vehicle_journey_at_stops"."departure_time" >= ? + AND "vehicle_journey_at_stops"."departure_time" < ? + #{ + 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" + ) end 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| ("<span>" + t("enumerize.line.transport_mode.#{l}") + "</span>").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| ("<span>" + t("enumerize.line.transport_mode.#{l}") + "</span>").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| ("<span>" + t("enumerize.line.transport_submode.#{l}") + "</span>").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| ("<span>" + t("enumerize.line.transport_submode.#{l}") + "</span>").html_safe}, required: false, wrapper_html: { class: 'checkbox_list'} .actions = link_to 'Effacer', @workbench, class: 'btn btn-link' 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/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 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 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 diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb index b22183ab6..7f2305134 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 @@ -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 ) @@ -310,6 +310,61 @@ 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 + .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 + + 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) } describe "in_relation_to_a_journey_pattern methods" do let!(:route) { create(:route)} 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 |
