diff options
| author | Xinhui | 2017-04-04 12:42:11 +0200 | 
|---|---|---|
| committer | Xinhui | 2017-04-04 12:42:17 +0200 | 
| commit | 055fa0b56c0a47482f098af079b5e0929be56acd (patch) | |
| tree | 42a6fcd033f9b93d79e80fea4e4348b87803bd2a | |
| parent | dd9a3e95b412a635d6787553fc8e0b8fa3219754 (diff) | |
| download | chouette-core-055fa0b56c0a47482f098af079b5e0929be56acd.tar.bz2 | |
Save vehicle_journey_at_stops from newly created vehicle journey
Refs #2777
| -rw-r--r-- | app/models/chouette/vehicle_journey.rb | 40 | ||||
| -rw-r--r-- | spec/models/chouette/vehicle_journey_spec.rb | 45 | 
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) | 
