diff options
| author | Robert | 2017-08-14 18:42:08 +0200 |
|---|---|---|
| committer | Robert | 2017-08-15 17:22:34 +0200 |
| commit | 373a4089173795d011ebd6adf7382b2a5e40a51b (patch) | |
| tree | 1f5580f5d57f08b7361a19b21a161ac98b04d255 /app/models | |
| parent | c16c03b91174cf637e0bd2f0e3336e3788f43e59 (diff) | |
| download | chouette-core-373a4089173795d011ebd6adf7382b2a5e40a51b.tar.bz2 | |
Refs: #4189@2h; Iimplementation of Chouette::Route#duplicate & Chouette::StopPoint#duplicate
With the following unspecified behaviour concerning `objectid` and `object_version`
- The duplicated Route objectid is passed into Route#duplicate
- The duplicated StopPoint objectids are constructed from the source's objectids (parts 2 & 3) and the route's objectid (part 1)
- the duplicated Route object_version equals the source's one
Diffstat (limited to 'app/models')
| -rw-r--r-- | app/models/chouette/route.rb | 24 | ||||
| -rw-r--r-- | app/models/chouette/stop_point.rb | 19 |
2 files changed, 37 insertions, 6 deletions
diff --git a/app/models/chouette/route.rb b/app/models/chouette/route.rb index 6774e8a86..0fe4472d3 100644 --- a/app/models/chouette/route.rb +++ b/app/models/chouette/route.rb @@ -16,6 +16,7 @@ class Chouette::Route < Chouette::TridentActiveRecord end belongs_to :line + belongs_to :opposite_route, :class_name => 'Chouette::Route', :foreign_key => :opposite_route_id has_many :routing_constraint_zones has_many :journey_patterns, :dependent => :destroy @@ -30,7 +31,6 @@ class Chouette::Route < Chouette::TridentActiveRecord Chouette::Route.vehicle_journeys_timeless(proxy_association.owner.journey_patterns.pluck( :departure_stop_point_id)) end end - belongs_to :opposite_route, :class_name => 'Chouette::Route', :foreign_key => :opposite_route_id has_many :stop_points, -> { order("position") }, :dependent => :destroy do def find_by_stop_area(stop_area) stop_area_ids = Integer === stop_area ? [stop_area] : (stop_area.children_in_depth + [stop_area]).map(&:id) @@ -56,12 +56,13 @@ class Chouette::Route < Chouette::TridentActiveRecord end has_many :stop_areas, -> { order('stop_points.position ASC') }, :through => :stop_points do def between(departure, arrival) - departure, arrival = [departure, arrival].collect do |endpoint| + departure, arrival = [departure, arrival].map do |endpoint| String === endpoint ? Chouette::StopArea.find_by_objectid(endpoint) : endpoint end proxy_owner.stop_points.between(departure, arrival).includes(:stop_area).collect(&:stop_area) end end + accepts_nested_attributes_for :stop_points, :allow_destroy => :true validates_presence_of :name @@ -75,6 +76,25 @@ class Chouette::Route < Chouette::TridentActiveRecord after_commit :journey_patterns_control_route_sections + def duplicate new_objectid + keys_for_create = attributes.keys - %w{id created_at updated_at} + atts_for_create = attributes + .slice(*keys_for_create) + .merge('objectid' => new_objectid, 'object_version' => object_version - 1) + 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)) + end + def duplicate_stop_point(for_route:) + -> stop_point do + stop_point.duplicate(for_route: for_route) + end + end + def geometry_presenter Chouette::Geometry::RoutePresenter.new self end diff --git a/app/models/chouette/stop_point.rb b/app/models/chouette/stop_point.rb index 8fe79dc0c..de9a3e26f 100644 --- a/app/models/chouette/stop_point.rb +++ b/app/models/chouette/stop_point.rb @@ -20,6 +20,11 @@ module Chouette validates_presence_of :stop_area validate :stop_area_id_validation + def stop_area_id_validation + if stop_area_id.nil? + errors.add(:stop_area_id, I18n.t("stop_areas.errors.empty")) + end + end scope :default_order, -> { order("position") } @@ -34,10 +39,16 @@ module Chouette end end - def stop_area_id_validation - if stop_area_id.nil? - errors.add(:stop_area_id, I18n.t("stop_areas.errors.empty")) - end + def duplicate(for_route:) + new_objectid = [ + for_route.objectid.split(':').first, + *objectid.split(':')[1..2] + ].join(':') + keys_for_create = attributes.keys - %w{id created_at updated_at} + atts_for_create = attributes + .slice(*keys_for_create) + .merge('objectid' => new_objectid, 'route_id' => for_route.id) + self.class.create!(atts_for_create) end def self.area_candidates |
