aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorAlban Peignier2018-03-15 17:09:34 +0100
committerGitHub2018-03-15 17:09:34 +0100
commitf011f7e9806ffeaaba3ad73510bc818211f55dbd (patch)
treeb59a6a71f82b7121fb3a0ffa3a65b9d7cedaa3aa /app
parentd3d3c0f40c37d716cfccbf9297bfbdc98c692521 (diff)
parent9291d45e825edbaf52cb556c102498366985496f (diff)
downloadchouette-core-f011f7e9806ffeaaba3ad73510bc818211f55dbd.tar.bz2
Merge pull request #379 from af83/6095-route--calculate-distance-and-time-cost-between-stops
Calculate distance and time cost between Route stops. Refs #6095
Diffstat (limited to 'app')
-rw-r--r--app/models/chouette/route.rb32
-rw-r--r--app/services/route_way_cost_calculator.rb12
-rw-r--r--app/workers/route_way_cost_worker.rb16
3 files changed, 46 insertions, 14 deletions
diff --git a/app/models/chouette/route.rb b/app/models/chouette/route.rb
index 26b80733d..f814d5160 100644
--- a/app/models/chouette/route.rb
+++ b/app/models/chouette/route.rb
@@ -1,4 +1,3 @@
-
module Chouette
class Route < Chouette::TridentActiveRecord
has_paper_trail
@@ -76,19 +75,20 @@ module Chouette
validates :wayback, inclusion: { in: self.wayback.values }
- def duplicate
- overrides = {
- 'opposite_route_id' => nil,
- 'name' => I18n.t('activerecord.copy', name: self.name)
- }
- keys_for_create = attributes.keys - %w{id objectid created_at updated_at}
- atts_for_create = attributes
- .slice(*keys_for_create)
- .merge(overrides)
- new_route = self.class.create!(atts_for_create)
- duplicate_stop_points(for_route: new_route)
- new_route
- end
+ after_save :calculate_costs!, if: ->() { TomTom.enabled? }
+
+ def duplicate
+ overrides = {
+ 'opposite_route_id' => nil,
+ 'name' => I18n.t('activerecord.copy', name: self.name)
+ }
+ atts_for_create = attributes
+ .slice!(*%w{id objectid created_at updated_at})
+ .merge(overrides)
+ new_route = self.class.create!(atts_for_create)
+ duplicate_stop_points(for_route: new_route)
+ new_route
+ end
def duplicate_stop_points(for_route:)
stop_points.each(&duplicate_stop_point(for_route: for_route))
@@ -189,6 +189,10 @@ module Chouette
journey_pattern
end
+ def calculate_costs!
+ RouteWayCostWorker.perform_async(referential.id, id)
+ end
+
protected
def self.vehicle_journeys_timeless(stop_point_id)
diff --git a/app/services/route_way_cost_calculator.rb b/app/services/route_way_cost_calculator.rb
new file mode 100644
index 000000000..2e30c94fc
--- /dev/null
+++ b/app/services/route_way_cost_calculator.rb
@@ -0,0 +1,12 @@
+class RouteWayCostCalculator
+ def initialize(route)
+ @route = route
+ end
+
+ def calculate!
+ way_costs = StopAreasToWayCostsConverter.new(@route.stop_areas).convert
+ way_costs = TomTom.batch(way_costs)
+ way_costs = WayCostCollectionJSONSerializer.dump(way_costs)
+ @route.update(costs: way_costs)
+ end
+end
diff --git a/app/workers/route_way_cost_worker.rb b/app/workers/route_way_cost_worker.rb
new file mode 100644
index 000000000..d6bfed592
--- /dev/null
+++ b/app/workers/route_way_cost_worker.rb
@@ -0,0 +1,16 @@
+class RouteWayCostWorker
+ include Sidekiq::Worker
+
+ def perform(referential_id, route_id)
+ Referential.find(referential_id).switch
+ route = Chouette::Route.find(route_id)
+
+ # Prevent recursive worker spawning since this call updates the
+ # `costs` field of the route.
+ Chouette::Route.skip_callback(:save, :after, :calculate_costs!)
+
+ RouteWayCostCalculator.new(route).calculate!
+
+ Chouette::Route.set_callback(:save, :after, :calculate_costs!)
+ end
+end