aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXinhui2017-04-04 12:42:11 +0200
committerXinhui2017-04-04 12:42:17 +0200
commit055fa0b56c0a47482f098af079b5e0929be56acd (patch)
tree42a6fcd033f9b93d79e80fea4e4348b87803bd2a
parentdd9a3e95b412a635d6787553fc8e0b8fa3219754 (diff)
downloadchouette-core-055fa0b56c0a47482f098af079b5e0929be56acd.tar.bz2
Save vehicle_journey_at_stops from newly created vehicle journey
Refs #2777
-rw-r--r--app/models/chouette/vehicle_journey.rb40
-rw-r--r--spec/models/chouette/vehicle_journey_spec.rb45
2 files changed, 60 insertions, 25 deletions
diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb
index 0aab9d0ed..a4a363348 100644
--- a/app/models/chouette/vehicle_journey.rb
+++ b/app/models/chouette/vehicle_journey.rb
@@ -56,21 +56,28 @@ module Chouette
at_stops
end
+ def create_or_find_vjas_from_state vjas
+ return vehicle_journey_at_stops.find(vjas['id']) if vjas['id']
+ stop_point = Chouette::StopPoint.find_by(objectid: vjas['stop_point_objectid'])
+ stop = vehicle_journey_at_stops.create(stop_point: stop_point)
+ vjas['id'] = stop.id
+ vjas['new_record'] = true
+ stop
+ end
+
def update_vjas_from_state state
state.each do |vjas|
next if vjas["dummy"]
- stop = vehicle_journey_at_stops.find(vjas['id']) if vjas['id']
- if stop
- params = {}.tap do |el|
- ['arrival_time', 'departure_time'].each do |field|
- time = "#{vjas[field]['hour']}:#{vjas[field]['minute']}"
- el[field.to_sym] = Time.parse("2000-01-01 #{time}:00 UTC")
- end
+ params = {}.tap do |el|
+ ['arrival_time', 'departure_time'].each do |field|
+ time = "#{vjas[field]['hour']}:#{vjas[field]['minute']}"
+ el[field.to_sym] = Time.parse("2000-01-01 #{time}:00 UTC")
end
- stop.update_attributes(params)
- vjas.delete('errors')
- vjas['errors'] = stop.errors if stop.errors.any?
end
+ stop = create_or_find_vjas_from_state(vjas)
+ stop.update_attributes(params)
+ vjas.delete('errors')
+ vjas['errors'] = stop.errors if stop.errors.any?
end
end
@@ -85,13 +92,22 @@ module Chouette
vj.update_attributes(state_permited_attributes(item))
item['errors'] = vj.errors if vj.errors.any?
end
+
+ # Delete ids of new object from state if we had to rollback
if state.any? {|item| item['errors']}
- state.map {|item| item.delete('objectid') if item['new_record']}
+ state.map do |item|
+ item.delete('objectid') if item['new_record']
+ item['vehicle_journey_at_stops'].map {|vjas| vjas.delete('id') if vjas['new_record'] }
+ end
raise ::ActiveRecord::Rollback
end
end
- state.map {|item| item.delete('new_record')}
+ # Remove new_record flag && deleted item from state if transaction has been saved
+ state.map do |item|
+ item.delete('new_record')
+ item['vehicle_journey_at_stops'].map {|vjas| vjas.delete('new_record') }
+ end
state.delete_if {|item| item['deletable']}
end
diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb
index fab9cd5e8..c922731a7 100644
--- a/spec/models/chouette/vehicle_journey_spec.rb
+++ b/spec/models/chouette/vehicle_journey_spec.rb
@@ -1,23 +1,28 @@
require 'spec_helper'
describe Chouette::VehicleJourney, :type => :model do
describe "state_update" do
+
+ def vehicle_journey_at_stop_to_state vjas
+ at_stop = {'stop_area_object_id' => vjas.stop_point.stop_area.objectid }
+ [:id, :connecting_service_id, :boarding_alighting_possibility].map do |att|
+ at_stop[att.to_s] = vjas.send(att) unless vjas.send(att).nil?
+ end
+
+ [:arrival_time, :departure_time].map do |att|
+ at_stop[att.to_s] = {
+ 'hour' => vjas.send(att).strftime('%H'),
+ 'minute' => vjas.send(att).strftime('%M'),
+ }
+ end
+ at_stop
+ end
+
def vehicle_journey_to_state vj
vj.attributes.slice('objectid', 'published_journey_name', 'journey_pattern_id', 'company_id').tap do |item|
item['vehicle_journey_at_stops'] = []
- vj.vehicle_journey_at_stops.each do |vs|
- at_stops = {'stop_area_object_id' => vs.stop_point.stop_area.objectid }
- [:id, :connecting_service_id, :boarding_alighting_possibility].map do |att|
- at_stops[att.to_s] = vs.send(att) unless vs.send(att).nil?
- end
-
- [:arrival_time, :departure_time].map do |att|
- at_stops[att.to_s] = {
- 'hour' => vs.send(att).strftime('%H'),
- 'minute' => vs.send(att).strftime('%M'),
- }
- end
- item['vehicle_journey_at_stops'] << at_stops
+ vj.vehicle_journey_at_stops.each do |vjas|
+ item['vehicle_journey_at_stops'] << vehicle_journey_at_stop_to_state(vjas)
end
end
end
@@ -40,6 +45,20 @@ describe Chouette::VehicleJourney, :type => :model do
expect(vj.published_journey_name).to eq 'dummy'
end
+ it 'should save vehicle_journey_at_stops of newly created vj' do
+ new_vj = build(:vehicle_journey, objectid: nil, published_journey_name: 'dummy', route: route, journey_pattern: journey_pattern)
+ new_vj.vehicle_journey_at_stops << build(:vehicle_journey_at_stop,
+ :vehicle_journey => new_vj,
+ :stop_point => create(:stop_point),
+ :arrival_time => '2000-01-01 01:00:00 UTC',
+ :departure_time => '2000-01-01 03:00:00 UTC')
+
+ collection << vehicle_journey_to_state(new_vj)
+ expect {
+ Chouette::VehicleJourney.state_update(route, collection)
+ }.to change {Chouette::VehicleJourneyAtStop.count}.by(1)
+ end
+
it 'should update vj journey_pattern' do
state['journey_pattern'] = create(:journey_pattern).attributes.slice('id', 'name', 'objectid')
Chouette::VehicleJourney.state_update(route, collection)