diff options
Diffstat (limited to 'app/models')
| -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 |
