diff options
Diffstat (limited to 'app/exporters')
9 files changed, 485 insertions, 0 deletions
diff --git a/app/exporters/chouette/hub/commercial_stop_area_exporter.rb b/app/exporters/chouette/hub/commercial_stop_area_exporter.rb new file mode 100644 index 000000000..201fce3d2 --- /dev/null +++ b/app/exporters/chouette/hub/commercial_stop_area_exporter.rb @@ -0,0 +1,36 @@ +class Chouette::Hub::CommercialStopAreaExporter + include ERB::Util + attr_accessor :stop_area, :directory, :template + + def initialize(stop_area, directory) + @stop_area = stop_area + @directory = directory + @template = File.open('app/views/api/hub/stop_area/commercial_show.hub.erb' ){ |f| f.read } + @type = "ONNNNNNNNNNNNNNNNN" + end + + def render() + ERB.new(@template).result(binding) + end + + def hub_name + "/ARRET.TXT" + end + + def self.save( stop_areas, directory, hub_export) + stop_areas.each do |stop_area| + self.new( stop_area, directory).tap do |specific_exporter| + specific_exporter.save + end + end + hub_export.log_messages.create( :severity => "ok", :key => "EXPORT|COMMERCIAL_STOP_AREA_COUNT", :arguments => {"0" => stop_areas.size}) + end + + def save + File.open(directory + hub_name , "a") do |f| + f.write("ARRET\n") if f.size == 0 + f.write(render) + end if stop_area.present? + end +end + diff --git a/app/exporters/chouette/hub/connection_link_exporter.rb b/app/exporters/chouette/hub/connection_link_exporter.rb new file mode 100644 index 000000000..b3be19396 --- /dev/null +++ b/app/exporters/chouette/hub/connection_link_exporter.rb @@ -0,0 +1,35 @@ +class Chouette::Hub::Connection_LinkExporter + include ERB::Util + attr_accessor :connection_link, :directory, :template + + def initialize(connection_link, directory) + @connection_link = connection_link + @directory = directory + @template = File.open('app/views/api/hub/correspondance/show.hub.erb' ){ |f| f.read } + end + + def render() + ERB.new(@template).result(binding) + end + + def hub_name + "/CORRESPONDANCE.TXT" + end + + def self.save( connection_links, directory, hub_export) + connection_links.each do |connection_link| + self.new( connection_link, directory).tap do |specific_exporter| + specific_exporter.save + end + end + hub_export.log_messages.create( :severity => "ok", :key => "EXPORT|CONNECTION_LINK_COUNT", :arguments => {"0" => connection_links.size}) + end + + def save + File.open(directory + hub_name , "a") do |f| + f.write("CORRESPONDANCE\n") if f.size == 0 + f.write(render) + end if connection_link.present? + end +end + diff --git a/app/exporters/chouette/hub/exporter.rb b/app/exporters/chouette/hub/exporter.rb new file mode 100644 index 000000000..4b846fee0 --- /dev/null +++ b/app/exporters/chouette/hub/exporter.rb @@ -0,0 +1,185 @@ +class Chouette::Hub::Exporter + + attr_reader :referential + attr_reader :hub_export, :lines, :routes, :journey_patterns + attr_reader :time_tables, :vehicle_journeys + + def initialize(referential, hub_export) + @referential = referential + @hub_export = hub_export + @lines = nil + @routes = nil + @journey_patterns = nil + @time_tables = nil + @vehicle_journeys = nil + end + + def select_time_tables(start_date, end_date) + #TODO considere options[:o], options[:id] + all_time_tables = Chouette::TimeTable.all + time_tables = [] + s_date = Date.strptime(start_date, "%Y-%m-%d") + e_date = Date.strptime(end_date, "%Y-%m-%d") + while s_date <= e_date + (all_time_tables - time_tables).each { |time_table| time_tables << time_table if time_table.include_day?(s_date) } + s_date = s_date.next_day + end + return time_tables + end + + def select_lines(object, ids) + if object == "network" + ids.present? ? Chouette::Line.includes(:routes).where( :network_id => ids.split(",")).order(:name) : + Chouette::Line.joins(:network).includes(:routes).order(:name) + elsif object == "company" + ids.present? ? Chouette::Line.includes(:routes).where( :company_id => ids.split(",")).order(:name) : + Chouette::Line.joins(:company).includes(:routes).order(:name) + elsif object == "line" && ids.present? + Chouette::Line.includes(:routes).where( :id => ids.split(",")).order(:name) + else + Chouette::Line.includes(:routes).order(:name) + end + end + + def time_tables_exportable? + time_tables + end + + def routes_exportable? + routes # && routes.size < 150 + end + + def lines_exportable? + lines # && lines.size < 150 + end + + def journey_patterns_exportable? + journey_patterns # && journey_patterns.size < 150 + end + + def vehicle_journeys_exportable? + vehicle_journeys + end + + def log_overflow_warning( target_class) + hub_export.log_messages.create( :severity => "warning", :key => "EXPORT_ERROR|EXCEPTION", + :arguments => {"0" => I18n.t( 'export_log_messages.messages.overflow', + :count => 150, :data => target_class.model_name.human.pluralize)}) + end + + def export(zip_file_path, options = {}) + begin + referential.switch + + FileUtils.rm(zip_file_path) if File.exists? zip_file_path + + hub_export.log_messages.create( :severity => "ok", :key => "EXPORT", :arguments => {"0" => "HUB"}) + + Dir.mktmpdir(nil, "/tmp"){ |temp_dir| + + @time_tables = select_time_tables(options[:start_date], options[:end_date]) + + @lines = select_lines( options[:o], options[:id] ) + @routes = lines.map(&:routes).flatten.sort {|a,b| (a.name && b.name) ? a.name <=> b.name : a.id <=> b.id} if lines_exportable? + @journey_patterns = Chouette::JourneyPattern.where( :route_id => routes.map(&:id) ).order(:name) if routes_exportable? + + @vehicle_journeys = Chouette::VehicleJourney.where( :route_id => routes.map(&:id) ).order(:id) if routes_exportable? + + vjs = [] + tts = [] + @vehicle_journeys.each do |vj| + unless (vj.time_tables & @time_tables).empty? + vjs << vj + tts << (vj.time_tables & @time_tables) + end + end + @time_tables = tts.flatten.uniq + @vehicle_journeys = vjs.uniq + + vehicle_journey_at_stops = Chouette::VehicleJourneyAtStop.where( :vehicle_journey_id => @vehicle_journeys.map(&:id) ).order(:id) if vehicle_journeys_exportable? + + if time_tables_exportable? + Chouette::Hub::TimeTableExporter.save(@time_tables, temp_dir, hub_export) + else + log_overflow_warning(Chouette::TimeTable) + end + + if vehicle_journeys_exportable? + Chouette::Hub::VehicleJourneyExporter.save(@vehicle_journeys, temp_dir, hub_export) + Chouette::Hub::VehicleJourneyAtStopExporter.save(vehicle_journey_at_stops, temp_dir, hub_export) + else + log_overflow_warning(Chouette::VehicleJourney) + end + + stop_points = Chouette::StopPoint.where( :id => vehicle_journey_at_stops.map(&:stop_point_id)).order(:id) + physical_stop_areas = Chouette::StopArea.where( :id => stop_points.map(&:stop_area_id)).order(:parent_id) + commercial_stop_areas = Chouette::StopArea.where( :id => physical_stop_areas.map(&:parent_id)).order(:id) + + Chouette::Hub::CommercialStopAreaExporter.save(commercial_stop_areas, temp_dir, hub_export) + Chouette::Hub::PhysicalStopAreaExporter.save(physical_stop_areas, temp_dir, hub_export) + + connection_links = Chouette::ConnectionLink.where( "deprture_id IN (?) AND arrival_id IN (?)", (physical_stop_areas.map(&:id) + commercial_stop_areas.map(&:id)), (physical_stop_areas.map(&:id) + commercial_stop_areas.map(&:id)) ) + + Chouette::Hub::ConnectionLinkExporter.save(connection_links, temp_dir, hub_export) + + if journey_patterns_exportable? + Chouette::Hub::JourneyPatternExporter.save(@journey_patterns, temp_dir, hub_export) + else + log_overflow_warning(Chouette::JourneyPattern) if routes_exportable? + end + + if lines_exportable? + Chouette::Hub::LineExporter.save(@lines, temp_dir, hub_export) + else + log_overflow_warning(Chouette::Line) + end + + if routes_exportable? + #Chouette::Hub::RouteExporter.save( routes, temp_dir, hub_export) + else + log_overflow_warning(Chouette::Route) if lines_exportable? + end + + # if too many lines + # there may be too many stop_areas + if lines_exportable? + stop_areas = Chouette::StopArea.joins( :stop_points => [:route => :line]).where(:lines => {:id => lines.map(&:id)}).uniq.order(:name) + #Chouette::Hub::StopAreaExporter.save( stop_areas, temp_dir, hub_export, "Quay") + + commercial_stop_areas = Chouette::StopArea.where( :id => stop_areas.map(&:parent_id).compact.uniq).order(:name) + #Chouette::Hub::StopAreaExporter.save( commercial_stop_areas, temp_dir, hub_export, "CommercialStopPoint") + end + + if( options[:o] == "line" and not options[:id].present?) # Add all objects + stop_places = referential.stop_areas.stop_place.order(:name) + #Chouette::Hub::StopAreaExporter.save( stop_places, temp_dir, hub_export, "StopPlace") + + itls = referential.stop_areas.itl.order(:name) + #Chouette::Hub::StopAreaExporter.save( itls, temp_dir, hub_export, "ITL") + + connection_links = referential.connection_links.order(:name) + #Chouette::Hub::ConnectionLinkExporter.save( connection_links, temp_dir, hub_export) + + access_links = referential.access_links.order(:name) + #Chouette::Hub::AccessLinkExporter.save(access_links, temp_dir, hub_export) + + access_points = referential.access_points.order(:name) + #Chouette::Hub::AccessPointExporter.save(access_points, temp_dir, hub_export) + + end + + ::Zip::ZipFile.open(zip_file_path, ::Zip::ZipFile::CREATE) do |zipfile| + Dir[File.join(temp_dir, '*.TXT')].each do |f| + #Rails.logger.error("Adding File #{File.basename(f)}") + zipfile.add(File.basename(f), f) + end + end + } + ensure + # Always cleanup files + #FileUtils.remove_entry(temp_directory) + end + end + +end + diff --git a/app/exporters/chouette/hub/journey_pattern_exporter.rb b/app/exporters/chouette/hub/journey_pattern_exporter.rb new file mode 100644 index 000000000..12c157408 --- /dev/null +++ b/app/exporters/chouette/hub/journey_pattern_exporter.rb @@ -0,0 +1,36 @@ +class Chouette::Hub::JourneyPatternExporter + include ERB::Util + attr_accessor :journey_pattern, :directory, :template + + def initialize(journey_pattern, directory) + @journey_pattern = journey_pattern + @directory = directory + @template = File.open('app/views/api/hub/chemin/show.hub.erb' ){ |f| f.read } + @type = "COM" + end + + def render() + ERB.new(@template).result(binding) + end + + def hub_name + "/CHEMIN.TXT" + end + + def self.save( journey_patterns, directory, hub_export) + journey_patterns.each do |journey_pattern| + self.new( journey_pattern, directory).tap do |specific_exporter| + specific_exporter.save + end + end + hub_export.log_messages.create( :severity => "ok", :key => "EXPORT|JOURNEY_PATTERN_COUNT", :arguments => {"0" => journey_patterns.size}) + end + + def save + File.open(directory + hub_name , "a") do |f| + f.write("CHEMIN\n") if f.size == 0 + f.write(render) + end if journey_pattern.present? + end +end + diff --git a/app/exporters/chouette/hub/line_exporter.rb b/app/exporters/chouette/hub/line_exporter.rb new file mode 100644 index 000000000..b9575876a --- /dev/null +++ b/app/exporters/chouette/hub/line_exporter.rb @@ -0,0 +1,35 @@ +class Chouette::Hub::LineExporter + include ERB::Util + attr_accessor :line, :directory, :template + + def initialize(line, directory) + @line = line + @directory = directory + @template = File.open('app/views/api/hub/ligne/show.hub.erb' ){ |f| f.read } + end + + def render() + ERB.new(@template).result(binding) + end + + def hub_name + "/LIGNE.TXT" + end + + def self.save( lines, directory, hub_export) + lines.each do |line| + self.new( line, directory).tap do |specific_exporter| + specific_exporter.save + end + end + hub_export.log_messages.create( :severity => "ok", :key => "EXPORT|LINE_COUNT", :arguments => {"0" => lines.size}) + end + + def save + File.open(directory + hub_name , "a") do |f| + f.write("LIGNE\n") if f.size == 0 + f.write(render) + end if line.present? + end +end + diff --git a/app/exporters/chouette/hub/physical_stop_area_exporter.rb b/app/exporters/chouette/hub/physical_stop_area_exporter.rb new file mode 100644 index 000000000..4a2666321 --- /dev/null +++ b/app/exporters/chouette/hub/physical_stop_area_exporter.rb @@ -0,0 +1,37 @@ +class Chouette::Hub::PhysicalStopAreaExporter + include ERB::Util + attr_accessor :stop_area, :directory, :template + + def initialize(stop_area, directory) + @stop_area = stop_area + @directory = directory + @template = File.open('app/views/api/hub/stop_area/physical_show.hub.erb' ){ |f| f.read } + @type = "NNNNNNNNNNNNNNNNNN" + @stop_area.referential.projection_type = "27562" + end + + def render() + ERB.new(@template).result(binding) + end + + def hub_name + "/ARRET.TXT" + end + + def self.save( stop_areas, directory, hub_export) + stop_areas.each do |stop_area| + self.new( stop_area, directory).tap do |specific_exporter| + specific_exporter.save + end + end + hub_export.log_messages.create( :severity => "ok", :key => "EXPORT|PHYSICAL_STOP_AREA_COUNT", :arguments => {"0" => stop_areas.size}) + end + + def save + File.open(directory + hub_name , "a") do |f| + f.write("ARRET\n") if f.size == 0 + f.write(render) + end if stop_area.present? + end +end + diff --git a/app/exporters/chouette/hub/time_table_exporter.rb b/app/exporters/chouette/hub/time_table_exporter.rb new file mode 100644 index 000000000..1e91ead6c --- /dev/null +++ b/app/exporters/chouette/hub/time_table_exporter.rb @@ -0,0 +1,46 @@ +class Chouette::Hub::TimeTableExporter + include ERB::Util + attr_accessor :time_table, :directory, :template, :start_date, :end_date + + def initialize(time_table, directory) + @time_table = time_table + @directory = directory + @template = File.open('app/views/api/hub/periode/show.hub.erb' ){ |f| f.read } + @calendar = "" + s_date = @time_table.start_date + e_date = @time_table.end_date + while s_date <= e_date + if time_table.include_day?(s_date) + @calendar += "1" + else + @calendar += "0" + end + s_date = s_date.next_day + end + end + + def render() + ERB.new(@template).result(binding) + end + + def hub_name + "/PERIODE.TXT" + end + + def self.save(time_tables, directory, hub_export) + time_tables.each do |time_table| + self.new(time_table, directory).tap do |specific_exporter| + specific_exporter.save + end + end + hub_export.log_messages.create( :severity => "ok", :key => "EXPORT|TIME_TABLE_COUNT", :arguments => {"0" => time_tables.size}) + end + + def save + File.open(directory + hub_name , "a") do |f| + f.write("PERIODE\n") if f.size == 0 + f.write(render) + end if time_table.present? + end +end + diff --git a/app/exporters/chouette/hub/vehicle_journey_at_stop_exporter.rb b/app/exporters/chouette/hub/vehicle_journey_at_stop_exporter.rb new file mode 100644 index 000000000..e78048ecb --- /dev/null +++ b/app/exporters/chouette/hub/vehicle_journey_at_stop_exporter.rb @@ -0,0 +1,39 @@ +class Chouette::Hub::VehicleJourneyAtStopExporter + include ERB::Util + attr_accessor :vehicle_journey_at_stop, :directory, :template + + def initialize(vehicle_journey_at_stop, directory) + @vehicle_journey_at_stop = vehicle_journey_at_stop + @directory = directory + @template = File.open('app/views/api/hub/horaire/show.hub.erb' ) { |f| f.read } + @arrival_time = @vehicle_journey_at_stop.arrival_time.sec + 60 * @vehicle_journey_at_stop.arrival_time.min + 60 * 60 * @vehicle_journey_at_stop.arrival_time.hour + @arrival_type = "A" + @departure_time = @vehicle_journey_at_stop.departure_time.sec + 60 * @vehicle_journey_at_stop.departure_time.min + 60 * 60 * @vehicle_journey_at_stop.departure_time.hour + @departure_type = "D" + end + + def render() + ERB.new(@template).result(binding) + end + + def hub_name + "/HORAIRE.TXT" + end + + def self.save( vehicle_journey_at_stops, directory, hub_export) + vehicle_journey_at_stops.each do |vehicle_journey_at_stop| + self.new( vehicle_journey_at_stop, directory).tap do |specific_exporter| + specific_exporter.save + end + end + hub_export.log_messages.create( :severity => "ok", :key => "EXPORT|VEHICLE_JOURNEY_AT_STOP_COUNT", :arguments => {"0" => vehicle_journey_at_stops.size}) + end + + def save + File.open(directory + hub_name , "a") do |f| + f.write("HORAIRE\n") if f.size == 0 + f.write(render) + end if vehicle_journey_at_stop.present? + end +end + diff --git a/app/exporters/chouette/hub/vehicle_journey_exporter.rb b/app/exporters/chouette/hub/vehicle_journey_exporter.rb new file mode 100644 index 000000000..ced67fdd8 --- /dev/null +++ b/app/exporters/chouette/hub/vehicle_journey_exporter.rb @@ -0,0 +1,36 @@ +class Chouette::Hub::VehicleJourneyExporter + include ERB::Util + attr_accessor :vehicle_journey, :directory, :template + + def initialize(vehicle_journey, directory) + @vehicle_journey = vehicle_journey + @directory = directory + @template = File.open('app/views/api/hub/course/show.hub.erb' ) { |f| f.read } + end + + def render() + ERB.new(@template).result(binding) + end + + def hub_name + "/COURSE.TXT" + end + + def self.save( vehicle_journeys, directory, hub_export) + vehicle_journeys.each do |vehicle_journey| + #Chouette::Hub::VehicleJourneyAtStopExporter.save(vehicle_journey.vehicle_journey_at_stops, directory, hub_export) + self.new( vehicle_journey, directory).tap do |specific_exporter| + specific_exporter.save + end + end + hub_export.log_messages.create( :severity => "ok", :key => "EXPORT|VEHICLE_JOURNEY_COUNT", :arguments => {"0" => vehicle_journeys.size}) + end + + def save + File.open(directory + hub_name , "a") do |f| + f.write("COURSE\n") if f.size == 0 + f.write(render) + end if vehicle_journey.present? + end +end + |
