aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/models/chouette/routing_constraint_zone.rb11
-rw-r--r--app/models/chouette/vehicle_journey.rb2
-rw-r--r--app/models/merge.rb31
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