ninoxe 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +3 -0
  3. data/Rakefile +49 -0
  4. data/app/assets/javascripts/ninoxe/application.js +15 -0
  5. data/app/assets/stylesheets/ninoxe/application.css +13 -0
  6. data/app/controllers/ninoxe/application_controller.rb +4 -0
  7. data/app/helpers/ninoxe/application_helper.rb +4 -0
  8. data/app/models/chouette/access_link.rb +63 -0
  9. data/app/models/chouette/access_point.rb +145 -0
  10. data/app/models/chouette/access_point_type.rb +50 -0
  11. data/app/models/chouette/active_record.rb +66 -0
  12. data/app/models/chouette/area_type.rb +56 -0
  13. data/app/models/chouette/chouette_structure.dump +3417 -0
  14. data/app/models/chouette/command.rb +93 -0
  15. data/app/models/chouette/command_line_support.rb +35 -0
  16. data/app/models/chouette/company.rb +19 -0
  17. data/app/models/chouette/connection_link.rb +43 -0
  18. data/app/models/chouette/connection_link_type.rb +51 -0
  19. data/app/models/chouette/direction.rb +60 -0
  20. data/app/models/chouette/exporter.rb +32 -0
  21. data/app/models/chouette/file_validator.rb +47 -0
  22. data/app/models/chouette/group_of_line.rb +30 -0
  23. data/app/models/chouette/journey_pattern.rb +63 -0
  24. data/app/models/chouette/line.rb +65 -0
  25. data/app/models/chouette/link_orientation_type.rb +49 -0
  26. data/app/models/chouette/loader.rb +110 -0
  27. data/app/models/chouette/network.rb +33 -0
  28. data/app/models/chouette/object_id.rb +36 -0
  29. data/app/models/chouette/pt_link.rb +39 -0
  30. data/app/models/chouette/route.rb +158 -0
  31. data/app/models/chouette/stop_area.rb +273 -0
  32. data/app/models/chouette/stop_point.rb +33 -0
  33. data/app/models/chouette/time_table.rb +146 -0
  34. data/app/models/chouette/time_table_date.rb +14 -0
  35. data/app/models/chouette/time_table_period.rb +26 -0
  36. data/app/models/chouette/time_table_vehicle_journey.rb +5 -0
  37. data/app/models/chouette/transport_mode.rb +71 -0
  38. data/app/models/chouette/trident_active_record.rb +97 -0
  39. data/app/models/chouette/vehicle_journey.rb +101 -0
  40. data/app/models/chouette/vehicle_journey_at_stop.rb +45 -0
  41. data/app/models/chouette/wayback.rb +50 -0
  42. data/app/views/layouts/ninoxe/application.html.erb +14 -0
  43. data/config/database.yml +9 -0
  44. data/config/database.yml.ci +14 -0
  45. data/config/database.yml.travis +9 -0
  46. data/config/locales/en.yml +15 -0
  47. data/config/locales/fr.yml +16 -0
  48. data/config/routes.rb +2 -0
  49. data/db/migrate/20120213131553_create_chouette_line.rb +26 -0
  50. data/db/migrate/20120214101458_create_chouette_company.rb +25 -0
  51. data/db/migrate/20120214101645_create_chouette_ptnetwork.rb +24 -0
  52. data/db/migrate/20120406144221_create_chouette_stop_area.rb +33 -0
  53. data/db/migrate/20120411144209_create_time_table.rb +38 -0
  54. data/db/migrate/20120425064403_create_chouette_route.rb +22 -0
  55. data/db/migrate/20120425123944_create_chouette_stop_point.rb +17 -0
  56. data/db/migrate/20120426114527_create_chouette_connection_link.rb +28 -0
  57. data/db/migrate/20120521073709_create_chouette_journey_pattern.rb +26 -0
  58. data/db/migrate/20120521073723_create_chouette_journey_pattern_stop_point.rb +14 -0
  59. data/db/migrate/20120521073740_create_chouette_time_slot.rb +22 -0
  60. data/db/migrate/20120521073746_create_chouette_vehicle_journey.rb +34 -0
  61. data/db/migrate/20120521073758_create_chouette_vehicle_journey_at_stop.rb +25 -0
  62. data/db/migrate/20120521073900_create_chouette_time_table_vehicle_journey.rb +16 -0
  63. data/db/migrate/20120521132304_create_chouette_access_point.rb +34 -0
  64. data/db/migrate/20120521132313_create_chouette_access_link.rb +33 -0
  65. data/db/migrate/20120521132429_create_chouette_facility.rb +34 -0
  66. data/db/migrate/20120521132502_create_chouette_facility_feature.rb +12 -0
  67. data/db/migrate/20120521132551_create_chouette_group_of_line.rb +18 -0
  68. data/db/migrate/20120521132600_create_chouette_group_of_line_line.rb +12 -0
  69. data/db/migrate/20120521132656_create_chouette_routing_constrains_line.rb +12 -0
  70. data/db/migrate/20120521132724_create_chouette_stoparea_stoparea.rb +12 -0
  71. data/db/migrate/20120531091529_create_chouette_pt_link.rb +21 -0
  72. data/db/migrate/20120926141405_add_id_to_time_table_date.rb +12 -0
  73. data/db/migrate/20120926141415_add_id_to_time_table_period.rb +12 -0
  74. data/db/migrate/20121024072219_add_fields_to_access_points.rb +12 -0
  75. data/lib/chouette_factories.rb +1 -0
  76. data/lib/factories/chouette_access_links.rb +11 -0
  77. data/lib/factories/chouette_access_points.rb +8 -0
  78. data/lib/factories/chouette_companies.rb +5 -0
  79. data/lib/factories/chouette_connection_links.rb +11 -0
  80. data/lib/factories/chouette_group_of_lines.rb +4 -0
  81. data/lib/factories/chouette_journey_pattern.rb +32 -0
  82. data/lib/factories/chouette_lines.rb +20 -0
  83. data/lib/factories/chouette_networks.rb +5 -0
  84. data/lib/factories/chouette_routes.rb +18 -0
  85. data/lib/factories/chouette_stop_areas.rb +8 -0
  86. data/lib/factories/chouette_stop_points.rb +7 -0
  87. data/lib/factories/chouette_time_table.rb +21 -0
  88. data/lib/factories/chouette_vehicle_journey.rb +50 -0
  89. data/lib/factories/chouette_vehicle_journey_at_stop.rb +5 -0
  90. data/lib/ninoxe/engine.rb +15 -0
  91. data/lib/ninoxe/version.rb +3 -0
  92. data/lib/ninoxe.rb +7 -0
  93. metadata +251 -0
