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