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,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