aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichel Etienne2014-09-10 16:01:00 +0200
committerMichel Etienne2014-09-10 16:01:00 +0200
commitcd591d22126430fd9c1a132862067ce2528a917f (patch)
tree0363ffe2b7f015f6085caa60009657d636efef52
parent298a091329613f2515da94f99678157e75c07063 (diff)
downloadchouette-core-cd591d22126430fd9c1a132862067ce2528a917f.tar.bz2
export vehicle journeys with all time tables definition in a zip
-rw-r--r--app/controllers/vehicle_journey_exports_controller.rb11
-rw-r--r--app/models/vehicle_journey_export.rb70
-rw-r--r--app/views/vehicle_journeys/index.html.erb2
-rw-r--r--config/locales/vehicle_journey_exports.yml20
-rw-r--r--spec/models/vehicle_journey_export_spec.rb85
-rw-r--r--spec/requests/vehicle_journey_imports_spec.rb2
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"