diff options
| author | Michel Etienne | 2014-09-10 16:01:00 +0200 | 
|---|---|---|
| committer | Michel Etienne | 2014-09-10 16:01:00 +0200 | 
| commit | cd591d22126430fd9c1a132862067ce2528a917f (patch) | |
| tree | 0363ffe2b7f015f6085caa60009657d636efef52 | |
| parent | 298a091329613f2515da94f99678157e75c07063 (diff) | |
| download | chouette-core-cd591d22126430fd9c1a132862067ce2528a917f.tar.bz2 | |
export vehicle journeys with all time tables definition in a zip
| -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" | 
