ninoxe 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +49 -0
- data/app/assets/javascripts/ninoxe/application.js +15 -0
- data/app/assets/stylesheets/ninoxe/application.css +13 -0
- data/app/controllers/ninoxe/application_controller.rb +4 -0
- data/app/helpers/ninoxe/application_helper.rb +4 -0
- data/app/models/chouette/access_link.rb +63 -0
- data/app/models/chouette/access_point.rb +145 -0
- data/app/models/chouette/access_point_type.rb +50 -0
- data/app/models/chouette/active_record.rb +66 -0
- data/app/models/chouette/area_type.rb +56 -0
- data/app/models/chouette/chouette_structure.dump +3417 -0
- data/app/models/chouette/command.rb +93 -0
- data/app/models/chouette/command_line_support.rb +35 -0
- data/app/models/chouette/company.rb +19 -0
- data/app/models/chouette/connection_link.rb +43 -0
- data/app/models/chouette/connection_link_type.rb +51 -0
- data/app/models/chouette/direction.rb +60 -0
- data/app/models/chouette/exporter.rb +32 -0
- data/app/models/chouette/file_validator.rb +47 -0
- data/app/models/chouette/group_of_line.rb +30 -0
- data/app/models/chouette/journey_pattern.rb +63 -0
- data/app/models/chouette/line.rb +65 -0
- data/app/models/chouette/link_orientation_type.rb +49 -0
- data/app/models/chouette/loader.rb +110 -0
- data/app/models/chouette/network.rb +33 -0
- data/app/models/chouette/object_id.rb +36 -0
- data/app/models/chouette/pt_link.rb +39 -0
- data/app/models/chouette/route.rb +158 -0
- data/app/models/chouette/stop_area.rb +273 -0
- data/app/models/chouette/stop_point.rb +33 -0
- data/app/models/chouette/time_table.rb +146 -0
- data/app/models/chouette/time_table_date.rb +14 -0
- data/app/models/chouette/time_table_period.rb +26 -0
- data/app/models/chouette/time_table_vehicle_journey.rb +5 -0
- data/app/models/chouette/transport_mode.rb +71 -0
- data/app/models/chouette/trident_active_record.rb +97 -0
- data/app/models/chouette/vehicle_journey.rb +101 -0
- data/app/models/chouette/vehicle_journey_at_stop.rb +45 -0
- data/app/models/chouette/wayback.rb +50 -0
- data/app/views/layouts/ninoxe/application.html.erb +14 -0
- data/config/database.yml +9 -0
- data/config/database.yml.ci +14 -0
- data/config/database.yml.travis +9 -0
- data/config/locales/en.yml +15 -0
- data/config/locales/fr.yml +16 -0
- data/config/routes.rb +2 -0
- data/db/migrate/20120213131553_create_chouette_line.rb +26 -0
- data/db/migrate/20120214101458_create_chouette_company.rb +25 -0
- data/db/migrate/20120214101645_create_chouette_ptnetwork.rb +24 -0
- data/db/migrate/20120406144221_create_chouette_stop_area.rb +33 -0
- data/db/migrate/20120411144209_create_time_table.rb +38 -0
- data/db/migrate/20120425064403_create_chouette_route.rb +22 -0
- data/db/migrate/20120425123944_create_chouette_stop_point.rb +17 -0
- data/db/migrate/20120426114527_create_chouette_connection_link.rb +28 -0
- data/db/migrate/20120521073709_create_chouette_journey_pattern.rb +26 -0
- data/db/migrate/20120521073723_create_chouette_journey_pattern_stop_point.rb +14 -0
- data/db/migrate/20120521073740_create_chouette_time_slot.rb +22 -0
- data/db/migrate/20120521073746_create_chouette_vehicle_journey.rb +34 -0
- data/db/migrate/20120521073758_create_chouette_vehicle_journey_at_stop.rb +25 -0
- data/db/migrate/20120521073900_create_chouette_time_table_vehicle_journey.rb +16 -0
- data/db/migrate/20120521132304_create_chouette_access_point.rb +34 -0
- data/db/migrate/20120521132313_create_chouette_access_link.rb +33 -0
- data/db/migrate/20120521132429_create_chouette_facility.rb +34 -0
- data/db/migrate/20120521132502_create_chouette_facility_feature.rb +12 -0
- data/db/migrate/20120521132551_create_chouette_group_of_line.rb +18 -0
- data/db/migrate/20120521132600_create_chouette_group_of_line_line.rb +12 -0
- data/db/migrate/20120521132656_create_chouette_routing_constrains_line.rb +12 -0
- data/db/migrate/20120521132724_create_chouette_stoparea_stoparea.rb +12 -0
- data/db/migrate/20120531091529_create_chouette_pt_link.rb +21 -0
- data/db/migrate/20120926141405_add_id_to_time_table_date.rb +12 -0
- data/db/migrate/20120926141415_add_id_to_time_table_period.rb +12 -0
- data/db/migrate/20121024072219_add_fields_to_access_points.rb +12 -0
- data/lib/chouette_factories.rb +1 -0
- data/lib/factories/chouette_access_links.rb +11 -0
- data/lib/factories/chouette_access_points.rb +8 -0
- data/lib/factories/chouette_companies.rb +5 -0
- data/lib/factories/chouette_connection_links.rb +11 -0
- data/lib/factories/chouette_group_of_lines.rb +4 -0
- data/lib/factories/chouette_journey_pattern.rb +32 -0
- data/lib/factories/chouette_lines.rb +20 -0
- data/lib/factories/chouette_networks.rb +5 -0
- data/lib/factories/chouette_routes.rb +18 -0
- data/lib/factories/chouette_stop_areas.rb +8 -0
- data/lib/factories/chouette_stop_points.rb +7 -0
- data/lib/factories/chouette_time_table.rb +21 -0
- data/lib/factories/chouette_vehicle_journey.rb +50 -0
- data/lib/factories/chouette_vehicle_journey_at_stop.rb +5 -0
- data/lib/ninoxe/engine.rb +15 -0
- data/lib/ninoxe/version.rb +3 -0
- data/lib/ninoxe.rb +7 -0
- 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,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>
|
data/config/database.yml
ADDED
@@ -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,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,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
|