diff options
| author | Alban Peignier | 2018-04-25 15:43:55 +0200 | 
|---|---|---|
| committer | Alban Peignier | 2018-04-25 15:43:55 +0200 | 
| commit | 86bab6946dbb9bce2aa62bb7a6b528458333c03d (patch) | |
| tree | b559fe7c96f62adf1d404d673691c8d6c2e57289 | |
| parent | 94406e685f252451b87fc7f8aa4445761858c9fd (diff) | |
| download | chouette-core-86bab6946dbb9bce2aa62bb7a6b528458333c03d.tar.bz2 | |
Merge VehicleJourney ignored_routing_contraint_zone_ids. Refs #6762
| -rw-r--r-- | app/models/chouette/routing_constraint_zone.rb | 11 | ||||
| -rw-r--r-- | app/models/chouette/vehicle_journey.rb | 2 | ||||
| -rw-r--r-- | app/models/merge.rb | 31 | 
3 files changed, 39 insertions, 5 deletions
| diff --git a/app/models/chouette/routing_constraint_zone.rb b/app/models/chouette/routing_constraint_zone.rb index 6b7c228b0..713972243 100644 --- a/app/models/chouette/routing_constraint_zone.rb +++ b/app/models/chouette/routing_constraint_zone.rb @@ -7,6 +7,17 @@ module Chouette      belongs_to :route      has_array_of :stop_points, class_name: 'Chouette::StopPoint' +    # FIXME has_array_of doesn't support module in class_name +    # belongs_to_array_in_many :vehicle_journeys, class_name: 'Chouette::VehicleJourney' +    def vehicle_journeys +      referential.vehicle_journeys.with_ignored_routing_contraint_zones_containing self +    end + +    def update_vehicle_journey_checksums +      vehicle_journeys.each(&:update_checksum!) +    end +    after_save :update_vehicle_journey_checksums +      validates_presence_of :name, :stop_points, :route_id      # validates :stop_point_ids, length: { minimum: 2, too_short: I18n.t('activerecord.errors.models.routing_constraint_zone.attributes.stop_points.not_enough_stop_points') }      validate :stop_points_belong_to_route, :not_all_stop_points_selected diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index b5476c210..74d875164 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -25,6 +25,7 @@ module Chouette      has_and_belongs_to_many :footnotes, :class_name => 'Chouette::Footnote'      has_and_belongs_to_many :purchase_windows, :class_name => 'Chouette::PurchaseWindow' +    has_array_of :ignored_routing_contraint_zones, class_name: 'Chouette::RoutingConstraintZone'      validates_presence_of :route      validates_presence_of :journey_pattern @@ -146,6 +147,7 @@ module Chouette          attrs << vjas.uniq.sort_by { |s| s.stop_point&.position }.map(&:checksum).sort          attrs << self.purchase_windows.map(&:checksum).sort if purchase_windows.present? +        attrs << ignored_routing_contraint_zones.map(&:checksum).sort if ignored_routing_contraint_zones.present?        end      end diff --git a/app/models/merge.rb b/app/models/merge.rb index 7df7aa590..eadeccaa7 100644 --- a/app/models/merge.rb +++ b/app/models/merge.rb @@ -135,12 +135,14 @@ class Merge < ApplicationModel      referential_stop_points_by_route = referential_stop_points.group_by(&:route_id) -    referential_routes_constraint_zones = referential.switch do +    referential_routing_constraint_zones = referential.switch do        referential.routing_constraint_zones.each_with_object(Hash.new { |h,k| h[k] = [] }) do |routing_constraint_zone, hash|          hash[routing_constraint_zone.route_id] << routing_constraint_zone        end      end +    referential_routing_constraint_zones_new_ids = {} +      new.switch do        referential_routes.each do |route|          existing_route = new.routes.find_by line_id: route.line_id, checksum: route.checksum @@ -179,9 +181,9 @@ class Merge < ApplicationModel            stop_point_ids_mapping = Hash[[old_stop_point_ids, new_stop_point_ids].transpose]            # RoutingConstraintZones -          routes_constraint_zones = referential_routes_constraint_zones[route.id] +          routing_constraint_zones = referential_routing_constraint_zones[route.id] -          routes_constraint_zones.each do |routing_constraint_zone| +          routing_constraint_zones.each do |routing_constraint_zone|              objectid = new.routing_constraint_zones.where(objectid: routing_constraint_zone.objectid).exists? ? nil : routing_constraint_zone.objectid              stop_point_ids = routing_constraint_zone.stop_point_ids.map { |id| stop_point_ids_mapping[id] }.compact @@ -197,7 +199,6 @@ class Merge < ApplicationModel              )              new_route.routing_constraint_zones.build attributes -            # No checksum check. RoutingConstraintZones are always recreated            end            new_route.save! @@ -205,6 +206,19 @@ class Merge < ApplicationModel            if new_route.checksum != route.checksum              raise "Checksum has changed: \"#{route.checksum}\", \"#{route.checksum_source}\" -> \"#{new_route.checksum}\", \"#{new_route.checksum_source}\""            end + +          if new_route.routing_constraint_zones.map(&:checksum).sort != routing_constraint_zones.map(&:checksum).sort +            raise "Checksum has changed in RoutingConstraintZones: \"#{new_route.routing_constraint_zones.map(&:checksum).sort}\" -> \"#{route.routing_constraint_zones.map(&:checksum).sort}\"" +          end + +          new_route.routing_constraint_zones.each do |new_routing_constraint_zone| +            routing_constraint_zone = routing_constraint_zones.find { |c| c.checksum = new_routing_constraint_zone.checksum } +            if routing_constraint_zone +              referential_routing_constraint_zones_new_ids[routing_constraint_zone.id] = new_routing_constraint_zone.id +            else +              raise "Can't find RoutingConstraintZone for checksum #{new_routing_constraint_zone.checksum} into #{routing_constraint_zones.inspect}" +            end +          end          end        end      end @@ -311,6 +325,7 @@ class Merge < ApplicationModel              # all other primary must be changed              route_id: existing_associated_journey_pattern.route_id,              journey_pattern_id: existing_associated_journey_pattern.id, +            ignored_routing_contraint_zone_ids: []            )            new_vehicle_journey = new.vehicle_journeys.build attributes @@ -350,10 +365,16 @@ class Merge < ApplicationModel              new_vehicle_journey.purchase_windows << associated_purchase_window            end +          # Rewrite ignored_routing_contraint_zone_ids + +          new_vehicle_journey.ignored_routing_contraint_zone_ids = vehicle_journey.ignored_routing_contraint_zone_ids.map do |id| +            referential_routing_constraint_zones_new_ids[id] +          end.compact +            new_vehicle_journey.save!            if new_vehicle_journey.checksum != vehicle_journey.checksum -            raise "Checksum has changed: #{vehicle_journey.checksum_source} #{new_vehicle_journey.checksum_source}" +            raise "Checksum has changed: \"#{vehicle_journey.checksum_source}\" \"#{vehicle_journey.checksum}\" -> \"#{new_vehicle_journey.checksum_source}\" \"#{new_vehicle_journey.checksum}\""            end            new_vehicle_journey_ids[vehicle_journey.id] = new_vehicle_journey.id | 
