diff options
| author | Xinhui | 2017-08-08 12:04:50 +0200 |
|---|---|---|
| committer | Xinhui | 2017-08-08 12:44:39 +0200 |
| commit | 117954f2666744b5301a7ffefb0b7d494fd49514 (patch) | |
| tree | 8bd03f0c5b33d3842ae07aa252e194e7d33044da /app/models | |
| parent | 2cf8146cdb4a28fe247108f98c5bc7eb05940e05 (diff) | |
| parent | d524e5474a913df296d4f4586eba4b879bad8b6f (diff) | |
| download | chouette-core-117954f2666744b5301a7ffefb0b7d494fd49514.tar.bz2 | |
Merge branch 'checksum'
Diffstat (limited to 'app/models')
| -rw-r--r-- | app/models/chouette/footnote.rb | 7 | ||||
| -rw-r--r-- | app/models/chouette/journey_pattern.rb | 7 | ||||
| -rw-r--r-- | app/models/chouette/route.rb | 9 | ||||
| -rw-r--r-- | app/models/chouette/routing_constraint_zone.rb | 6 | ||||
| -rw-r--r-- | app/models/chouette/time_table.rb | 9 | ||||
| -rw-r--r-- | app/models/chouette/time_table_date.rb | 6 | ||||
| -rw-r--r-- | app/models/chouette/time_table_period.rb | 6 | ||||
| -rw-r--r-- | app/models/chouette/vehicle_journey.rb | 11 | ||||
| -rw-r--r-- | app/models/chouette/vehicle_journey_at_stop.rb | 10 | ||||
| -rw-r--r-- | app/models/concerns/checksum_support.rb | 29 |
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 |
