diff options
| -rw-r--r-- | app/controllers/vehicle_journey_exports_controller.rb | 11 | ||||
| -rw-r--r-- | app/models/vehicle_journey_export.rb | 70 | ||||
| -rw-r--r-- | app/views/vehicle_journeys/index.html.erb | 2 | ||||
| -rw-r--r-- | config/locales/vehicle_journey_exports.yml | 20 | ||||
| -rw-r--r-- | spec/models/vehicle_journey_export_spec.rb | 85 | ||||
| -rw-r--r-- | spec/requests/vehicle_journey_imports_spec.rb | 2 |
6 files changed, 188 insertions, 2 deletions
diff --git a/app/controllers/vehicle_journey_exports_controller.rb b/app/controllers/vehicle_journey_exports_controller.rb index b786f00d3..0cc30f23a 100644 --- a/app/controllers/vehicle_journey_exports_controller.rb +++ b/app/controllers/vehicle_journey_exports_controller.rb @@ -6,11 +6,22 @@ class VehicleJourneyExportsController < ChouetteController end respond_to :csv, :only => [:index] + respond_to :zip, :only => [:index] #respond_to :xls, :only => [:index] def index index! do |format| format.csv { send_data VehicleJourneyExport.new(:route => route, :vehicle_journeys => vehicle_journeys).to_csv(:col_sep => ";") , :filename => t("vehicle_journey_exports.new.basename")+"_#{route.id}.csv" } + format.zip do + begin + temp_file = Tempfile.new("vehicle_journey_export") + VehicleJourneyExport.new(:route => route, :vehicle_journeys => vehicle_journeys).to_zip(temp_file,:col_sep => ";") + send_data File.read(temp_file.path), :filename => t("vehicle_journey_exports.new.basename")+"_#{route.id}.zip" + ensure + temp_file.close + temp_file.unlink + end + end #format.xls end end diff --git a/app/models/vehicle_journey_export.rb b/app/models/vehicle_journey_export.rb index 318e0ba30..6848ccffb 100644 --- a/app/models/vehicle_journey_export.rb +++ b/app/models/vehicle_journey_export.rb @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- require "csv" +require "zip/zip" class VehicleJourneyExport include ActiveModel::Validations @@ -89,4 +90,73 @@ class VehicleJourneyExport end end + def tt_day_types(tt) + type = tt.monday ? label("monday") : ".." + type += tt.tuesday ? label("tuesday") : ".." + type += tt.wednesday ? label("wednesday") : ".." + type += tt.thursday ? label("thursday") : ".." + type += tt.friday ? label("friday") : ".." + type += tt.saturday ? label("saturday") : ".." + type += tt.sunday ? label("sunday") : ".." + type + end + + def tt_periods(tt) + periods = "" + tt.periods.each do |p| + periods += "["+p.period_start.to_s+" -> "+p.period_end.to_s+"] " + end + periods + end + + def tt_peculiar_days(tt) + days = "" + tt.included_days.each do |d| + days += d.to_s+" " + end + days + end + + def tt_excluded_days(tt) + days = "" + tt.excluded_days.each do |d| + days += d.to_s+" " + end + days + end + + def tt_data(tt) + [].tap do |array| + # code;name;tags;start;end;day types;periods;peculiar days;excluded days + array << tt.id.to_s + array << tt.comment + array << tt.tag_list + array << tt.start_date.to_s + array << tt.end_date.to_s + array << tt_day_types(tt) + array << tt_day_types(tt) + array << tt_periods(tt) + array << tt_peculiar_days(tt) + array << tt_excluded_days(tt) + end + end + + def time_tables_to_csv (options = {}) + tts = Chouette::TimeTable.all + CSV.generate(options) do |csv| + csv << label("tt_columns").split(";") + tts.each do |tt| + csv << tt_data(tt) + end + end + end + + def to_zip(temp_file,options = {}) + ::Zip::ZipOutputStream.open(temp_file) { |zos| } + ::Zip::ZipFile.open(temp_file.path, ::Zip::ZipFile::CREATE) do |zipfile| + zipfile.get_output_stream(label("vj_filename")+route.id.to_s+".csv") { |f| f.puts to_csv(options) } + zipfile.get_output_stream(label("tt_filename")+".csv") { |f| f.puts time_tables_to_csv(options) } + end + end + end diff --git a/app/views/vehicle_journeys/index.html.erb b/app/views/vehicle_journeys/index.html.erb index de46788fa..212c06bbf 100644 --- a/app/views/vehicle_journeys/index.html.erb +++ b/app/views/vehicle_journeys/index.html.erb @@ -56,7 +56,7 @@ <li><%= link_to t('vehicle_journeys.actions.new'), new_referential_line_route_vehicle_journey_path(@referential, @line, @route), :class => "add" %></li> <li><%= link_to t('.timeless'), timeless_referential_line_route_vehicle_journeys_path(@referential, @line, @route), :class => "link" %></li> <li><%= link_to t('vehicle_journey_imports.new.title'), new_referential_line_route_vehicle_journey_import_path( @referential, @line, @route ), :class => "import" %></li> - <li><%= link_to image_tag("icons/file_csv.png") + t('vehicle_journey_exports.new.title'), referential_line_route_vehicle_journey_exports_path(@referential, @line, @route, :format => :csv), :class => "with_fa" %></li> + <li><%= link_to image_tag("icons/file_csv.png") + t('vehicle_journey_exports.new.title'), referential_line_route_vehicle_journey_exports_path(@referential, @line, @route, :format => :zip), :class => "with_fa" %></li> </ul> <!-- <div class="btn-group"> diff --git a/config/locales/vehicle_journey_exports.yml b/config/locales/vehicle_journey_exports.yml index 17e0b66b6..b79f17cd4 100644 --- a/config/locales/vehicle_journey_exports.yml +++ b/config/locales/vehicle_journey_exports.yml @@ -13,6 +13,16 @@ en: stop_name: "stop name" b_true: "Yes" b_false: "No" + tt_columns: "code;name;tags;start;end;day types;periods;peculiar days;excluded days" + monday: "Mo" + tuesday: "Tu" + wednesday: "We" + thursday: "Th" + friday: "Fr" + saturday: "Sa" + sunday: "Su" + vj_filename: "vehicle_journeys_" + tt_filename: "time_tables" fr: vehicle_journey_exports: new: @@ -28,3 +38,13 @@ fr: stop_name: "nom arrêt" b_true: "Oui" b_false: "Non" + tt_columns: "code;nom;étiquettes;début;fin;types de jour;périodes;jours particuliers;jours exclus" + monday: "Lu" + tuesday: "Ma" + wednesday: "Me" + thursday: "Je" + friday: "Ve" + saturday: "Sa" + sunday: "Di" + vj_filename: "courses_" + tt_filename: "calendriers" diff --git a/spec/models/vehicle_journey_export_spec.rb b/spec/models/vehicle_journey_export_spec.rb new file mode 100644 index 000000000..5ce3b9bfc --- /dev/null +++ b/spec/models/vehicle_journey_export_spec.rb @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +require 'spec_helper' + +describe VehicleJourneyExport do + + let!(:route) { create(:route) } + let!(:other_route) { create(:route) } + + let!(:journey_pattern) { create(:journey_pattern, :route => route) } + let!(:other_journey_pattern) { create(:journey_pattern_even, :route => route) } + + let!(:vehicle_journey1) { create(:vehicle_journey_common, :objectid => "export:VehicleJourney:1", :route_id => route.id, :journey_pattern_id => journey_pattern.id) } + let!(:vehicle_journey2) { create(:vehicle_journey_common, :objectid => "export:VehicleJourney:2", :route_id => route.id, :journey_pattern_id => other_journey_pattern.id) } + let!(:vehicle_journey3) { create(:vehicle_journey_common, :objectid => "export:VehicleJourney:3", :route_id => route.id, :journey_pattern_id => journey_pattern.id) } + + let!(:stop_point0) { route.stop_points[0] } + let!(:stop_point1) { route.stop_points[1] } + let!(:stop_point2) { route.stop_points[2] } + let!(:stop_point3) { route.stop_points[3] } + let!(:stop_point4) { route.stop_points[4] } + + let!(:time_table) { create(:time_table)} + + subject { VehicleJourneyExport.new(:vehicle_journeys => route.vehicle_journeys, :route => route) } + + describe ".tt_day_types" do + + it "should return no day_type" do + time_table.int_day_types = 0 + expect(subject.tt_day_types(time_table)).to eq("..............") + end + + it "should return all days" do + time_table.int_day_types = 4|8|16|32|64|128|256 + expect(subject.tt_day_types(time_table)).to eq("LuMaMeJeVeSaDi") + end + + end + + describe ".tt_periods" do + + it "should return empty period" do + time_table.periods.clear + expect(subject.tt_periods(time_table)).to eq("") + end + + it "should return periods" do + time_table.periods.clear + time_table.periods << Chouette::TimeTablePeriod.new(:period_start => Date.new(2014,8,1), :period_end => Date.new(2014,8,8)) + expect(subject.tt_periods(time_table)).to eq("[2014-08-01 -> 2014-08-08] ") + end + + end + + describe ".tt_included_days" do + + it "should return empty included dates" do + time_table.dates.clear + expect(subject.tt_peculiar_days(time_table)).to eq("") + end + + it "should return included date" do + time_table.dates.clear + time_table.dates << Chouette::TimeTableDate.new(:date => Date.new(2014,8,1), :in_out => true) + expect(subject.tt_peculiar_days(time_table)).to eq("2014-08-01 ") + end + + end + + describe ".tt_excluded_days" do + + it "should return empty excluded dates" do + time_table.dates.clear + expect(subject.tt_excluded_days(time_table)).to eq("") + end + + it "should return excluded date" do + time_table.dates.clear + time_table.dates << Chouette::TimeTableDate.new(:date => Date.new(2014,8,1), :in_out => false) + expect(subject.tt_excluded_days(time_table)).to eq("2014-08-01 ") + end + + end + +end diff --git a/spec/requests/vehicle_journey_imports_spec.rb b/spec/requests/vehicle_journey_imports_spec.rb index 5197d4c70..d70eeea8f 100644 --- a/spec/requests/vehicle_journey_imports_spec.rb +++ b/spec/requests/vehicle_journey_imports_spec.rb @@ -34,7 +34,7 @@ describe "VehicleJourneyImports" do end describe "new" do - it "should create stop areas and return to stop areas index page" do + it "should create vehicle journey file and return to route show page" do visit new_referential_line_route_vehicle_journey_import_path(referential, route.line, route) attach_file('Fichier', valid_file_path) click_button "Lancer l'import" |
