aboutsummaryrefslogtreecommitdiffstats
path: root/app/models
diff options
context:
space:
mode:
authorcedricnjanga2017-11-16 16:44:37 +0100
committerGuillaume2017-11-16 16:44:37 +0100
commit3f39b62beb9ff7af741696a6c3c7e87737c3a257 (patch)
treecbb89c8eb78fa9349bf499ffc01483d25554c3d0 /app/models
parente5fcb0cc0728cbb673c1f5cf346e865fbbbc593a (diff)
downloadchouette-core-3f39b62beb9ff7af741696a6c3c7e87737c3a257.tar.bz2
Add Cédric new objectid concerns
objectid_support handles reading and writing object_ids objectid_formater_support gets the right formater class include these concerns in chouette models Remove StifNetexAttributSupport modules because these are handled by the new objectid concerns Add a objectid and formater classes for each format type Add objectid formats to the factories Modify somes specs for object_ids but there are still a number of failling tests
Diffstat (limited to 'app/models')
-rw-r--r--app/models/chouette/access_link.rb1
-rw-r--r--app/models/chouette/access_point.rb7
-rw-r--r--app/models/chouette/company.rb3
-rw-r--r--app/models/chouette/connection_link.rb1
-rw-r--r--app/models/chouette/group_of_line.rb2
-rw-r--r--app/models/chouette/journey_pattern.rb301
-rw-r--r--app/models/chouette/line.rb5
-rw-r--r--app/models/chouette/network.rb3
-rw-r--r--app/models/chouette/objectid/netex.rb36
-rw-r--r--app/models/chouette/objectid/stif_codifligne.rb25
-rw-r--r--app/models/chouette/objectid/stif_netex.rb15
-rw-r--r--app/models/chouette/objectid/stif_reflex.rb24
-rw-r--r--app/models/chouette/objectid_formater/netex.rb18
-rw-r--r--app/models/chouette/objectid_formater/stif_codifligne.rb18
-rw-r--r--app/models/chouette/objectid_formater/stif_netex.rb20
-rw-r--r--app/models/chouette/objectid_formater/stif_reflex.rb18
-rw-r--r--app/models/chouette/route.rb2
-rw-r--r--app/models/chouette/routing_constraint_zone.rb2
-rw-r--r--app/models/chouette/stop_area.rb9
-rw-r--r--app/models/chouette/stop_point.rb3
-rw-r--r--app/models/chouette/time_table.rb2
-rw-r--r--app/models/chouette/trident_active_record.rb1
-rw-r--r--app/models/chouette/vehicle_journey.rb2
-rw-r--r--app/models/concerns/objectid_formater_support.rb15
-rw-r--r--app/models/concerns/objectid_support.rb26
-rw-r--r--app/models/line_referential.rb5
-rw-r--r--app/models/referential.rb5
-rw-r--r--app/models/stop_area_referential.rb3
-rw-r--r--app/models/workbench.rb5
29 files changed, 391 insertions, 186 deletions
diff --git a/app/models/chouette/access_link.rb b/app/models/chouette/access_link.rb
index b43dcfb7f..543f1cdb7 100644
--- a/app/models/chouette/access_link.rb
+++ b/app/models/chouette/access_link.rb
@@ -1,5 +1,6 @@
module Chouette
class AccessLink < TridentActiveRecord
+ include ObjectidSupport
# FIXME http://jira.codehaus.org/browse/JRUBY-6358
self.primary_key = "id"
diff --git a/app/models/chouette/access_point.rb b/app/models/chouette/access_point.rb
index 4a1ae8a0e..679d3862b 100644
--- a/app/models/chouette/access_point.rb
+++ b/app/models/chouette/access_point.rb
@@ -5,9 +5,9 @@ class Chouette::AccessPoint < Chouette::ActiveRecord
# FIXME http://jira.codehaus.org/browse/JRUBY-6358
self.primary_key = "id"
- include StifReflexAttributesSupport
include Geokit::Mappable
include ProjectionFields
+ include ObjectidSupport
has_many :access_links, :dependent => :destroy
belongs_to :stop_area
@@ -29,11 +29,6 @@ class Chouette::AccessPoint < Chouette::ActiveRecord
[:street_name, :country_code, :comment, :long_lat_type, :zip_code, :city_name]
end
-
- def referential
- @referential ||= Referential.where(:slug => Apartment::Tenant.current).first!
- end
-
def referential
@referential ||= Referential.where(:slug => Apartment::Tenant.current).first!
end
diff --git a/app/models/chouette/company.rb b/app/models/chouette/company.rb
index 7c6f8e4f2..148329f2e 100644
--- a/app/models/chouette/company.rb
+++ b/app/models/chouette/company.rb
@@ -1,8 +1,7 @@
class Chouette::Company < Chouette::ActiveRecord
include CompanyRestrictions
- include StifCodifligneAttributesSupport
include LineReferentialSupport
- include ObjectIdFormatToReferential
+ include ObjectidSupport
has_many :lines
diff --git a/app/models/chouette/connection_link.rb b/app/models/chouette/connection_link.rb
index e225c2fae..b3d999152 100644
--- a/app/models/chouette/connection_link.rb
+++ b/app/models/chouette/connection_link.rb
@@ -1,4 +1,5 @@
class Chouette::ConnectionLink < Chouette::TridentActiveRecord
+ include ObjectidSupport
include ConnectionLinkRestrictions
# FIXME http://jira.codehaus.org/browse/JRUBY-6358
self.primary_key = "id"
diff --git a/app/models/chouette/group_of_line.rb b/app/models/chouette/group_of_line.rb
index a987d6311..006a7c039 100644
--- a/app/models/chouette/group_of_line.rb
+++ b/app/models/chouette/group_of_line.rb
@@ -1,5 +1,5 @@
class Chouette::GroupOfLine < Chouette::ActiveRecord
- include StifCodifligneAttributesSupport
+ include ObjectidSupport
include GroupOfLineRestrictions
include LineReferentialSupport
diff --git a/app/models/chouette/journey_pattern.rb b/app/models/chouette/journey_pattern.rb
index 1ba8ff61a..4503bef8b 100644
--- a/app/models/chouette/journey_pattern.rb
+++ b/app/models/chouette/journey_pattern.rb
@@ -1,185 +1,186 @@
-class Chouette::JourneyPattern < Chouette::TridentActiveRecord
- include ChecksumSupport
- include JourneyPatternRestrictions
- include ObjectIdFormatToReferential
- # FIXME http://jira.codehaus.org/browse/JRUBY-6358
- self.primary_key = "id"
-
- belongs_to :route
- has_many :vehicle_journeys, :dependent => :destroy
- has_many :vehicle_journey_at_stops, :through => :vehicle_journeys
- has_and_belongs_to_many :stop_points, -> { order("stop_points.position") }, :before_add => :vjas_add, :before_remove => :vjas_remove, :after_add => :shortcuts_update_for_add, :after_remove => :shortcuts_update_for_remove
- has_many :stop_areas, through: :stop_points
- has_many :journey_pattern_sections
- has_many :route_sections, through: :journey_pattern_sections, dependent: :destroy
-
- validates_presence_of :route
- validates_presence_of :name
-
- #validates :stop_points, length: { minimum: 2, too_short: :minimum }, on: :update
- enum section_status: { todo: 0, completed: 1, control: 2 }
-
- attr_accessor :control_checked
- after_update :control_route_sections, :unless => "control_checked"
-
-
- def local_id
- "IBOO-#{self.referential.id}-#{self.try(:route).try(:line).try(:objectid).try(:local_id)}-#{self.id}"
- end
+module Chouette
+ class JourneyPattern < Chouette::TridentActiveRecord
+ include ChecksumSupport
+ include JourneyPatternRestrictions
+ include ObjectidSupport
+ # FIXME http://jira.codehaus.org/browse/JRUBY-6358
+ self.primary_key = "id"
+
+ belongs_to :route
+ has_many :vehicle_journeys, :dependent => :destroy
+ has_many :vehicle_journey_at_stops, :through => :vehicle_journeys
+ has_and_belongs_to_many :stop_points, -> { order("stop_points.position") }, :before_add => :vjas_add, :before_remove => :vjas_remove, :after_add => :shortcuts_update_for_add, :after_remove => :shortcuts_update_for_remove
+ has_many :stop_areas, through: :stop_points
+ has_many :journey_pattern_sections
+ has_many :route_sections, through: :journey_pattern_sections, dependent: :destroy
+
+ validates_presence_of :route
+ validates_presence_of :name
+
+ #validates :stop_points, length: { minimum: 2, too_short: :minimum }, on: :update
+ enum section_status: { todo: 0, completed: 1, control: 2 }
+
+ attr_accessor :control_checked
+ after_update :control_route_sections, :unless => "control_checked"
+
+
+ def local_id
+ "IBOO-#{self.referential.id}-#{self.try(:route).try(:line).try(:objectid).try(:local_id)}-#{self.id}"
+ end
- 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 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|
- item.delete('errors')
- jp = find_by(objectid: item['object_id']) || state_create_instance(route, item)
- next if item['deletable'] && jp.persisted? && jp.destroy
- # Update attributes and stop_points associations
- jp.update_attributes(state_permited_attributes(item)) unless item['new_record']
- jp.state_stop_points_update(item) if !jp.errors.any? && jp.persisted?
- item['errors'] = jp.errors if jp.errors.any?
+ def self.state_update route, state
+ transaction do
+ state.each do |item|
+ item.delete('errors')
+ jp = find_by(objectid: item['object_id']) || state_create_instance(route, item)
+ next if item['deletable'] && jp.persisted? && jp.destroy
+ # Update attributes and stop_points associations
+ jp.update_attributes(state_permited_attributes(item)) unless item['new_record']
+ jp.state_stop_points_update(item) if !jp.errors.any? && jp.persisted?
+ item['errors'] = jp.errors if jp.errors.any?
+ end
+
+ if state.any? {|item| item['errors']}
+ state.map {|item| item.delete('object_id') if item['new_record']}
+ raise ActiveRecord::Rollback
+ end
end
- if state.any? {|item| item['errors']}
- state.map {|item| item.delete('object_id') if item['new_record']}
- raise ActiveRecord::Rollback
- end
+ state.map {|item| item.delete('new_record')}
+ state.delete_if {|item| item['deletable']}
end
- state.map {|item| item.delete('new_record')}
- state.delete_if {|item| item['deletable']}
- end
-
- def self.state_permited_attributes item
- {
- name: item['name'],
- published_name: item['published_name'],
- registration_number: item['registration_number']
- }
- end
-
- def self.state_create_instance route, item
- # Flag new record, so we can unset object_id if transaction rollback
- jp = route.journey_patterns.create(state_permited_attributes(item))
+ def self.state_permited_attributes item
+ {
+ name: item['name'],
+ published_name: item['published_name'],
+ registration_number: item['registration_number']
+ }
+ end
- # FIXME
- # DefaultAttributesSupport will trigger some weird validation on after save
- # wich will call to valid?, wich will populate errors
- # In this case, we mark jp to be valid if persisted? return true
- jp.errors.clear if jp.persisted?
+ def self.state_create_instance route, item
+ # Flag new record, so we can unset object_id if transaction rollback
+ jp = route.journey_patterns.create(state_permited_attributes(item))
- item['object_id'] = jp.objectid
- item['new_record'] = true
- jp
- end
+ # FIXME
+ # DefaultAttributesSupport will trigger some weird validation on after save
+ # wich will call to valid?, wich will populate errors
+ # In this case, we mark jp to be valid if persisted? return true
+ jp.errors.clear if jp.persisted?
- def state_stop_points_update item
- item['stop_points'].each do |sp|
- exist = stop_area_ids.include?(sp['id'])
- next if exist && sp['checked']
+ item['object_id'] = jp.objectid
+ item['new_record'] = true
+ jp
+ end
- stop_point = route.stop_points.find_by(stop_area_id: sp['id'])
- if !exist && sp['checked']
- stop_points << stop_point
- end
- if exist && !sp['checked']
- stop_points.delete(stop_point)
+ 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'])
+ if !exist && sp['checked']
+ stop_points << stop_point
+ end
+ if exist && !sp['checked']
+ stop_points.delete(stop_point)
+ end
end
end
- end
- # TODO: this a workarround
- # otherwise, we loose the first stop_point
- # when creating a new journey_pattern
- def special_update
- bck_sp = self.stop_points.map {|s| s}
- self.update_attributes :stop_points => []
- self.update_attributes :stop_points => bck_sp
- end
+ # TODO: this a workarround
+ # otherwise, we loose the first stop_point
+ # when creating a new journey_pattern
+ def special_update
+ bck_sp = self.stop_points.map {|s| s}
+ self.update_attributes :stop_points => []
+ self.update_attributes :stop_points => bck_sp
+ end
- def departure_stop_point
- return unless departure_stop_point_id
- Chouette::StopPoint.find( departure_stop_point_id)
- end
+ def departure_stop_point
+ return unless departure_stop_point_id
+ Chouette::StopPoint.find( departure_stop_point_id)
+ end
- def arrival_stop_point
- return unless arrival_stop_point_id
- Chouette::StopPoint.find( arrival_stop_point_id)
- end
+ def arrival_stop_point
+ return unless arrival_stop_point_id
+ Chouette::StopPoint.find( arrival_stop_point_id)
+ end
- def shortcuts_update_for_add( stop_point)
- stop_points << stop_point unless stop_points.include?( stop_point)
+ def shortcuts_update_for_add( stop_point)
+ stop_points << stop_point unless stop_points.include?( stop_point)
- ordered_stop_points = stop_points
- ordered_stop_points = ordered_stop_points.sort { |a,b| a.position <=> b.position} unless ordered_stop_points.empty?
+ ordered_stop_points = stop_points
+ ordered_stop_points = ordered_stop_points.sort { |a,b| a.position <=> b.position} unless ordered_stop_points.empty?
- self.update_attributes( :departure_stop_point_id => (ordered_stop_points.first && ordered_stop_points.first.id),
- :arrival_stop_point_id => (ordered_stop_points.last && ordered_stop_points.last.id))
- end
+ self.update_attributes( :departure_stop_point_id => (ordered_stop_points.first && ordered_stop_points.first.id),
+ :arrival_stop_point_id => (ordered_stop_points.last && ordered_stop_points.last.id))
+ end
- def shortcuts_update_for_remove( stop_point)
- stop_points.delete( stop_point) if stop_points.include?( stop_point)
+ def shortcuts_update_for_remove( stop_point)
+ stop_points.delete( stop_point) if stop_points.include?( stop_point)
- ordered_stop_points = stop_points
- ordered_stop_points = ordered_stop_points.sort { |a,b| a.position <=> b.position} unless ordered_stop_points.empty?
+ ordered_stop_points = stop_points
+ ordered_stop_points = ordered_stop_points.sort { |a,b| a.position <=> b.position} unless ordered_stop_points.empty?
- self.update_attributes( :departure_stop_point_id => (ordered_stop_points.first && ordered_stop_points.first.id),
- :arrival_stop_point_id => (ordered_stop_points.last && ordered_stop_points.last.id))
- end
+ self.update_attributes( :departure_stop_point_id => (ordered_stop_points.first && ordered_stop_points.first.id),
+ :arrival_stop_point_id => (ordered_stop_points.last && ordered_stop_points.last.id))
+ end
- def vjas_add( stop_point)
- return if new_record?
+ def vjas_add( stop_point)
+ return if new_record?
- vehicle_journeys.each do |vj|
- vjas = vj.vehicle_journey_at_stops.create :stop_point_id => stop_point.id
+ vehicle_journeys.each do |vj|
+ vjas = vj.vehicle_journey_at_stops.create :stop_point_id => stop_point.id
+ end
end
- end
- def vjas_remove( stop_point)
- return if new_record?
+ def vjas_remove( stop_point)
+ return if new_record?
- vehicle_journey_at_stops.where( :stop_point_id => stop_point.id).each do |vjas|
- vjas.destroy
+ vehicle_journey_at_stops.where( :stop_point_id => stop_point.id).each do |vjas|
+ vjas.destroy
+ end
end
- end
- def control_route_sections
- stop_area_ids = self.stop_points.map(&:stop_area_id)
- control_route_sections_by_stop_areas(stop_area_ids)
- end
+ def control_route_sections
+ stop_area_ids = self.stop_points.map(&:stop_area_id)
+ control_route_sections_by_stop_areas(stop_area_ids)
+ end
- def control_route_sections_by_stop_areas(stop_area_ids)
- journey_pattern_section_all
- i = 0
- to_control = false
- stop_area_ids.each_cons(2) do |a|
- jps = @route_sections_orders[i]
- i += 1
- unless jps
- to_control = true
- next
- end
- unless [jps.route_section.departure.id, jps.route_section.arrival.id] == a
- jps.destroy
- to_control = true
+ def control_route_sections_by_stop_areas(stop_area_ids)
+ journey_pattern_section_all
+ i = 0
+ to_control = false
+ stop_area_ids.each_cons(2) do |a|
+ jps = @route_sections_orders[i]
+ i += 1
+ unless jps
+ to_control = true
+ next
+ end
+ unless [jps.route_section.departure.id, jps.route_section.arrival.id] == a
+ jps.destroy
+ to_control = true
+ end
end
+ self.control_checked = true
+ to_control ? self.control! : self.completed!
end
- self.control_checked = true
- to_control ? self.control! : self.completed!
- end
- protected
+ protected
- def journey_pattern_section_all
- @route_sections_orders = {}
- self.journey_pattern_sections.all.map do |journey_pattern_section|
- @route_sections_orders[journey_pattern_section.rank] = journey_pattern_section
+ def journey_pattern_section_all
+ @route_sections_orders = {}
+ self.journey_pattern_sections.all.map do |journey_pattern_section|
+ @route_sections_orders[journey_pattern_section.rank] = journey_pattern_section
+ end
end
end
-
-end
+end \ No newline at end of file
diff --git a/app/models/chouette/line.rb b/app/models/chouette/line.rb
index 665eca779..e08eaf4d0 100644
--- a/app/models/chouette/line.rb
+++ b/app/models/chouette/line.rb
@@ -1,8 +1,7 @@
class Chouette::Line < Chouette::ActiveRecord
- include StifCodifligneAttributesSupport
include LineRestrictions
include LineReferentialSupport
- include ObjectIdFormatToReferential
+ include ObjectidSupport
extend StifTransportModeEnumerations
extend StifTransportSubmodeEnumerations
@@ -40,8 +39,6 @@ class Chouette::Line < Chouette::ActiveRecord
validates_presence_of :name
- alias_method :line_referential, :referential
-
scope :by_text, ->(text) { where('lower(name) LIKE :t or lower(published_name) LIKE :t or lower(objectid) LIKE :t or lower(comment) LIKE :t or lower(number) LIKE :t',
t: "%#{text.downcase}%") }
diff --git a/app/models/chouette/network.rb b/app/models/chouette/network.rb
index 6c8a12bda..d4c9a19dd 100644
--- a/app/models/chouette/network.rb
+++ b/app/models/chouette/network.rb
@@ -1,8 +1,7 @@
class Chouette::Network < Chouette::ActiveRecord
- include StifCodifligneAttributesSupport
include NetworkRestrictions
include LineReferentialSupport
- include ObjectIdFormatToReferential
+ include ObjectidSupport
# FIXME http://jira.codehaus.org/browse/JRUBY-6358
self.primary_key = "id"
diff --git a/app/models/chouette/objectid/netex.rb b/app/models/chouette/objectid/netex.rb
new file mode 100644
index 000000000..254ce6c6e
--- /dev/null
+++ b/app/models/chouette/objectid/netex.rb
@@ -0,0 +1,36 @@
+module Chouette
+ module Objectid
+ class Netex
+ include ActiveModel::Model
+
+ attr_accessor :provider_id, :object_type, :local_id, :creation_id
+ validates_presence_of :provider_id, :object_type, :local_id, :creation_id
+
+ def initialize(**attributes)
+ @provider_id ||= 'chouette'
+ @object_type = attributes[:object_type]
+ @local_id = attributes[:local_id]
+ @creation_id ||= 'LOC'
+ end
+
+ @@format = /^([A-Za-z_-]+):([A-Za-z]+):([0-9A-Za-z_-]+):([A-Za-z]+)$/
+ cattr_reader :format
+
+ def to_s
+ "#{self.provider_id}:#{self.object_type}:#{self.local_id}:#{self.creation_id}"
+ end
+
+ def parts
+ self.to_s.match(format).try(:captures)
+ end
+
+ def valid?
+ parts.present?
+ end
+
+ def short_id
+ local_id
+ end
+ end
+ end
+end
diff --git a/app/models/chouette/objectid/stif_codifligne.rb b/app/models/chouette/objectid/stif_codifligne.rb
new file mode 100644
index 000000000..9d83a1432
--- /dev/null
+++ b/app/models/chouette/objectid/stif_codifligne.rb
@@ -0,0 +1,25 @@
+module Chouette
+ module Objectid
+ class StifCodifligne < Chouette::Objectid::Netex
+
+ attr_accessor :sync_id
+ validates_presence_of :sync_id
+ validates :creation_id, presence: false
+
+ @@format = /^([A-Za-z_]+):([A-Za-z]+):([A-Za-z]+):([0-9A-Za-z_-]+)$/
+
+ def initialize(**attributes)
+ @provider_id = attributes[:provider_id]
+ @object_type = attributes[:object_type]
+ @local_id = attributes[:local_id]
+ @sync_id = attributes[:sync_id]
+ super
+ end
+
+ def to_s
+ "#{self.provider_id}:#{self.sync_id}:#{self.object_type}:#{self.local_id}"
+ end
+
+ end
+ end
+end
diff --git a/app/models/chouette/objectid/stif_netex.rb b/app/models/chouette/objectid/stif_netex.rb
new file mode 100644
index 000000000..e9d40a00f
--- /dev/null
+++ b/app/models/chouette/objectid/stif_netex.rb
@@ -0,0 +1,15 @@
+module Chouette
+ module Objectid
+ class StifNetex < Chouette::Objectid::Netex
+
+ def initialize(**attributes)
+ @provider_id = 'stif'
+ super
+ end
+
+ def short_id
+ local_id.try(:split, "-").try(:[], -1)
+ end
+ end
+ end
+end
diff --git a/app/models/chouette/objectid/stif_reflex.rb b/app/models/chouette/objectid/stif_reflex.rb
new file mode 100644
index 000000000..1ea3ec0ce
--- /dev/null
+++ b/app/models/chouette/objectid/stif_reflex.rb
@@ -0,0 +1,24 @@
+module Chouette
+ module Objectid
+ class StifReflex < Chouette::Objectid::Netex
+
+ attr_accessor :country_code, :zip_code
+ validates_presence_of :country_code, :zip_code
+ validates :creation_id, presence: false
+
+ @@format = /^([A-Za-z_]+):([0-9A-Za-z_-]+):([A-Za-z]+):([0-9A-Za-z_-]+):([A-Za-z]+)$/
+
+ def initialize(**attributes)
+ @provider_id = attributes[:provider_id]
+ @country_code = attributes[:country_code]
+ @zip_code = attributes[:zip_code]
+ super
+ end
+
+ def to_s
+ "#{self.country_code}:#{self.zip_code}:#{self.object_type}:#{self.local_id}:#{self.provider_id}"
+ end
+
+ end
+ end
+end
diff --git a/app/models/chouette/objectid_formater/netex.rb b/app/models/chouette/objectid_formater/netex.rb
new file mode 100644
index 000000000..0736b6ff9
--- /dev/null
+++ b/app/models/chouette/objectid_formater/netex.rb
@@ -0,0 +1,18 @@
+module Chouette
+ module ObjectidFormater
+ class Netex
+ def before_validation(model)
+ model.objectid ||= Chouette::Objectid::Netex.new(local_id: SecureRandom.uuid, object_type: model.class.name.gsub(/Chouette::/,'')).to_s
+ end
+
+ def after_commit(model)
+ # unused method in this context
+ end
+
+ def parse_objectid(definition)
+ parts = definition.split(":")
+ Chouette::Objectid::Netex.new(provider_id: parts[0], object_type: parts[1], local_id: parts[2], creation_id: parts[3]).to_s rescue nil
+ end
+ end
+ end
+end \ No newline at end of file
diff --git a/app/models/chouette/objectid_formater/stif_codifligne.rb b/app/models/chouette/objectid_formater/stif_codifligne.rb
new file mode 100644
index 000000000..53fd28c82
--- /dev/null
+++ b/app/models/chouette/objectid_formater/stif_codifligne.rb
@@ -0,0 +1,18 @@
+module Chouette
+ module ObjectidFormater
+ class StifCodifligne
+ def before_validation(model)
+ # unused method in this context
+ end
+
+ def after_commit(model)
+ # unused method in this context
+ end
+
+ def parse_objectid(definition)
+ parts = definition.split(":")
+ Chouette::Objectid::StifCodifligne.new(provider_id: parts[0], sync_id: parts[1], object_type: parts[2], local_id: parts[3]).to_s rescue nil
+ end
+ end
+ end
+end \ No newline at end of file
diff --git a/app/models/chouette/objectid_formater/stif_netex.rb b/app/models/chouette/objectid_formater/stif_netex.rb
new file mode 100644
index 000000000..88995dd05
--- /dev/null
+++ b/app/models/chouette/objectid_formater/stif_netex.rb
@@ -0,0 +1,20 @@
+module Chouette
+ module ObjectidFormater
+ class StifNetex
+ def before_validation(model)
+ model.objectid ||= "__pending_id__#{rand(50)+ rand(50)}"
+ end
+
+ def after_commit(model)
+ if model.objectid.include? ':__pending_id__'
+ model.objectid = Chouette::Objectid::StifNetex.new(provider_id: "stif", object_type: model.class.name.gsub(/Chouette::/,''), local_id: model.local_id).to_s
+ end
+ end
+
+ def parse_objectid(definition)
+ parts = definition.split(":")
+ Chouette::Objectid::StifNetex.new(provider_id: parts[0], object_type: parts[1], local_id: parts[2], creation_id: parts[3]).to_s rescue nil
+ end
+ end
+ end
+end \ No newline at end of file
diff --git a/app/models/chouette/objectid_formater/stif_reflex.rb b/app/models/chouette/objectid_formater/stif_reflex.rb
new file mode 100644
index 000000000..e6c6a6a70
--- /dev/null
+++ b/app/models/chouette/objectid_formater/stif_reflex.rb
@@ -0,0 +1,18 @@
+module Chouette
+ module ObjectidFormater
+ class StifReflex
+ def before_validation(model)
+ # unused method in this context
+ end
+
+ def after_commit(model)
+ # unused method in this context
+ end
+
+ def parse_objectid(definition)
+ parts = definition.split(":")
+ Chouette::Objectid::StifReflex.new(country_code: parts[0], zip_code: parts[1], object_type: parts[2], local_id: parts[3], provider_id: parts[4]).to_s rescue nil
+ end
+ end
+ end
+end \ No newline at end of file
diff --git a/app/models/chouette/route.rb b/app/models/chouette/route.rb
index d0c1adf1c..853ecee85 100644
--- a/app/models/chouette/route.rb
+++ b/app/models/chouette/route.rb
@@ -1,7 +1,7 @@
class Chouette::Route < Chouette::TridentActiveRecord
include RouteRestrictions
include ChecksumSupport
- include ObjectIdFormatToReferential
+ include ObjectidSupport
extend Enumerize
extend ActiveModel::Naming
diff --git a/app/models/chouette/routing_constraint_zone.rb b/app/models/chouette/routing_constraint_zone.rb
index 124884830..5f6e5affd 100644
--- a/app/models/chouette/routing_constraint_zone.rb
+++ b/app/models/chouette/routing_constraint_zone.rb
@@ -1,6 +1,6 @@
class Chouette::RoutingConstraintZone < Chouette::TridentActiveRecord
include ChecksumSupport
- include ObjectIdFormatToReferential
+ include ObjectidSupport
belongs_to :route
has_array_of :stop_points, class_name: 'Chouette::StopPoint'
diff --git a/app/models/chouette/stop_area.rb b/app/models/chouette/stop_area.rb
index 7872581cb..513eb4d48 100644
--- a/app/models/chouette/stop_area.rb
+++ b/app/models/chouette/stop_area.rb
@@ -6,10 +6,11 @@ class Chouette::StopArea < Chouette::ActiveRecord
self.primary_key = "id"
include Geokit::Mappable
- include StifReflexAttributesSupport
+ # include StifReflexAttributesSupport
include ProjectionFields
include StopAreaRestrictions
include StopAreaReferentialSupport
+ include ObjectidSupport
extend Enumerize
enumerize :area_type, in: %i(zdep zder zdlp zdlr lda)
@@ -26,8 +27,6 @@ class Chouette::StopArea < Chouette::ActiveRecord
belongs_to :stop_area_referential
validates_presence_of :stop_area_referential_id
- alias_method :stop_area_referential, :referential
-
acts_as_tree :foreign_key => 'parent_id', :order => "name"
attr_accessor :stop_area_type
@@ -63,10 +62,6 @@ class Chouette::StopArea < Chouette::ActiveRecord
end
end
- def objectid_format
- "#{self.stop_area_referential.objectid_format}_attributes_support".camelcase.constantize if self.stop_area_referential.objectid_format
- end
-
def coordinates
@coordinates || combine_lat_lng
end
diff --git a/app/models/chouette/stop_point.rb b/app/models/chouette/stop_point.rb
index c4034e2d4..2c7bb3355 100644
--- a/app/models/chouette/stop_point.rb
+++ b/app/models/chouette/stop_point.rb
@@ -7,7 +7,7 @@ module Chouette
include ForBoardingEnumerations
include ForAlightingEnumerations
- include ObjectIdFormatToReferential
+ include ObjectidSupport
# FIXME http://jira.codehaus.org/browse/JRUBY-6358
self.primary_key = "id"
@@ -19,7 +19,6 @@ module Chouette
acts_as_list :scope => :route, top_of_list: 0
- validates_presence_of :objectid_format
validates_presence_of :stop_area
validate :stop_area_id_validation
diff --git a/app/models/chouette/time_table.rb b/app/models/chouette/time_table.rb
index 6572dbfe4..a17fb5799 100644
--- a/app/models/chouette/time_table.rb
+++ b/app/models/chouette/time_table.rb
@@ -1,7 +1,7 @@
class Chouette::TimeTable < Chouette::TridentActiveRecord
include ChecksumSupport
include TimeTableRestrictions
- include ObjectIdFormatToReferential
+ include ObjectidSupport
# FIXME http://jira.codehaus.org/browse/JRUBY-6358
self.primary_key = "id"
diff --git a/app/models/chouette/trident_active_record.rb b/app/models/chouette/trident_active_record.rb
index e8223e3d6..f2d654efc 100644
--- a/app/models/chouette/trident_active_record.rb
+++ b/app/models/chouette/trident_active_record.rb
@@ -1,5 +1,4 @@
class Chouette::TridentActiveRecord < Chouette::ActiveRecord
- include StifNetexAttributesSupport
self.abstract_class = true
diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb
index 5e1b76ceb..1cb2d7045 100644
--- a/app/models/chouette/vehicle_journey.rb
+++ b/app/models/chouette/vehicle_journey.rb
@@ -2,7 +2,7 @@ module Chouette
class VehicleJourney < TridentActiveRecord
include ChecksumSupport
include VehicleJourneyRestrictions
- include ObjectIdFormatToReferential
+ include ObjectidSupport
extend StifTransportModeEnumerations
# FIXME http://jira.codehaus.org/browse/JRUBY-6358
self.primary_key = "id"
diff --git a/app/models/concerns/objectid_formater_support.rb b/app/models/concerns/objectid_formater_support.rb
new file mode 100644
index 000000000..1064b156f
--- /dev/null
+++ b/app/models/concerns/objectid_formater_support.rb
@@ -0,0 +1,15 @@
+module ObjectidFormaterSupport
+ extend ActiveSupport::Concern
+
+ included do
+ validates_presence_of :objectid_formater_class
+
+ def objectid_formater
+ objectid_formater_class.new
+ end
+
+ def objectid_formater_class
+ "Chouette::ObjectidFormater::#{read_attribute(:objectid_format).camelcase}".constantize if read_attribute(:objectid_format)
+ end
+ end
+end \ No newline at end of file
diff --git a/app/models/concerns/objectid_support.rb b/app/models/concerns/objectid_support.rb
new file mode 100644
index 000000000..1c8bdf751
--- /dev/null
+++ b/app/models/concerns/objectid_support.rb
@@ -0,0 +1,26 @@
+module ObjectidSupport
+ extend ActiveSupport::Concern
+
+ included do
+ before_validation :before_validation_objectid
+ after_commit :after_commit_objectid
+ validates_presence_of :objectid_format, :objectid
+ validates_uniqueness_of :objectid
+
+ def before_validation_objectid
+ self.referential.objectid_formater.before_validation self
+ end
+
+ def after_commit_objectid
+ self.referential.objectid_formater.after_commit self
+ end
+
+ def objectid
+ self.referential.objectid_formater.parse_objectid read_attribute(:objectid) if objectid_format && read_attribute(:objectid)
+ end
+
+ def objectid_format
+ self.referential.objectid_format
+ end
+ end
+end \ No newline at end of file
diff --git a/app/models/line_referential.rb b/app/models/line_referential.rb
index d81644080..90a045935 100644
--- a/app/models/line_referential.rb
+++ b/app/models/line_referential.rb
@@ -1,4 +1,5 @@
class LineReferential < ActiveRecord::Base
+ include ObjectidFormaterSupport
extend StifTransportModeEnumerations
extend Enumerize
@@ -10,8 +11,7 @@ class LineReferential < ActiveRecord::Base
has_many :networks, class_name: 'Chouette::Network'
has_many :line_referential_syncs, -> { order created_at: :desc }
has_many :workbenches
- enumerize :objectid_format, in: %w(netex stif_netex)
- validates_presence_of :objectid_format
+ enumerize :objectid_format, in: %w(netex stif_netex stif_reflex stif_codifligne)
def add_member(organisation, options = {})
attributes = options.merge organisation: organisation
@@ -22,6 +22,7 @@ class LineReferential < ActiveRecord::Base
validates :sync_interval, presence: true
# need to define precise validation rules
validates_inclusion_of :sync_interval, :in => 1..30
+ validates_presence_of :objectid_format
def operating_lines
lines.where(deactivated: false)
diff --git a/app/models/referential.rb b/app/models/referential.rb
index 87ac61f56..04b5e3102 100644
--- a/app/models/referential.rb
+++ b/app/models/referential.rb
@@ -1,10 +1,12 @@
class Referential < ActiveRecord::Base
include DataFormatEnumerations
+ include ObjectidFormaterSupport
extend Enumerize
validates_presence_of :name
validates_presence_of :slug
validates_presence_of :prefix
+ validates_presence_of :objectid_format
# Fixme #3657
# validates_presence_of :time_zone
# validates_presence_of :upper_corner
@@ -54,8 +56,7 @@ class Referential < ActiveRecord::Base
belongs_to :referential_suite
- enumerize :objectid_format, in: %w(netex stif_netex)
- validates_presence_of :objectid_format
+ enumerize :objectid_format, in: %w(netex stif_netex stif_reflex stif_codifligne)
scope :ready, -> { where(ready: true) }
scope :in_periode, ->(periode) { where(id: referential_ids_in_periode(periode)) }
diff --git a/app/models/stop_area_referential.rb b/app/models/stop_area_referential.rb
index 2ef1278d8..1e544e116 100644
--- a/app/models/stop_area_referential.rb
+++ b/app/models/stop_area_referential.rb
@@ -1,12 +1,13 @@
class StopAreaReferential < ActiveRecord::Base
extend Enumerize
+ include ObjectidFormaterSupport
has_many :stop_area_referential_memberships
has_many :organisations, through: :stop_area_referential_memberships
has_many :stop_areas, class_name: 'Chouette::StopArea'
has_many :stop_area_referential_syncs, -> {order created_at: :desc}
has_many :workbenches
- enumerize :objectid_format, in: %w(netex stif_netex)
+ enumerize :objectid_format, in: %w(netex stif_netex stif_reflex stif_codifligne)
validates_presence_of :objectid_format
def add_member(organisation, options = {})
diff --git a/app/models/workbench.rb b/app/models/workbench.rb
index 8a48b0f9f..5c8bfa782 100644
--- a/app/models/workbench.rb
+++ b/app/models/workbench.rb
@@ -1,11 +1,11 @@
class Workbench < ActiveRecord::Base
+ include ObjectidFormaterSupport
extend Enumerize
belongs_to :organisation
belongs_to :line_referential
belongs_to :stop_area_referential
belongs_to :output, class_name: 'ReferentialSuite'
- enumerize :objectid_format, in: %w(netex stif_netex)
- validates_presence_of :objectid_format
+ enumerize :objectid_format, in: %w(netex stif_netex stif_reflex stif_codifligne)
has_many :lines, -> (workbench) { Stif::MyWorkbenchScopes.new(workbench).line_scope(self) }, through: :line_referential
has_many :networks, through: :line_referential
@@ -20,6 +20,7 @@ class Workbench < ActiveRecord::Base
validates :name, presence: true
validates :organisation, presence: true
validates :output, presence: true
+ validates_presence_of :objectid_format
has_many :referentials
has_many :referential_metadatas, through: :referentials, source: :metadatas