@@ -0,0 +1,93 @@
1
+ require 'tmpdir'
2
+
3
+ #if RUBY_PLATFORM == "java"
4
+ # FIXME disable remove_entry_secure because incompatible with jruby ?!
5
+ # See http://jira.codehaus.org/browse/JRUBY-4082
6
+ module FileUtils
7
+ def self.remove_entry_secure(*args)
8
+ self.remove_entry *args
9
+ end
10
+ end
11
+ #end
12
+
13
+ class Chouette::Command
14
+
15
+ include Chouette::CommandLineSupport
16
+
17
+ @@command = "chouette"
18
+ cattr_accessor :command
19
+
20
+ attr_accessor :database, :schema, :host, :user, :password
21
+
22
+ def initialize(options = {})
23
+ database_options_from_active_record.merge(options).each do |k,v|
24
+ send "#{k}=", v
25
+ end
26
+ end
27
+
28
+ def database_options_from_active_record
29
+ config = Chouette::ActiveRecord.connection_pool.spec.config
30
+ {
31
+ :database => config[:database],
32
+ :user => config[:username],
33
+ :password => config[:password],
34
+ :host => (config[:host] or "localhost")
35
+ }
36
+ end
37
+
38
+
39
+ def run!(options = {})
40
+ Dir.mktmpdir do |config_dir|
41
+ chouette_properties = File.join(config_dir, "chouette.properties")
42
+ open(chouette_properties, "w") do |f|
43
+ f.puts "database.name = #{database}"
44
+ f.puts "database.schema = #{schema}"
45
+ #f.puts "database.showsql = true"
46
+ f.puts "hibernate.username = #{user}"
47
+ f.puts "hibernate.password = #{password}"
48
+ f.puts "jdbc.url=jdbc:postgresql://#{host}:5432/#{database}"
49
+ f.puts "jdbc.username = #{user}"
50
+ f.puts "jdbc.password = #{password}"
51
+ f.puts "database.hbm2ddl.auto=update"
52
+ end
53
+
54
+ logger.debug "Chouette properties: #{File.readlines(chouette_properties).collect(&:strip).join(', ')}"
55
+
56
+ command_line = "#{command} -classpath #{config_dir} #{command_options(options)}"
57
+ logger.debug "Execute '#{command_line}'"
58
+
59
+ execute! command_line
60
+ end
61
+ end
62
+
63
+ class Option
64
+
65
+ attr_accessor :key, :value
66
+
67
+ def initialize(key, value)
68
+ @key, @value = key.to_s, value
69
+ end
70
+
71
+ def command_key
72
+ key.camelize(:lower)
73
+ end
74
+
75
+ def to_s
76
+ unless value == true
77
+ "-#{command_key} #{value}"
78
+ else
79
+ "-#{command_key}"
80
+ end
81
+ end
82
+
83
+ end
84
+
85
+ def command_options(options)
86
+ options.collect do |key, value|
87
+ Option.new(key, value)
88
+ end.sort_by(&:key).join(' ')
89
+ end
90
+
91
+
92
+
93
+ end
@@ -0,0 +1,35 @@
1
+ module Chouette::CommandLineSupport
2
+
3
+ class ExecutionError < StandardError; end
4
+
5
+ def available_loggers
6
+ [].tap do |logger|
7
+ logger << Chouette::ActiveRecord.logger
8
+ logger << Rails.logger if defined?(Rails)
9
+ logger << Logger.new($stdout)
10
+ end.compact
11
+ end
12
+
13
+ def logger
14
+ @logger ||= available_loggers.first
15
+ end
16
+
17
+ def max_output_length
18
+ 2000
19
+ end
20
+
21
+ def execute!(command)
22
+ logger.debug "execute '#{command}'"
23
+
24
+ output = `#{command} 2>&1`
25
+ output = "[...] #{output[-max_output_length,max_output_length]}" if output.length > max_output_length
26
+ logger.info output unless output.empty?
27
+
28
+ if $? != 0
29
+ raise ExecutionError.new("Command failed: #{command} (error code #{$?})")
30
+ end
31
+
32
+ true
33
+ end
34
+
35
+ end
@@ -0,0 +1,19 @@
1
+ class Chouette::Company < Chouette::TridentActiveRecord
2
+ has_many :lines
3
+
4
+ validates_presence_of :registration_number
5
+ validates_uniqueness_of :registration_number
6
+ validates_format_of :registration_number, :with => %r{\A[0-9A-Za-z_-]+\Z}
7
+
8
+ validates_presence_of :name
9
+
10
+ attr_accessible :objectid, :object_version, :creation_time, :creator_id, :name, :short_name
11
+ attr_accessible :organizational_unit, :operating_department_name, :code, :phone, :fax, :email, :registration_number
12
+
13
+ def self.nullable_attributes
14
+ [:organizational_unit, :operating_department_name, :code, :phone, :fax, :email]
15
+ end
16
+
17
+
18
+ end
19
+
@@ -0,0 +1,43 @@
1
+ class Chouette::ConnectionLink < Chouette::TridentActiveRecord
2
+ # FIXME http://jira.codehaus.org/browse/JRUBY-6358
3
+ set_primary_key :id
4
+
5
+ attr_accessor :connection_link_type
6
+
7
+ attr_accessible :connection_link_type,:departure_id, :arrival_id, :objectid, :object_version, :creation_time, :creator_id, :name, :comment
8
+ attr_accessible :link_distance, :link_type, :default_duration, :frequent_traveller_duration, :occasional_traveller_duration
9
+ attr_accessible :mobility_restricted_traveller_duration, :mobility_restricted_suitability, :stairs_availability, :lift_availability, :int_user_needs
10
+
11
+ belongs_to :departure, :class_name => 'Chouette::StopArea'
12
+ belongs_to :arrival, :class_name => 'Chouette::StopArea'
13
+
14
+ validates_presence_of :name
15
+ validates_presence_of :link_type
16
+
17
+ def connection_link_type
18
+ link_type && Chouette::ConnectionLinkType.new( link_type.underscore)
19
+ end
20
+
21
+ def connection_link_type=(connection_link_type)
22
+ self.link_type = (connection_link_type ? connection_link_type.camelcase : nil)
23
+ end
24
+
25
+ @@connection_link_types = nil
26
+ def self.connection_link_types
27
+ @@connection_link_types ||= Chouette::ConnectionLinkType.all
28
+ end
29
+
30
+ def possible_areas
31
+ Chouette::StopArea.where("area_type != 'ITL'")
32
+ end
33
+
34
+ def stop_areas
35
+ Chouette::StopArea.where(:id => [self.departure_id,self.arrival_id])
36
+ end
37
+
38
+ def geometry
39
+ GeoRuby::SimpleFeatures::LineString.from_points( [ departure.geometry, arrival.geometry], 4326) if departure.geometry and arrival.geometry
40
+ end
41
+
42
+ end
43
+
@@ -0,0 +1,51 @@
1
+ class Chouette::ConnectionLinkType < ActiveSupport::StringInquirer
2
+
3
+ def initialize(text_code, numerical_code)
4
+ super text_code.to_s
5
+ @numerical_code = numerical_code
6
+ end
7
+
8
+ def self.new(text_code, numerical_code = nil)
9
+ if text_code and numerical_code
10
+ super
11
+ elsif self === text_code
12
+ text_code
13
+ else
14
+ if Fixnum === text_code
15
+ text_code, numerical_code = definitions.rassoc(text_code)
16
+ else
17
+ text_code, numerical_code = definitions.assoc(text_code.to_s)
18
+ end
19
+
20
+ super text_code, numerical_code
21
+ end
22
+ end
23
+
24
+ def to_i
25
+ @numerical_code
26
+ end
27
+
28
+ def inspect
29
+ "#{to_s}/#{to_i}"
30
+ end
31
+
32
+ def name
33
+ camelize
34
+ end
35
+
36
+ @@definitions = [
37
+ ["underground", 0],
38
+ ["mixed", 1],
39
+ ["overground", 2]
40
+ ]
41
+ cattr_reader :definitions
42
+
43
+ @@all = nil
44
+ def self.all
45
+ @@all ||= definitions.collect do |text_code, numerical_code|
46
+ new(text_code, numerical_code)
47
+ end
48
+ end
49
+
50
+ end
51
+
@@ -0,0 +1,60 @@
1
+ class Chouette::Direction < ActiveSupport::StringInquirer
2
+
3
+ def initialize(text_code, numerical_code)
4
+ super text_code.to_s
5
+ @numerical_code = numerical_code
6
+ end
7
+
8
+ def self.new(text_code, numerical_code = nil)
9
+ if text_code and numerical_code
10
+ super
11
+ elsif self === text_code
12
+ text_code
13
+ else
14
+ if Fixnum === text_code
15
+ text_code, numerical_code = definitions.rassoc(text_code)
16
+ else
17
+ text_code, numerical_code = definitions.assoc(text_code.to_s)
18
+ end
19
+
20
+ super text_code, numerical_code
21
+ end
22
+ end
23
+
24
+ def to_i
25
+ @numerical_code
26
+ end
27
+
28
+ def inspect
29
+ "#{to_s}/#{to_i}"
30
+ end
31
+
32
+ def name
33
+ to_s
34
+ end
35
+
36
+ @@definitions = [
37
+ ["straight_forward", 0],
38
+ ["backward", 1],
39
+ ["clock_wise", 2],
40
+ ["counter_clock_wise", 3],
41
+ ["north", 4],
42
+ ["north_west", 5],
43
+ ["west", 6],
44
+ ["south_west", 7],
45
+ ["south", 8],
46
+ ["south_east", 9],
47
+ ["east", 10],
48
+ ["north_east", 11]
49
+ ]
50
+ cattr_reader :definitions
51
+
52
+ @@all = nil
53
+ def self.all
54
+ @@all ||= definitions.collect do |text_code, numerical_code|
55
+ new(text_code, numerical_code)
56
+ end
57
+ end
58
+
59
+ end
60
+
@@ -0,0 +1,32 @@
1
+ class Chouette::Exporter
2
+
3
+ attr_reader :schema
4
+
5
+ def initialize(schema)
6
+ @schema = schema
7
+ end
8
+
9
+ def chouette_command
10
+ @chouette_command ||= Chouette::Command.new(:schema => schema)
11
+ end
12
+
13
+ def export(file, options = {})
14
+ options = {
15
+ :format => :neptune
16
+ }.merge(options)
17
+
18
+ command_options = {
19
+ :c => "export",
20
+ :o => "line",
21
+ :format => options.delete(:format).to_s.upcase,
22
+ :output_file => File.expand_path(file),
23
+ :optimize_memory => true
24
+ }.merge(options)
25
+
26
+ logger.info "Export #{file} in schema #{schema}"
27
+ chouette_command.run! command_options
28
+ end
29
+
30
+ include Chouette::CommandLineSupport
31
+
32
+ end
@@ -0,0 +1,47 @@
1
+ class Chouette::FileValidator
2
+
3
+ attr_reader :schema, :database, :user, :password, :host
4
+
5
+ def initialize(schema)
6
+ @schema = schema
7
+
8
+ Chouette::ActiveRecord.connection_pool.spec.config.tap do |config|
9
+ @database = config[:database]
10
+ @user = config[:username]
11
+ @password = config[:password]
12
+ @host = (config[:host] or "localhost")
13
+ end
14
+ end
15
+
16
+ def self.chouette_command=(command)
17
+ Chouette::Command.command = command
18
+ end
19
+
20
+ class << self
21
+ deprecate :chouette_command= => "Use Chouette::Command.command ="
22
+ end
23
+
24
+ def chouette_command
25
+ @chouette_command ||= Chouette::Command.new(:schema => schema)
26
+ end
27
+
28
+ def validate(file, options = {})
29
+ options = {
30
+ :format => :neptune
31
+ }.merge(options)
32
+
33
+ command_options = {
34
+ :c => "validate",
35
+ :o => "line",
36
+ :input_file => File.expand_path(file),
37
+ :optimize_memory => true
38
+ }.merge(options)
39
+
40
+ logger.info "Validate #{file}"
41
+ chouette_command.run! command_options
42
+ end
43
+
44
+
45
+ include Chouette::CommandLineSupport
46
+
47
+ end
@@ -0,0 +1,30 @@
1
+ class Chouette::GroupOfLine < Chouette::TridentActiveRecord
2
+ # FIXME http://jira.codehaus.org/browse/JRUBY-6358
3
+ set_primary_key :id
4
+
5
+ has_and_belongs_to_many :lines, :class_name => 'Chouette::Line', :order => 'lines.name'
6
+
7
+ validates_presence_of :name
8
+
9
+ attr_accessible :objectid, :object_version, :creation_time, :creator_id, :name, :comment, :lines
10
+ attr_accessible :line_tokens
11
+ attr_reader :line_tokens
12
+
13
+ def self.nullable_attributes
14
+ [:comment]
15
+ end
16
+
17
+ def commercial_stop_areas
18
+ Chouette::StopArea.joins(:children => [:stop_points => [:route => [:line => :group_of_lines] ] ]).where(:group_of_lines => {:id => self.id}).uniq
19
+ end
20
+
21
+ def stop_areas
22
+ Chouette::StopArea.joins(:stop_points => [:route => [:line => :group_of_lines] ]).where(:group_of_lines => {:id => self.id})
23
+ end
24
+
25
+ def line_tokens=(ids)
26
+ self.line_ids = ids.split(",")
27
+ end
28
+
29
+ end
30
+
@@ -0,0 +1,63 @@
1
+ class Chouette::JourneyPattern < Chouette::TridentActiveRecord
2
+ # FIXME http://jira.codehaus.org/browse/JRUBY-6358
3
+ set_primary_key :id
4
+
5
+ belongs_to :route
6
+ has_many :vehicle_journeys, :dependent => :destroy
7
+ has_many :vehicle_journey_at_stops, :through => :vehicle_journeys
8
+ has_and_belongs_to_many :stop_points, :class_name => 'Chouette::StopPoint', :order => 'stop_points.position', :before_add => :vjas_add, :before_remove => :vjas_remove, :after_add => :shortcuts_update_for_add, :after_remove => :shortcuts_update_for_remove
9
+
10
+ attr_accessible :route_id, :objectid, :object_version, :creation_time, :creator_id, :name, :comment, :registration_number, :published_name, :departure_stop_point_id, :arrival_stop_point_id, :stop_point_ids, :stop_points
11
+
12
+ # TODO: this a workarround
13
+ # otherwise, we loose the first stop_point
14
+ # when creating a new journey_pattern
15
+ def special_update
16
+ bck_sp = self.stop_points.map {|s| s}
17
+ self.update_attributes :stop_points => []
18
+ self.update_attributes :stop_points => bck_sp
19
+ end
20
+
21
+ def departure_stop_point
22
+ return unless departure_stop_point_id
23
+ Chouette::StopPoint.find( departure_stop_point_id)
24
+ end
25
+ def arrival_stop_point
26
+ return unless arrival_stop_point_id
27
+ Chouette::StopPoint.find( arrival_stop_point_id)
28
+ end
29
+
30
+ def shortcuts_update_for_add( stop_point)
31
+ stop_points << stop_point unless stop_points.include?( stop_point)
32
+
33
+ ordered_stop_points = stop_points
34
+ ordered_stop_points = ordered_stop_points.sort { |a,b| a.position <=> b.position} unless ordered_stop_points.empty?
35
+
36
+ self.update_attributes!( :departure_stop_point_id => (ordered_stop_points.first && ordered_stop_points.first.id),
37
+ :arrival_stop_point_id => (ordered_stop_points.last && ordered_stop_points.last.id))
38
+ end
39
+ def shortcuts_update_for_remove( stop_point)
40
+ stop_points.delete( stop_point) if stop_points.include?( stop_point)
41
+
42
+ ordered_stop_points = stop_points
43
+ ordered_stop_points = ordered_stop_points.sort { |a,b| a.position <=> b.position} unless ordered_stop_points.empty?
44
+
45
+ self.update_attributes!( :departure_stop_point_id => (ordered_stop_points.first && ordered_stop_points.first.id),
46
+ :arrival_stop_point_id => (ordered_stop_points.last && ordered_stop_points.last.id))
47
+ end
48
+ def vjas_add( stop_point)
49
+ return if new_record?
50
+
51
+ vehicle_journeys.each do |vj|
52
+ vjas = vj.vehicle_journey_at_stops.create :stop_point_id => stop_point.id
53
+ end
54
+ end
55
+ def vjas_remove( stop_point)
56
+ return if new_record?
57
+
58
+ vehicle_journey_at_stops.where( :stop_point_id => stop_point.id).each do |vjas|
59
+ vjas.destroy
60
+ end
61
+ end
62
+ end
63
+
@@ -0,0 +1,65 @@
1
+ class Chouette::Line < Chouette::TridentActiveRecord
2
+ # FIXME http://jira.codehaus.org/browse/JRUBY-6358
3
+ set_primary_key :id
4
+
5
+ attr_accessor :transport_mode
6
+ attr_accessible :transport_mode, :network_id, :company_id, :objectid, :object_version
7
+ attr_accessible :creation_time, :creator_id, :name, :number, :published_name, :transport_mode_name
8
+ attr_accessible :registration_number, :comment, :mobility_restricted_suitability, :int_user_needs
9
+
10
+ belongs_to :company
11
+ belongs_to :network
12
+ has_many :routes, :dependent => :destroy
13
+ has_many :journey_patterns, :through => :routes
14
+
15
+ has_and_belongs_to_many :group_of_lines, :class_name => 'Chouette::GroupOfLine', :order => 'group_of_lines.name'
16
+ attr_accessible :group_of_lines, :group_of_line_ids, :group_of_line_tokens
17
+ attr_reader :group_of_line_tokens
18
+
19
+ validates_presence_of :network
20
+ validates_presence_of :company
21
+
22
+ validates_presence_of :registration_number
23
+ validates_uniqueness_of :registration_number
24
+ validates_format_of :registration_number, :with => %r{\A[0-9A-Za-z_-]+\Z}
25
+
26
+ validates_presence_of :name
27
+
28
+ def self.nullable_attributes
29
+ [:published_name, :number, :comment]
30
+ end
31
+
32
+ def transport_mode
33
+ # return nil if transport_mode_name is nil
34
+ transport_mode_name && Chouette::TransportMode.new( transport_mode_name.underscore)
35
+ end
36
+
37
+ def transport_mode=(transport_mode)
38
+ self.transport_mode_name = (transport_mode ? transport_mode.camelcase : nil)
39
+ end
40
+
41
+ @@transport_modes = nil
42
+ def self.transport_modes
43
+ @@transport_modes ||= Chouette::TransportMode.all.select do |transport_mode|
44
+ transport_mode.to_i > 0
45
+ end
46
+ end
47
+
48
+ def commercial_stop_areas
49
+ Chouette::StopArea.joins(:children => [:stop_points => [:route => :line] ]).where(:lines => {:id => self.id}).uniq
50
+ end
51
+
52
+ def stop_areas
53
+ Chouette::StopArea.joins(:stop_points => [:route => :line]).where(:lines => {:id => self.id})
54
+ end
55
+
56
+ def stop_areas_last_parents
57
+ Chouette::StopArea.joins(:stop_points => [:route => :line]).where(:lines => {:id => self.id}).collect(&:root).flatten.uniq
58
+ end
59
+
60
+ def group_of_line_tokens=(ids)
61
+ self.group_of_line_ids = ids.split(",")
62
+ end
63
+
64
+
65
+ end
@@ -0,0 +1,49 @@
1
+ class Chouette::LinkOrientationType < ActiveSupport::StringInquirer
2
+
3
+ def initialize(text_code, numerical_code)
4
+ super text_code.to_s
5
+ @numerical_code = numerical_code
6
+ end
7
+
8
+ def self.new(text_code, numerical_code = nil)
9
+ if text_code and numerical_code
10
+ super
11
+ elsif self === text_code
12
+ text_code
13
+ else
14
+ if Fixnum === text_code
15
+ text_code, numerical_code = definitions.rassoc(text_code)
16
+ else
17
+ text_code, numerical_code = definitions.assoc(text_code.to_s)
18
+ end
19
+
20
+ super text_code, numerical_code
21
+ end
22
+ end
23
+
24
+ def to_i
25
+ @numerical_code
26
+ end
27
+
28
+ def inspect
29
+ "#{to_s}/#{to_i}"
30
+ end
31
+
32
+ def name
33
+ camelize
34
+ end
35
+
36
+ @@definitions = [
37
+ ["access_point_to_stop_area", 0],
38
+ ["stop_area_to_access_point", 1]
39
+ ]
40
+ cattr_reader :definitions
41
+
42
+ @@all = nil
43
+ def self.all
44
+ @@all ||= definitions.collect do |text_code, numerical_code|
45
+ new(text_code, numerical_code)
46
+ end
47
+ end
48
+
49
+ end