aboutsummaryrefslogtreecommitdiffstats
path: root/app/models
diff options
context:
space:
mode:
authorXinhui2017-08-08 12:04:50 +0200
committerXinhui2017-08-08 12:44:39 +0200
commit117954f2666744b5301a7ffefb0b7d494fd49514 (patch)
tree8bd03f0c5b33d3842ae07aa252e194e7d33044da /app/models
parent2cf8146cdb4a28fe247108f98c5bc7eb05940e05 (diff)
parentd524e5474a913df296d4f4586eba4b879bad8b6f (diff)
downloadchouette-core-117954f2666744b5301a7ffefb0b7d494fd49514.tar.bz2
Merge branch 'checksum'
Diffstat (limited to 'app/models')
-rw-r--r--app/models/chouette/footnote.rb7
-rw-r--r--app/models/chouette/journey_pattern.rb7
-rw-r--r--app/models/chouette/route.rb9
-rw-r--r--app/models/chouette/routing_constraint_zone.rb6
-rw-r--r--app/models/chouette/time_table.rb9
-rw-r--r--app/models/chouette/time_table_date.rb6
-rw-r--r--app/models/chouette/time_table_period.rb6
-rw-r--r--app/models/chouette/vehicle_journey.rb11
-rw-r--r--app/models/chouette/vehicle_journey_at_stop.rb10
-rw-r--r--app/models/concerns/checksum_support.rb29
10 files changed, 99 insertions, 1 deletions
diff --git a/app/models/chouette/footnote.rb b/app/models/chouette/footnote.rb
index de427b249..1664faf23 100644
--- a/app/models/chouette/footnote.rb
+++ b/app/models/chouette/footnote.rb
@@ -1,6 +1,13 @@
class Chouette::Footnote < Chouette::ActiveRecord
+ include ChecksumSupport
+
belongs_to :line, inverse_of: :footnotes
has_and_belongs_to_many :vehicle_journeys, :class_name => 'Chouette::VehicleJourney'
validates_presence_of :line
+
+ def checksum_attributes
+ attrs = ['code', 'label']
+ self.slice(*attrs).values
+ end
end
diff --git a/app/models/chouette/journey_pattern.rb b/app/models/chouette/journey_pattern.rb
index f238d7339..fa5fba26d 100644
--- a/app/models/chouette/journey_pattern.rb
+++ b/app/models/chouette/journey_pattern.rb
@@ -1,4 +1,5 @@
class Chouette::JourneyPattern < Chouette::TridentActiveRecord
+ include ChecksumSupport
include JourneyPatternRestrictions
# FIXME http://jira.codehaus.org/browse/JRUBY-6358
self.primary_key = "id"
@@ -20,6 +21,12 @@ class Chouette::JourneyPattern < Chouette::TridentActiveRecord
attr_accessor :control_checked
after_update :control_route_sections, :unless => "control_checked"
+ def checksum_attributes
+ values = self.slice(*['name', 'published_name', 'registration_number']).values
+ values << self.stop_points.map(&:stop_area).map(&:user_objectid)
+ values.flatten
+ end
+
def self.state_update route, state
transaction do
state.each do |item|
diff --git a/app/models/chouette/route.rb b/app/models/chouette/route.rb
index 76905bf2b..6774e8a86 100644
--- a/app/models/chouette/route.rb
+++ b/app/models/chouette/route.rb
@@ -1,5 +1,6 @@
class Chouette::Route < Chouette::TridentActiveRecord
include RouteRestrictions
+ include ChecksumSupport
extend Enumerize
extend ActiveModel::Naming
@@ -99,6 +100,14 @@ class Chouette::Route < Chouette::TridentActiveRecord
end
end
+ def checksum_attributes
+ values = self.slice(*['name', 'published_name', 'wayback']).values
+ values.tap do |attrs|
+ attrs << self.stop_points.map{|sp| "#{sp.stop_area.user_objectid}#{sp.for_boarding}#{sp.for_alighting}" }.join
+ attrs << self.routing_constraint_zones.map(&:checksum)
+ end
+ end
+
def geometry
points = stop_areas.map(&:to_lat_lng).compact.map do |loc|
[loc.lng, loc.lat]
diff --git a/app/models/chouette/routing_constraint_zone.rb b/app/models/chouette/routing_constraint_zone.rb
index a649b0b8e..9931748b2 100644
--- a/app/models/chouette/routing_constraint_zone.rb
+++ b/app/models/chouette/routing_constraint_zone.rb
@@ -1,4 +1,6 @@
class Chouette::RoutingConstraintZone < Chouette::TridentActiveRecord
+ include ChecksumSupport
+
belongs_to :route
has_array_of :stop_points, class_name: 'Chouette::StopPoint'
@@ -15,6 +17,10 @@ class Chouette::RoutingConstraintZone < Chouette::TridentActiveRecord
.order("routes.name #{direction}")
end
+ def checksum_attributes
+ self.stop_points.map(&:stop_area).map(&:user_objectid)
+ end
+
def stop_points_belong_to_route
errors.add(:stop_point_ids, I18n.t('activerecord.errors.models.routing_constraint_zone.attributes.stop_points.stop_points_not_from_route')) unless stop_points.all? { |sp| route.stop_points.include? sp }
end
diff --git a/app/models/chouette/time_table.rb b/app/models/chouette/time_table.rb
index 1753cbed5..97d2e7556 100644
--- a/app/models/chouette/time_table.rb
+++ b/app/models/chouette/time_table.rb
@@ -1,4 +1,5 @@
class Chouette::TimeTable < Chouette::TridentActiveRecord
+ include ChecksumSupport
include TimeTableRestrictions
# FIXME http://jira.codehaus.org/browse/JRUBY-6358
self.primary_key = "id"
@@ -26,6 +27,14 @@ class Chouette::TimeTable < Chouette::TridentActiveRecord
after_save :save_shortcuts
+ def checksum_attributes
+ [].tap do |attrs|
+ attrs << self.int_day_types
+ attrs << self.dates.map(&:checksum).map(&:to_s).sort
+ attrs << self.periods.map(&:checksum).map(&:to_s).sort
+ end
+ end
+
def self.object_id_key
"Timetable"
end
diff --git a/app/models/chouette/time_table_date.rb b/app/models/chouette/time_table_date.rb
index b881c9a5d..1893eae91 100644
--- a/app/models/chouette/time_table_date.rb
+++ b/app/models/chouette/time_table_date.rb
@@ -1,4 +1,6 @@
class Chouette::TimeTableDate < Chouette::ActiveRecord
+ include ChecksumSupport
+
self.primary_key = "id"
belongs_to :time_table, inverse_of: :dates
acts_as_list :scope => 'time_table_id = #{time_table_id}',:top_of_list => 0
@@ -12,5 +14,9 @@ class Chouette::TimeTableDate < Chouette::ActiveRecord
ActiveModel::Name.new Chouette::TimeTableDate, Chouette, "TimeTableDate"
end
+ def checksum_attributes
+ attrs = ['date', 'in_out']
+ self.slice(*attrs).values
+ end
end
diff --git a/app/models/chouette/time_table_period.rb b/app/models/chouette/time_table_period.rb
index 6d3486bb6..ed136f3b9 100644
--- a/app/models/chouette/time_table_period.rb
+++ b/app/models/chouette/time_table_period.rb
@@ -1,4 +1,6 @@
class Chouette::TimeTablePeriod < Chouette::ActiveRecord
+ include ChecksumSupport
+
self.primary_key = "id"
belongs_to :time_table, inverse_of: :periods
acts_as_list :scope => 'time_table_id = #{time_table_id}',:top_of_list => 0
@@ -7,6 +9,10 @@ class Chouette::TimeTablePeriod < Chouette::ActiveRecord
validate :start_must_be_before_end
+ def checksum_attributes
+ attrs = ['period_start', 'period_end']
+ self.slice(*attrs).values
+ end
def self.model_name
ActiveModel::Name.new Chouette::TimeTablePeriod, Chouette, "TimeTablePeriod"
diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb
index 5e86a4897..d5ca58959 100644
--- a/app/models/chouette/vehicle_journey.rb
+++ b/app/models/chouette/vehicle_journey.rb
@@ -1,5 +1,6 @@
module Chouette
class VehicleJourney < TridentActiveRecord
+ include ChecksumSupport
include VehicleJourneyRestrictions
include StifTransportModeEnumerations
# FIXME http://jira.codehaus.org/browse/JRUBY-6358
@@ -55,6 +56,16 @@ module Chouette
end
end
+ def checksum_attributes
+ [].tap do |attrs|
+ attrs << self.published_journey_name
+ attrs << self.published_journey_identifier
+ attrs << self.try(:company).try(:objectid).try(:local_id)
+ attrs << self.footnotes.map(&:checksum).sort
+ attrs << self.vehicle_journey_at_stops.map(&:checksum).sort
+ end
+ end
+
def set_default_values
if number.nil?
self.number = 0
diff --git a/app/models/chouette/vehicle_journey_at_stop.rb b/app/models/chouette/vehicle_journey_at_stop.rb
index 35d94aa75..156cc761f 100644
--- a/app/models/chouette/vehicle_journey_at_stop.rb
+++ b/app/models/chouette/vehicle_journey_at_stop.rb
@@ -2,6 +2,7 @@ module Chouette
class VehicleJourneyAtStop < ActiveRecord
include ForBoardingEnumerations
include ForAlightingEnumerations
+ include ChecksumSupport
DAY_OFFSET_MAX = 1
@@ -66,6 +67,13 @@ module Chouette
offset < 0 || offset > DAY_OFFSET_MAX
end
-
+ def checksum_attributes
+ [].tap do |attrs|
+ attrs << self.departure_time.try(:to_s, :time)
+ attrs << self.arrival_time.try(:to_s, :time)
+ attrs << self.departure_day_offset.to_s
+ attrs << self.arrival_day_offset.to_s
+ end
+ end
end
end
diff --git a/app/models/concerns/checksum_support.rb b/app/models/concerns/checksum_support.rb
new file mode 100644
index 000000000..c95e23bcf
--- /dev/null
+++ b/app/models/concerns/checksum_support.rb
@@ -0,0 +1,29 @@
+module ChecksumSupport
+ extend ActiveSupport::Concern
+ SEPARATOR = '|'
+ VALUE_FOR_NIL_ATTRIBUTE = '-'
+
+ included do
+ before_save :set_current_checksum_source, :update_checksum
+ end
+
+ def checksum_attributes
+ self.attributes.values
+ end
+
+ def current_checksum_source
+ source = self.checksum_attributes.map{ |x| x unless x.try(:empty?) }
+ source = source.map{ |x| x || VALUE_FOR_NIL_ATTRIBUTE }
+ source.map(&:to_s).join(SEPARATOR)
+ end
+
+ def set_current_checksum_source
+ self.checksum_source = self.current_checksum_source
+ end
+
+ def update_checksum
+ if self.checksum_source_changed?
+ self.checksum = Digest::SHA256.new.hexdigest(self.checksum_source)
+ end
+ end
+end