ninoxe 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,146 @@
1
+ class Chouette::TimeTable < Chouette::TridentActiveRecord
2
+ # FIXME http://jira.codehaus.org/browse/JRUBY-6358
3
+ set_primary_key :id
4
+
5
+ attr_accessible :objectid, :object_version, :creation_time, :creator_id, :version, :comment
6
+ attr_accessible :int_day_types,:monday,:tuesday,:wednesday,:thursday,:friday,:saturday,:sunday
7
+ attr_accessor :monday,:tuesday,:wednesday,:thursday,:friday,:saturday,:sunday
8
+
9
+ has_many :dates, :class_name => "Chouette::TimeTableDate", :order => :date, :dependent => :destroy
10
+ has_many :periods, :class_name => "Chouette::TimeTablePeriod", :order => :period_start, :dependent => :destroy
11
+
12
+ def self.object_id_key
13
+ "Timetable"
14
+ end
15
+
16
+ accepts_nested_attributes_for :dates, :allow_destroy => :true
17
+ accepts_nested_attributes_for :periods, :allow_destroy => :true
18
+ attr_accessible :dates_attributes,:periods_attributes
19
+
20
+ validates_presence_of :comment
21
+
22
+ def self.start_validity_period
23
+ [Chouette::TimeTableDate.minimum(:date),Chouette::TimeTablePeriod.minimum(:period_start)].compact.min
24
+ end
25
+ def self.end_validity_period
26
+ [Chouette::TimeTableDate.maximum(:date),Chouette::TimeTablePeriod.maximum(:period_end)].compact.max
27
+ end
28
+
29
+ def validity_out_from_on?(expected_date)
30
+ return false if bounding_dates.empty?
31
+ bounding_dates.max <= expected_date
32
+ end
33
+ def validity_out_between?(start_date, end_date)
34
+ return false if bounding_dates.empty?
35
+ start_date < bounding_dates.max &&
36
+ bounding_dates.max <= end_date
37
+ end
38
+ def self.validity_out_from_on?(expected_date,limit=0)
39
+ expired = []
40
+ includes(:dates,:periods).find_each do |tm|
41
+ expired << tm if tm.validity_out_from_on?( expected_date)
42
+ break if (limit > 0 && expired.size == limit)
43
+ end
44
+ expired
45
+ end
46
+ def self.validity_out_between?(start_date, end_date,limit=0)
47
+ expired = []
48
+ includes(:dates,:periods).find_each do |tm|
49
+ expired << tm if tm.validity_out_between?( start_date, end_date)
50
+ break if (limit > 0 && expired.size == limit)
51
+ end
52
+ expired
53
+ end
54
+
55
+ def include_day?(day)
56
+ self.dates.any?{ |d| d.date === day } || self.periods.any?{ |period| period.period_start <= day && day <= period.period_end }
57
+ end
58
+
59
+ def include_in_dates?(day)
60
+ self.dates.any?{ |d| d.date === day }
61
+ end
62
+
63
+ def include_in_periods?(day)
64
+ self.periods.any?{ |period| period.period_start <= day && day <= period.period_end && valid_days.include?(day.cwday) }
65
+ end
66
+
67
+ def include_in_overlap_dates?(day)
68
+ counter = self.dates.select{ |d| d.date === day}.size + self.periods.select{ |period| period.period_start <= day && day <= period.period_end && valid_days.include?(day.cwday) }.size
69
+ counter <= 1 ? false : true
70
+ end
71
+
72
+ def bounding_dates
73
+ (self.dates.map(&:date) + self.periods.map(&:period_start) + self.periods.map(&:period_end)).compact
74
+ end
75
+
76
+ def day_by_mask(flag)
77
+ int_day_types & flag == flag
78
+ end
79
+
80
+ def valid_days
81
+ # Build an array with day of calendar week (1-7, Monday is 1).
82
+ [].tap do |valid_days|
83
+ valid_days << 1 if monday
84
+ valid_days << 2 if tuesday
85
+ valid_days << 3 if wednesday
86
+ valid_days << 4 if thursday
87
+ valid_days << 5 if friday
88
+ valid_days << 6 if saturday
89
+ valid_days << 7 if sunday
90
+ end
91
+ end
92
+
93
+ def monday
94
+ day_by_mask(4)
95
+ end
96
+ def tuesday
97
+ day_by_mask(8)
98
+ end
99
+ def wednesday
100
+ day_by_mask(16)
101
+ end
102
+ def thursday
103
+ day_by_mask(32)
104
+ end
105
+ def friday
106
+ day_by_mask(64)
107
+ end
108
+ def saturday
109
+ day_by_mask(128)
110
+ end
111
+ def sunday
112
+ day_by_mask(256)
113
+ end
114
+
115
+ def set_day(day,flag)
116
+ if (day == '1')
117
+ self.int_day_types |= flag
118
+ else
119
+ self.int_day_types &= ~flag
120
+ end
121
+ end
122
+
123
+ def monday=(day)
124
+ set_day(day,4)
125
+ end
126
+ def tuesday=(day)
127
+ set_day(day,8)
128
+ end
129
+ def wednesday=(day)
130
+ set_day(day,16)
131
+ end
132
+ def thursday=(day)
133
+ set_day(day,32)
134
+ end
135
+ def friday=(day)
136
+ set_day(day,64)
137
+ end
138
+ def saturday=(day)
139
+ set_day(day,128)
140
+ end
141
+ def sunday=(day)
142
+ set_day(day,256)
143
+ end
144
+
145
+ end
146
+
@@ -0,0 +1,14 @@
1
+ class Chouette::TimeTableDate < Chouette::ActiveRecord
2
+ set_primary_key :id
3
+ belongs_to :time_table
4
+ acts_as_list :scope => 'time_table_id = #{time_table_id}',:top_of_list => 0
5
+
6
+ validates_presence_of :date
7
+ validates_uniqueness_of :date, :scope => :time_table_id
8
+
9
+ attr_accessible :date, :position, :time_table_id, :time_table
10
+ def self.model_name
11
+ ActiveModel::Name.new Chouette::TimeTableDate, Chouette, "TimeTableDate"
12
+ end
13
+ end
14
+
@@ -0,0 +1,26 @@
1
+ class Chouette::TimeTablePeriod < Chouette::ActiveRecord
2
+ set_primary_key :id
3
+ belongs_to :time_table
4
+ acts_as_list :scope => 'time_table_id = #{time_table_id}',:top_of_list => 0
5
+
6
+ attr_accessible :period_start, :period_end, :position,:time_table_id,:time_table
7
+
8
+ validates_presence_of :period_start
9
+ validates_presence_of :period_end
10
+
11
+ validate :start_must_be_before_end
12
+
13
+ def self.model_name
14
+ ActiveModel::Name.new Chouette::TimeTablePeriod, Chouette, "TimeTablePeriod"
15
+ end
16
+
17
+ def start_must_be_before_end
18
+ # security against nil values
19
+ if period_end.nil? || period_start.nil?
20
+ return
21
+ end
22
+ if period_end <= period_start
23
+ errors.add(:period_end,I18n.t("activerecord.errors.models.time_table_period.start_must_be_before_end"))
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,5 @@
1
+ class Chouette::TimeTableVehicleJourney < Chouette::ActiveRecord
2
+ belongs_to :time_table
3
+ belongs_to :vehicle_journey
4
+ end
5
+
@@ -0,0 +1,71 @@
1
+ class Chouette::TransportMode < 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
+ ["interchange", -1],
38
+ ["unknown", 0],
39
+ ["coach", 1],
40
+ ["air", 2],
41
+ ["waterborne", 3],
42
+ ["bus", 4],
43
+ ["ferry", 5],
44
+ ["walk", 6],
45
+ ["metro", 7],
46
+ ["shuttle", 8],
47
+ ["rapid_transit", 9],
48
+ ["taxi", 10],
49
+ ["local_train", 11],
50
+ ["train", 12],
51
+ ["long_distance_train", 13],
52
+ ["tramway", 14],
53
+ ["trolleybus", 15],
54
+ ["private_vehicle", 16],
55
+ ["bicycle", 17],
56
+ ["other", 18]
57
+ ]
58
+ cattr_reader :definitions
59
+
60
+ @@all = nil
61
+ def self.all
62
+ @@all ||= definitions.collect do |text_code, numerical_code|
63
+ new(text_code, numerical_code)
64
+ end
65
+ end
66
+
67
+ def public_transport?
68
+ not interchange?
69
+ end
70
+
71
+ end
@@ -0,0 +1,97 @@
1
+ class Chouette::TridentActiveRecord < Chouette::ActiveRecord
2
+ before_validation :prepare_auto_columns
3
+ after_save :build_objectid
4
+
5
+ self.abstract_class = true
6
+ #
7
+ # triggers to generate objectId and objectVersion
8
+ # TODO setting prefix in referential object
9
+
10
+ def self.object_id_key
11
+ model_name
12
+ end
13
+
14
+ def prefix
15
+ "NINOXE"
16
+ end
17
+ def prepare_auto_columns
18
+ # logger.info 'calling before_validation'
19
+ # logger.info 'start before_validation : '+self.objectid.to_s
20
+ if self.objectid.blank?
21
+ # if empty, generate a pending objectid which will be completed after creation
22
+ if self.id.nil?
23
+ self.objectid = "#{prefix}:#{self.class.object_id_key}:__pending_id__#{rand(1000)}"
24
+ else
25
+ self.objectid = "#{prefix}:#{self.class.object_id_key}:#{self.id}"
26
+ end
27
+ elsif not self.objectid.include? ':'
28
+ # if one token : technical token : completed by prefix and key
29
+ self.objectid = "#{prefix}:#{self.class.object_id_key}:#{self.objectid}"
30
+ end
31
+ # logger.info 'end before_validation : '+self.objectid
32
+ # initialize or update version
33
+ if self.object_version.nil?
34
+ self.object_version = 1
35
+ else
36
+ self.object_version += 1
37
+ end
38
+ self.creation_time = Time.now
39
+ self.creator_id = 'chouette'
40
+ end
41
+
42
+ def build_objectid
43
+ #logger.info 'start after_create : '+self.objectid
44
+ if self.objectid.include? ':__pending_id__'
45
+ base_objectid = self.objectid.rpartition(":").first
46
+ self.update_attributes( :objectid => "#{base_objectid}:#{self.id}", :object_version => (self.object_version - 1) )
47
+ end
48
+ #logger.info 'end after_create : '+self.objectid
49
+ end
50
+
51
+ validates_presence_of :objectid
52
+ validates_uniqueness_of :objectid
53
+ validates_numericality_of :object_version
54
+ validate :objectid_format_compliance
55
+
56
+ def objectid_format_compliance
57
+ if !self.objectid.valid?
58
+ #errors.add(:objectid, "is not a valid ObjectId object")
59
+ errors.add(:objectid,I18n.t("activerecord.errors.models.trident.invalid_object_id",:type => self.class.object_id_key))
60
+ else
61
+ unless self.objectid.object_type==self.class.object_id_key
62
+ #errors.add(:objectid, "doesn't have expected object_type: #{self.class.object_id_key}")
63
+ errors.add(:objectid,I18n.t("activerecord.errors.models.trident.invalid_object_id_type",:type => self.class.object_id_key))
64
+ end
65
+ end
66
+ end
67
+
68
+ def self.model_name
69
+ ActiveModel::Name.new self, Chouette, self.name.demodulize
70
+ end
71
+
72
+ def objectid
73
+ Chouette::ObjectId.new read_attribute(:objectid)
74
+ end
75
+
76
+ # def version
77
+ # self.object_version
78
+ # end
79
+
80
+ # def version=(version)
81
+ # self.object_version = version
82
+ # end
83
+
84
+ before_validation :default_values, :on => :create
85
+ def default_values
86
+ self.object_version ||= 1
87
+ end
88
+
89
+ def timestamp_attributes_for_update #:nodoc:
90
+ [:creation_time]
91
+ end
92
+
93
+ def timestamp_attributes_for_create #:nodoc:
94
+ [:creation_time]
95
+ end
96
+
97
+ end
@@ -0,0 +1,101 @@
1
+ class Chouette::VehicleJourney < Chouette::TridentActiveRecord
2
+ #
3
+ # FIXME http://jira.codehaus.org/browse/JRUBY-6358
4
+ set_primary_key :id
5
+
6
+ attr_accessor :transport_mode_name
7
+ attr_accessible :route_id, :journey_pattern_id, :time_slot_id, :company_id, :objectid, :object_version, :creation_time, :creator_id, :comment, :status_value
8
+ attr_accessible :route, :transport_mode,:transport_mode_name, :published_journey_name, :published_journey_identifier, :facility, :vehicle_type_identifier, :number
9
+ attr_accessible :vehicle_journey_at_stops_attributes, :time_table_tokens, :time_tables
10
+ attr_reader :time_table_tokens
11
+
12
+ def self.nullable_attributes
13
+ [:transport_mode, :published_journey_name, :vehicle_type_identifier, :published_journey_identifier, :comment, :status_value]
14
+ end
15
+
16
+ belongs_to :company
17
+ belongs_to :route
18
+ belongs_to :journey_pattern
19
+
20
+ validates_presence_of :route
21
+ validates_presence_of :journey_pattern
22
+
23
+ has_many :vehicle_journey_at_stops, :dependent => :destroy, :include => :stop_point, :order => "stop_points.position"
24
+ accepts_nested_attributes_for :vehicle_journey_at_stops, :allow_destroy => true
25
+
26
+ has_and_belongs_to_many :time_tables, :class_name => 'Chouette::TimeTable', :foreign_key => "vehicle_journey_id", :association_foreign_key => "time_table_id"
27
+ has_many :stop_points, :through => :vehicle_journey_at_stops, :order => 'stop_points.position'
28
+
29
+ validate :increasing_times
30
+ validates_presence_of :number
31
+
32
+ before_validation :set_default_values
33
+ def set_default_values
34
+ if number.nil?
35
+ self.number = 0
36
+ end
37
+ end
38
+
39
+ def transport_mode_name
40
+ # return nil if transport_mode is nil
41
+ transport_mode && Chouette::TransportMode.new( transport_mode.underscore)
42
+ end
43
+
44
+ def transport_mode_name=(transport_mode_name)
45
+ self.transport_mode = (transport_mode_name ? transport_mode_name.camelcase : nil)
46
+ end
47
+
48
+ @@transport_mode_names = nil
49
+ def self.transport_mode_names
50
+ @@transport_mode_names ||= Chouette::TransportMode.all.select do |transport_mode_name|
51
+ transport_mode_name.to_i > 0
52
+ end
53
+ end
54
+
55
+
56
+ def increasing_times
57
+ previous = nil
58
+ vehicle_journey_at_stops.select{|vjas| vjas.departure_time && vjas.arrival_time}.each do |vjas|
59
+ errors.add( :vehicle_journey_at_stops, 'time gap overflow') unless vjas.increasing_times_validate( previous)
60
+ previous = vjas
61
+ end
62
+ end
63
+
64
+ def missing_stops_in_relation_to_a_journey_pattern(selected_journey_pattern)
65
+ selected_journey_pattern.stop_points - self.stop_points
66
+ end
67
+ def extra_stops_in_relation_to_a_journey_pattern(selected_journey_pattern)
68
+ self.stop_points - selected_journey_pattern.stop_points
69
+ end
70
+ def extra_vjas_in_relation_to_a_journey_pattern(selected_journey_pattern)
71
+ extra_stops = self.extra_stops_in_relation_to_a_journey_pattern(selected_journey_pattern)
72
+ self.vehicle_journey_at_stops.select { |vjas| extra_stops.include?( vjas.stop_point)}
73
+ end
74
+ def time_table_tokens=(ids)
75
+ self.time_table_ids = ids.split(",")
76
+ end
77
+ def bounding_dates
78
+ dates = []
79
+
80
+ time_tables.each do |tm|
81
+ tm_bounding_dates = tm.bounding_dates
82
+ unless tm_bounding_dates.empty?
83
+ dates << tm.bounding_dates.min
84
+ dates << tm.bounding_dates.max
85
+ end
86
+ end
87
+
88
+ dates.empty? ? [] : [dates.min, dates.max]
89
+ end
90
+
91
+ def update_journey_pattern( selected_journey_pattern)
92
+ return unless selected_journey_pattern.route_id==self.route_id
93
+
94
+ missing_stops_in_relation_to_a_journey_pattern(selected_journey_pattern).each do |sp|
95
+ self.vehicle_journey_at_stops.build( :stop_point => sp)
96
+ end
97
+ extra_vjas_in_relation_to_a_journey_pattern(selected_journey_pattern).each do |vjas|
98
+ vjas._destroy = true
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,45 @@
1
+ class Chouette::VehicleJourneyAtStop < Chouette::ActiveRecord
2
+ set_primary_key :id
3
+
4
+ belongs_to :stop_point
5
+ belongs_to :vehicle_journey
6
+
7
+ after_initialize :set_virtual_attributes
8
+
9
+ attr_accessor :_destroy
10
+ attr_accessible :vehicle_journey_id, :stop_point_id, :connecting_service_id, :boarding_alighting_possibility, :arrival_time, :departure_time, :waiting_time, :elapse_duration, :headway_frequency, :_destroy, :stop_point
11
+
12
+ validate :arrival_must_be_before_departure
13
+
14
+ def arrival_must_be_before_departure
15
+ # security against nil values
16
+ return unless arrival_time && departure_time
17
+
18
+ if exceeds_gap?( arrival_time, departure_time)
19
+ errors.add(:arrival_time,I18n.t("activerecord.errors.models.vehicle_journey_at_stop.arrival_must_be_before_departure"))
20
+ end
21
+ end
22
+
23
+ def increasing_times_validate( previous)
24
+ result = true
25
+ return result unless previous
26
+
27
+ if exceeds_gap?( previous.departure_time, departure_time)
28
+ result = false
29
+ errors.add( :departure_time, 'departure time gap overflow')
30
+ end
31
+ if exceeds_gap?( previous.arrival_time, arrival_time)
32
+ result = false
33
+ errors.add( :arrival_time, 'arrival time gap overflow')
34
+ end
35
+ result
36
+ end
37
+ def exceeds_gap?( first, second)
38
+ 3600 < ( ( second-first)%( 3600 * 24))
39
+ end
40
+
41
+ def set_virtual_attributes
42
+ @_destroy = false
43
+ end
44
+
45
+ end
@@ -0,0 +1,50 @@
1
+ class Chouette::Wayback < 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
+ ]
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
50
+
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Ninoxe</title>
5
+ <%= stylesheet_link_tag "ninoxe/application", :media => "all" %>
6
+ <%= javascript_include_tag "ninoxe/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,9 @@
1
+ development:
2
+ adapter: postgresql
3
+ database: ninoxe_dev
4
+ username: <%= ENV['USER'] %>
5
+
6
+ test:
7
+ adapter: postgresql
8
+ database: ninoxe_test
9
+ username: <%= ENV['USER'] %>
@@ -0,0 +1,14 @@
1
+ development:
2
+ adapter: postgresql
3
+ database: ninoxe_dev
4
+ username: chouette
5
+ password: chouette
6
+ template: template1
7
+
8
+ test:
9
+ adapter: postgresql
10
+ host: localhost
11
+ database: ninoxe_test
12
+ username: chouette
13
+ password: chouette
14
+ template: template1
@@ -0,0 +1,9 @@
1
+ development:
2
+ adapter: postgresql
3
+ database: ninoxe_dev
4
+ username: postgres
5
+
6
+ test:
7
+ adapter: postgresql
8
+ database: ninoxe_test
9
+ username: postgres
@@ -0,0 +1,15 @@
1
+ en:
2
+ activerecord:
3
+ errors:
4
+ models:
5
+ trident:
6
+ invalid_object_id: "invalid syntax, expected as [A-Za-z0-9_]:%{type}:[A-Za-z0-9_-]"
7
+ invalid_object_id_type: invalid type, must be %{type}
8
+ time_table_period:
9
+ start_must_be_before_end: end date must be after start date
10
+ time_table_date:
11
+ attributes:
12
+ date:
13
+ taken: dupplicate date for this timetable
14
+ vehicle_journey_at_stop:
15
+ arrival_must_be_before_departure: arrival time must be before departure time
@@ -0,0 +1,16 @@
1
+ fr:
2
+ activerecord:
3
+ errors:
4
+ models:
5
+ trident:
6
+ invalid_object_id: "syntaxe invalide, [A-Za-z0-9_]:%{type}:[A-Za-z0-9_-] attendu"
7
+ invalid_object_id_type: type invalide, %{type} attendu
8
+ time_table_period:
9
+ start_must_be_before_end: la date de fin doit être postérieure à la date de début
10
+ time_table_date:
11
+ attributes:
12
+ date:
13
+ taken: date déjà saisie pour ce calendrier
14
+ vehicle_journey_at_stop:
15
+ arrival_must_be_before_departure: "l'heure d'arrivée doit être antérieure à l'heure de départ"
16
+
data/config/routes.rb ADDED
@@ -0,0 +1,2 @@
1
+ Ninoxe::Engine.routes.draw do
2
+ end
@@ -0,0 +1,26 @@
1
+ class CreateChouetteLine < ActiveRecord::Migration
2
+ def up
3
+ create_table "lines", :force => true do |t|
4
+ t.integer "network_id", :limit => 8
5
+ t.integer "company_id", :limit => 8
6
+ t.string "objectid", :null => false
7
+ t.integer "object_version"
8
+ t.datetime "creation_time"
9
+ t.string "creator_id"
10
+ t.string "name"
11
+ t.string "number"
12
+ t.string "published_name"
13
+ t.string "transport_mode_name"
14
+ t.string "registration_number"
15
+ t.string "comment"
16
+ t.boolean "mobility_restricted_suitability"
17
+ t.integer "int_user_needs"
18
+ end
19
+
20
+ add_index "lines", ["objectid"], :name => "lines_objectid_key", :unique => true
21
+ add_index "lines", ["registration_number"], :name => "lines_registration_number_key", :unique => true
22
+ end
23
+
24
+ def down
25
+ end
26
+ end