aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/chouette
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/chouette')
-rw-r--r--app/models/chouette/journey_pattern.rb48
-rw-r--r--app/models/chouette/purchase_window.rb7
-rw-r--r--app/models/chouette/route.rb20
-rw-r--r--app/models/chouette/stop_area.rb6
-rw-r--r--app/models/chouette/stop_point.rb4
-rw-r--r--app/models/chouette/time_table.rb7
-rw-r--r--app/models/chouette/vehicle_journey.rb3
7 files changed, 76 insertions, 19 deletions
diff --git a/app/models/chouette/journey_pattern.rb b/app/models/chouette/journey_pattern.rb
index 830a6a808..4b4cc2c73 100644
--- a/app/models/chouette/journey_pattern.rb
+++ b/app/models/chouette/journey_pattern.rb
@@ -2,6 +2,7 @@ module Chouette
class JourneyPattern < Chouette::TridentActiveRecord
has_metadata
include ChecksumSupport
+ include CustomFieldsSupport
include JourneyPatternRestrictions
include ObjectidSupport
@@ -52,12 +53,19 @@ module Chouette
end
def self.state_permited_attributes item
- {
+ attrs = {
name: item['name'],
published_name: item['published_name'],
registration_number: item['registration_number'],
costs: item['costs']
}
+ attrs["custom_field_values"] = Hash[
+ *(item["custom_fields"] || {})
+ .map { |k, v| [k, v["value"]] }
+ .flatten
+ ]
+
+ attrs
end
def self.state_create_instance route, item
@@ -78,10 +86,8 @@ module Chouette
def state_stop_points_update item
item['stop_points'].each do |sp|
- exist = stop_area_ids.include?(sp['id'])
- next if exist && sp['checked']
-
- stop_point = route.stop_points.find_by(stop_area_id: sp['id'])
+ stop_point = route.stop_points.find_by(stop_area_id: sp['id'], position: sp['position'])
+ exist = stop_points.include?(stop_point)
if !exist && sp['checked']
stop_points << stop_point
end
@@ -161,18 +167,18 @@ module Chouette
next finish unless start.present?
costs = costs_between(start, finish)
full = false unless costs.present?
- full = false unless costs[:distance] && costs[:distance] > 0
full = false unless costs[:time] && costs[:time] > 0
finish
end
full
end
- def distance_to stop
+ def distance_between start, stop
+ return 0 unless start.position < stop.position
val = 0
- i = 0
- _end = stop_points.first
- while _end != stop
+ i = stop_points.index(start)
+ _end = start
+ while _end && _end != stop
i += 1
_start = _end
_end = stop_points[i]
@@ -181,6 +187,28 @@ module Chouette
val
end
+ def distance_to stop
+ distance_between stop_points.first, stop
+ end
+
+ def journey_length
+ i = 0
+ j = stop_points.length - 1
+ start = stop_points[i]
+ stop = stop_points[j]
+ while i < j && start.kind == "non_commercial"
+ i+= 1
+ start = stop_points[i]
+ end
+
+ while i < j && stop.kind == "non_commercial"
+ j-= 1
+ stop = stop_points[j]
+ end
+ return 0 unless start && stop
+ distance_between start, stop
+ end
+
def set_distances distances
raise "inconsistent data: #{distances.count} values for #{stop_points.count} stops" unless distances.count == stop_points.count
prev = distances[0].to_i
diff --git a/app/models/chouette/purchase_window.rb b/app/models/chouette/purchase_window.rb
index e10b106ec..d22674637 100644
--- a/app/models/chouette/purchase_window.rb
+++ b/app/models/chouette/purchase_window.rb
@@ -46,8 +46,9 @@ module Chouette
]
end
- # def checksum_attributes
- # end
-
+ def color
+ _color = read_attribute(:color)
+ _color.present? ? _color : nil
+ end
end
end
diff --git a/app/models/chouette/route.rb b/app/models/chouette/route.rb
index 9c7a3e6d9..a5eab3002 100644
--- a/app/models/chouette/route.rb
+++ b/app/models/chouette/route.rb
@@ -7,6 +7,16 @@ module Chouette
include ObjectidSupport
extend Enumerize
+ if ENV["CHOUETTE_ROUTE_POSITION_CHECK"] == "true" || !Rails.env.production?
+ after_commit do
+ positions = stop_points.pluck(:position)
+ Rails.logger.debug "Check positions in Route #{id} : #{positions.inspect}"
+ if positions.size != positions.uniq.size
+ raise "DUPLICATED stop_points positions in Route #{id} : #{positions.inspect}"
+ end
+ end
+ end
+
enumerize :direction, in: %i(straight_forward backward clockwise counter_clockwise north north_west west south_west south south_east east north_east)
enumerize :wayback, in: %i(outbound inbound), default: :outbound
@@ -68,8 +78,14 @@ module Chouette
validates_presence_of :published_name
validates_presence_of :line
validates :wayback, inclusion: { in: self.wayback.values }
- after_save :calculate_costs!, if: ->() { TomTom.enabled? }
-
+ after_commit :calculate_costs!,
+ on: [:create, :update],
+ if: ->() {
+ # Ensure the call back doesn't run during a referential merge
+ !referential.in_referential_suite? &&
+ TomTom.enabled?
+ }
+
def duplicate opposite=false
overrides = {
'opposite_route_id' => nil,
diff --git a/app/models/chouette/stop_area.rb b/app/models/chouette/stop_area.rb
index 4ddc7403b..b933e1944 100644
--- a/app/models/chouette/stop_area.rb
+++ b/app/models/chouette/stop_area.rb
@@ -436,6 +436,12 @@ module Chouette
ActiveSupport::TimeZone[time_zone]&.utc_offset
end
+ def full_time_zone_name
+ return unless time_zone.present?
+ return unless ActiveSupport::TimeZone[time_zone].present?
+ ActiveSupport::TimeZone[time_zone].tzinfo.name
+ end
+
def country
return unless country_code
country = ISO3166::Country[country_code]
diff --git a/app/models/chouette/stop_point.rb b/app/models/chouette/stop_point.rb
index 1df1a664a..6f2d89578 100644
--- a/app/models/chouette/stop_point.rb
+++ b/app/models/chouette/stop_point.rb
@@ -9,7 +9,6 @@ module Chouette
include ForAlightingEnumerations
include ObjectidSupport
-
belongs_to :stop_area
belongs_to :route, inverse_of: :stop_points
has_many :vehicle_journey_at_stops, :dependent => :destroy
@@ -17,7 +16,6 @@ module Chouette
acts_as_list :scope => :route, top_of_list: 0
-
validates_presence_of :stop_area
validate :stop_area_id_validation
def stop_area_id_validation
@@ -28,7 +26,7 @@ module Chouette
scope :default_order, -> { order("position") }
- delegate :name, to: :stop_area
+ delegate :name, :kind, :area_type, to: :stop_area
before_destroy :remove_dependent_journey_pattern_stop_points
def remove_dependent_journey_pattern_stop_points
diff --git a/app/models/chouette/time_table.rb b/app/models/chouette/time_table.rb
index b59c95665..29e3808e7 100644
--- a/app/models/chouette/time_table.rb
+++ b/app/models/chouette/time_table.rb
@@ -16,7 +16,7 @@ module Chouette
end
ransacker :unaccented_comment, formatter: ->(val){ val.parameterize } do
- Arel.sql('unaccent(comment)')
+ Arel.sql('unaccent(time_tables.comment)')
end
has_and_belongs_to_many :vehicle_journeys, :class_name => 'Chouette::VehicleJourney'
@@ -81,6 +81,11 @@ module Chouette
chunk.values.delete_if {|dates| dates.count < 2}
end
+ def color
+ _color = read_attribute(:color)
+ _color.present? ? _color : nil
+ end
+
def convert_continuous_dates_to_periods
chunks = self.continuous_dates
diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb
index 54aad290c..c269d478e 100644
--- a/app/models/chouette/vehicle_journey.rb
+++ b/app/models/chouette/vehicle_journey.rb
@@ -244,11 +244,13 @@ module Chouette
end
def self.state_update route, state
+ objects = []
transaction do
state.each do |item|
item.delete('errors')
vj = find_by(objectid: item['objectid']) || state_create_instance(route, item)
next if item['deletable'] && vj.persisted? && vj.destroy
+ objects << vj
if vj.state_update_vjas?(item['vehicle_journey_at_stops'])
vj.update_vjas_from_state(item['vehicle_journey_at_stops'])
@@ -276,6 +278,7 @@ module Chouette
item['vehicle_journey_at_stops'].map {|vjas| vjas.delete('new_record') }
end
state.delete_if {|item| item['deletable']}
+ objects
end
def self.state_create_instance route, item