From 99f63c55d74845db77c1488a191778bf642c6e44 Mon Sep 17 00:00:00 2001 From: Zog Date: Wed, 25 Apr 2018 12:15:49 +0200 Subject: Refs #6711; Update checksums on parents When a StopPoint is updated --- app/models/chouette/journey_pattern.rb | 2 ++ app/models/chouette/stop_point.rb | 1 + app/models/chouette/vehicle_journey.rb | 3 ++- app/models/concerns/checksum_support.rb | 9 ++++++--- spec/models/chouette/journey_pattern_spec.rb | 8 ++++++++ spec/models/chouette/vehicle_journey_spec.rb | 9 +++++++++ 6 files changed, 28 insertions(+), 4 deletions(-) diff --git a/app/models/chouette/journey_pattern.rb b/app/models/chouette/journey_pattern.rb index 4b4cc2c73..8bdf72dfb 100644 --- a/app/models/chouette/journey_pattern.rb +++ b/app/models/chouette/journey_pattern.rb @@ -29,6 +29,8 @@ module Chouette values.flatten end + has_checksum_children StopPoint + def self.state_update route, state transaction do state.each do |item| diff --git a/app/models/chouette/stop_point.rb b/app/models/chouette/stop_point.rb index b0906d65f..edb0e81fd 100644 --- a/app/models/chouette/stop_point.rb +++ b/app/models/chouette/stop_point.rb @@ -11,6 +11,7 @@ module Chouette belongs_to :stop_area belongs_to :route, inverse_of: :stop_points + has_many :journey_patterns, through: :route has_many :vehicle_journey_at_stops, :dependent => :destroy has_many :vehicle_journeys, -> {uniq}, :through => :vehicle_journey_at_stops diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index 814eeb388..dd7d75731 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -143,13 +143,14 @@ module Chouette vjas = self.vehicle_journey_at_stops vjas += VehicleJourneyAtStop.where(vehicle_journey_id: self.id) unless self.new_record? - attrs << vjas.uniq.sort_by { |s| s.stop_point&.position }.map(&:checksum).sort + attrs << vjas.uniq.sort_by { |s| s.stop_point&.position }.map(&:checksum) attrs << self.purchase_windows.map(&:checksum).sort if purchase_windows.present? end end has_checksum_children VehicleJourneyAtStop + has_checksum_children StopPoint def set_default_values if number.nil? diff --git a/app/models/concerns/checksum_support.rb b/app/models/concerns/checksum_support.rb index de3a6e16b..97209f810 100644 --- a/app/models/concerns/checksum_support.rb +++ b/app/models/concerns/checksum_support.rb @@ -12,10 +12,13 @@ module ChecksumSupport module ClassMethods def has_checksum_children klass, opts={} parent_class = self - relation = opts[:relation] || self.model_name.singular + belongs_to = opts[:relation] || self.model_name.singular + has_many = opts[:relation] || self.model_name.plural klass.after_save do - parent = self.send(relation) - parent&.update_checksum_without_callbacks! + parents = [] + parents << self.send(belongs_to) if klass.reflections[belongs_to].present? + parents += self.send(has_many) if klass.reflections[has_many].present? + parents.each &:update_checksum_without_callbacks! end end end diff --git a/spec/models/chouette/journey_pattern_spec.rb b/spec/models/chouette/journey_pattern_spec.rb index 57ee5ab4e..fbc48c95a 100644 --- a/spec/models/chouette/journey_pattern_spec.rb +++ b/spec/models/chouette/journey_pattern_spec.rb @@ -6,6 +6,14 @@ describe Chouette::JourneyPattern, :type => :model do describe 'checksum' do it_behaves_like 'checksum support' + + context "when a stop_point is updated" do + it "should update checksum" do + expect do + subject.stop_points.first.update position: subject.stop_points.size + end.to change{subject.reload.checksum} + end + end end # context 'validate minimum stop_points size' do diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb index 8682d59a2..e0d4309d2 100644 --- a/spec/models/chouette/vehicle_journey_spec.rb +++ b/spec/models/chouette/vehicle_journey_spec.rb @@ -35,6 +35,15 @@ describe Chouette::VehicleJourney, :type => :model do expect{create(:vehicle_journey_at_stop, vehicle_journey: vehicle_journey)}.to change{vehicle_journey.checksum} end + it "changes when a stop_point is updated" do + vehicle_journey = create(:vehicle_journey) + stop_point = vehicle_journey.vehicle_journey_at_stops.first.stop_point + expect(stop_point.vehicle_journeys).to include vehicle_journey + expect do + stop_point.update position: stop_point.route.stop_points.size + end.to change{vehicle_journey.reload.checksum} + end + context "when custom_field_values change" do let(:vehicle_journey){ create(:vehicle_journey, custom_field_values: {custom_field.code.to_s => former_value}) } let(:custom_field){ create :custom_field, field_type: :string, code: :energy, name: :energy, resource_type: "VehicleJourney" } -- cgit v1.2.3