diff options
| author | Marc Florisson | 2012-07-06 16:45:42 +0200 | 
|---|---|---|
| committer | Marc Florisson | 2012-07-06 16:45:42 +0200 | 
| commit | a94b6b696990fd038cc425ed93f6971c1093e8cf (patch) | |
| tree | b3f1c76361cf124cf8098e61f9f7e23dd53c4b96 | |
| parent | 9758efc6d12d8dd2e38a43aa0103ce2a38e27ffd (diff) | |
| download | chouette-core-a94b6b696990fd038cc425ed93f6971c1093e8cf.tar.bz2 | |
fix Refs #88, Refs #85, Refs #82
| -rw-r--r-- | app/assets/stylesheets/journey_patterns.css.scss | 3 | ||||
| -rw-r--r-- | app/assets/stylesheets/layout.css.scss | 23 | ||||
| -rw-r--r-- | app/assets/stylesheets/lines.css.scss | 9 | ||||
| -rw-r--r-- | app/assets/stylesheets/vehicle_journeys.css.scss | 35 | ||||
| -rw-r--r-- | app/controllers/vehicle_journeys_controller.rb | 4 | ||||
| -rw-r--r-- | app/controllers/vehicle_translations_controller.rb | 24 | ||||
| -rw-r--r-- | app/models/vehicle_translation.rb | 49 | ||||
| -rw-r--r-- | app/views/routes/show.html.erb | 18 | ||||
| -rw-r--r-- | app/views/vehicle_journeys/_timeless_vehicle_journey.html.erb | 15 | ||||
| -rw-r--r-- | app/views/vehicle_journeys/index.html.erb | 5 | ||||
| -rw-r--r-- | app/views/vehicle_journeys/show.html.erb | 26 | ||||
| -rw-r--r-- | app/views/vehicle_journeys/timeless.html.erb | 28 | ||||
| -rw-r--r-- | config/locales/routes.yml | 4 | ||||
| -rw-r--r-- | config/locales/vehicle_journeys.yml | 13 | ||||
| -rw-r--r-- | config/locales/vehicle_translations.yml | 19 | ||||
| -rw-r--r-- | config/routes.rb | 6 | ||||
| -rw-r--r-- | spec/factories.rb | 5 | ||||
| -rw-r--r-- | spec/models/vehicle_translation_spec.rb | 60 | 
18 files changed, 325 insertions, 21 deletions
diff --git a/app/assets/stylesheets/journey_patterns.css.scss b/app/assets/stylesheets/journey_patterns.css.scss index afba352bd..7e9a747a5 100644 --- a/app/assets/stylesheets/journey_patterns.css.scss +++ b/app/assets/stylesheets/journey_patterns.css.scss @@ -23,10 +23,11 @@          /* to create multi-column index */          width: 350px;          padding-right: 10px; +        float: left;          .name {              line-height: 16px; -            float: left; +        //    float: left;          }      } diff --git a/app/assets/stylesheets/layout.css.scss b/app/assets/stylesheets/layout.css.scss index 79126e7ed..58d85b5a7 100644 --- a/app/assets/stylesheets/layout.css.scss +++ b/app/assets/stylesheets/layout.css.scss @@ -28,6 +28,29 @@ $text_color: #222;      }  } +#sidebar div#compact_form { +  form { +    border-bottom: 1px solid #BBB; +    fieldset { +      padding: 0; +      border: 0; +      li { +        padding: 0; +        label { padding-left: 20px;  +                width: 70%;} +        input { width: 20px; } +      } +    } +    fieldset.actions { +      margin-bottom: 0; +      padding-left: 20px; +    } +    fieldset.inputs { +      padding-top: 16px; +    } +  } +} +  #sidebar ul.selection li {      a {          padding-left: 20px; diff --git a/app/assets/stylesheets/lines.css.scss b/app/assets/stylesheets/lines.css.scss index f66f8badd..26cad4873 100644 --- a/app/assets/stylesheets/lines.css.scss +++ b/app/assets/stylesheets/lines.css.scss @@ -62,10 +62,13 @@      h3.routes { clear: both; }      .route { +        @include div_for_object; +        /* to create multi-column index */ +        width: 350px; +        height: 65; +        float: left; +        padding-right: 10px;          margin-bottom: 0px; -        .info { -            margin-bottom: 30px; -        }      }      .summary p label { diff --git a/app/assets/stylesheets/vehicle_journeys.css.scss b/app/assets/stylesheets/vehicle_journeys.css.scss index 08db4cf25..5df48efbc 100644 --- a/app/assets/stylesheets/vehicle_journeys.css.scss +++ b/app/assets/stylesheets/vehicle_journeys.css.scss @@ -127,5 +127,40 @@      }  }         +#workspace.vehicle_journeys.timeless +{ +    .summary p label { +        font-weight: bold; +    } +     +    .vehicle_journey:after {  +        @include after_div_for_object;   +    } + +    .vehicle_journeys { +        margin-top: 20px; +    } + +    .vehicle_journeys:after { +        @include content_to_clear; +    } + +    .vehicle_journey { +        @include div_for_object; +        /* to create multi-column index */ +        width: 350px; +        height: 65; +        float: left; +        padding-right: 10px; + +        span.included_day_type { +            font-weight: bolder; +            color: black; +        } +        span.excluded_day_type { +        } +    } +}         + diff --git a/app/controllers/vehicle_journeys_controller.rb b/app/controllers/vehicle_journeys_controller.rb index 9248f88de..8c156d259 100644 --- a/app/controllers/vehicle_journeys_controller.rb +++ b/app/controllers/vehicle_journeys_controller.rb @@ -9,6 +9,10 @@ class VehicleJourneysController < ChouetteController      end    end +  def timeless +    @vehicle_journeys = parent.vehicle_journeys.select { |v| v.vehicle_journey_at_stops.empty? } +  end +    def select_journey_pattern      if params[:journey_pattern_id]        selected_journey_pattern = Chouette::JourneyPattern.find( params[:journey_pattern_id]) diff --git a/app/controllers/vehicle_translations_controller.rb b/app/controllers/vehicle_translations_controller.rb new file mode 100644 index 000000000..af54001ae --- /dev/null +++ b/app/controllers/vehicle_translations_controller.rb @@ -0,0 +1,24 @@ +class VehicleTranslationsController < ChouetteController +  respond_to :html, :only => [:create] + +  belongs_to :referential do +    belongs_to :line, :parent_class => Chouette::Line do +      belongs_to :route, :parent_class => Chouette::Route do +        belongs_to :vehicle_journey, :parent_class => Chouette::VehicleJourney +      end +    end +  end + +  def create +    begin +      translation = VehicleTranslation.new( params[:vehicle_translation].merge( :vehicle_journey_id => parent.id)) +      translation.translate +      flash[:notice] = t('vehicle_translations.success', :count => translation.count) +    rescue +      flash[:alert] = t('vehicle_translations.failure') +    end +    redirect_to referential_line_route_vehicle_journeys_path(@referential, @line, @route) + +  end +   +end diff --git a/app/models/vehicle_translation.rb b/app/models/vehicle_translation.rb new file mode 100644 index 000000000..cb46a4558 --- /dev/null +++ b/app/models/vehicle_translation.rb @@ -0,0 +1,49 @@ +class VehicleTranslation +  include ActiveModel::Validations   +  include ActiveModel::Conversion   +  extend ActiveModel::Naming +   +     +  attr_accessor :vehicle_journey_id, :count, :duration +   +  validates_presence_of :count, :duration + +  def initialize(attributes = {})   +    attributes.each do |name, value|   +      send("#{name}=", value)   +    end   +  end   +     +  def persisted?   +    false   +  end  + +  def translate +    vehicle = vehicle_journey +    copied_attributes = vehicle_journey.attributes +    copied_attributes.delete( "id") +    copied_attributes.delete( "objectid") + +    1.upto( count.to_i) do |index| +      translated = Chouette::VehicleJourney.create( copied_attributes) +      vehicle.vehicle_journey_at_stops.each do |vjas| +        vjas_attributes = vjas.attributes.merge( "vehicle_journey_id" => translated.id) +        vjas_attributes.merge! "departure_time" => ( vjas_attributes[ "departure_time"] + (index * duration.to_i.minutes) ), +          "arrival_time" => ( vjas_attributes[ "arrival_time"] + (index * duration.to_i.minutes) ) + +        Chouette::VehicleJourneyAtStop.create( vjas_attributes) +      end + +    end +  end +   +  def vehicle_journey +    Chouette::VehicleJourney.find( vehicle_journey_id) +  end + +  def self.from_vehicle( vehicle) +    VehicleTranslation.new( :vehicle_journey_id => vehicle.id, +                            :count => 0, +                            :translation => 5.minutes) +  end +end diff --git a/app/views/routes/show.html.erb b/app/views/routes/show.html.erb index 0666fdcf5..04b00f497 100644 --- a/app/views/routes/show.html.erb +++ b/app/views/routes/show.html.erb @@ -64,7 +64,7 @@  </div> -<h3 class="route_stop_points"><%= t('.stop_points') %></h3> +<h3 class="route_stop_points"><%= t('.stop_points') %><a name="stop_points"/></h3>  <div class="pagination">    <div class="page_info">      <%= page_entries_info @stop_points %> @@ -78,7 +78,7 @@    <%= will_paginate @stop_points, :container => false %>  </div> -<h3 class="route_journey_patterns"><%= t('.journey_patterns') %></h3> +<h3 class="route_journey_patterns"><%= t('.journey_patterns') %><a name="journey_patterns"/></h3>  <div class="journey_patterns">    <%= render :partial => "journey_patterns/journey_pattern", :collection => @route.journey_patterns %>  </div> @@ -86,15 +86,21 @@  <% content_for :sidebar do %>  <ul class="actions">    <li><%= link_to t('routes.actions.edit'), edit_referential_line_route_path(@referential, @line, @route), :class => "edit" %></li> -  <li><%= link_to  t('routes.actions.destroy'), referential_line_route_path(@referential, @line, @route), :method => :delete, :confirm =>  t('routes.actions.destroy_confirm'), :class => "remove" %></li> +  <li><%= link_to t('routes.actions.destroy'), referential_line_route_path(@referential, @line, @route), :method => :delete, :confirm =>  t('routes.actions.destroy_confirm'), :class => "remove" %></li>    <li> -    <%= link_to  t('stop_points.actions.sort'), referential_line_route_stop_points_path(@referential, @line, @route), :class => "edit" %> +    <%= link_to t('stop_points.actions.sort'), [@referential, @line, @route, :stop_points], :class => "edit" %>    </li>    <li> -    <%= link_to  t('journey_patterns.actions.new'), new_referential_line_route_journey_pattern_path(@referential, @line, @route), :class => "add" %> +    <%= link_to t('journey_patterns.actions.new'), new_referential_line_route_journey_pattern_path(@referential, @line, @route), :class => "add" %>    </li>    <li> -    <%= link_to  t('vehicle_journeys.actions.index'), referential_line_route_vehicle_journeys_path(@referential, @line, @route), :class => "link" %> +    <%= link_to t('vehicle_journeys.actions.index'), [@referential, @line, @route, :vehicle_journeys], :class => "link" %> +  </li> +  <li> +    <%= link_to t(".journey_patterns"), "#journey_patterns", :class => "select_parent" %> +  </li> +  <li> +    <%= link_to t(".stop_points"), "#stop_points", :class => "select_parent" %>    </li>  </ul>  <% end %> diff --git a/app/views/vehicle_journeys/_timeless_vehicle_journey.html.erb b/app/views/vehicle_journeys/_timeless_vehicle_journey.html.erb new file mode 100644 index 000000000..ad691a2fe --- /dev/null +++ b/app/views/vehicle_journeys/_timeless_vehicle_journey.html.erb @@ -0,0 +1,15 @@ +<%= div_for(vehicle_journey) do %> +  <%= link_to vehicle_name(vehicle_journey), [@referential, @line, @route, vehicle_journey] %> +  <div class="info"> +    <% unless vehicle_journey.time_tables.empty? %> +      <%= vehicle_journey.human_attribute_name('time_tables') %> <%= time_tables_info( vehicle_journey) %> - +    <% end %> +    <% if vehicle_journey.journey_pattern %> +      <%= vehicle_journey.human_attribute_name('journey_pattern') %> <%= link_to journey_name(vehicle_journey.journey_pattern), [@referential, @line, @route, vehicle_journey.journey_pattern] %> +    <% end %> +    <div class="actions">   +      <%= link_to t("actions.edit"), edit_referential_line_route_vehicle_journey_path(@referential, @line, @route, vehicle_journey), :class => "edit" %> | +      <%= link_to t("actions.destroy"), [@referential, @line, @route, vehicle_journey], :method => :delete, :confirm =>  t('vehicle_journeys.actions.destroy_confirm'), :class => "remove" %> +    </div> +  </div> +<% end %> diff --git a/app/views/vehicle_journeys/index.html.erb b/app/views/vehicle_journeys/index.html.erb index 3d5bf31ac..456abf5d2 100644 --- a/app/views/vehicle_journeys/index.html.erb +++ b/app/views/vehicle_journeys/index.html.erb @@ -60,7 +60,10 @@  <% content_for :sidebar do %>    <ul class="actions">      <li> -      <%= link_to  t('vehicle_journeys.actions.new'), new_referential_line_route_vehicle_journey_path(@referential, @line, @route), :class => "add" %> +      <%= 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>    </ul>    <h3><%= t(".selection") %></h3> diff --git a/app/views/vehicle_journeys/show.html.erb b/app/views/vehicle_journeys/show.html.erb index 8570261dd..26c5b4070 100644 --- a/app/views/vehicle_journeys/show.html.erb +++ b/app/views/vehicle_journeys/show.html.erb @@ -76,11 +76,23 @@  <h3><%= t('.time_tables') %></h3>  <div class="vehicle_journey_time_tables"> -<%= render :partial => "vehicle_journeys/time_table", :collection => @vehicle_journey.time_tables %> -</div> -<% content_for :sidebar do %> -<ul class="actions"> -  <li><%= link_to t('vehicle_journeys.actions.edit'), edit_referential_line_route_vehicle_journey_path(@referential, @line, @route, @vehicle_journey), :class => "edit" %></li> -  <li><%= link_to  t('vehicle_journeys.actions.destroy'), referential_line_route_vehicle_journey_path(@referential, @line, @route, @vehicle_journey), :method => :delete, :confirm =>  t('vehicle_journeys.actions.destroy_confirm'), :class => "remove" %></li> -</ul> +  <%= render :partial => "vehicle_journeys/time_table", :collection => @vehicle_journey.time_tables %> +  </div> +  <% content_for :sidebar do %> +  <ul class="actions"> +    <li><%= link_to t('vehicle_journeys.actions.edit'), edit_referential_line_route_vehicle_journey_path(@referential, @line, @route, @vehicle_journey), :class => "edit" %></li> +    <li><%= link_to  t('vehicle_journeys.actions.destroy'), referential_line_route_vehicle_journey_path(@referential, @line, @route, @vehicle_journey), :method => :delete, :confirm =>  t('vehicle_journeys.actions.destroy_confirm'), :class => "remove" %></li> +  </ul> +  <h3>Cloner la course</h3> +  <div id="compact_form" > +  <%= semantic_form_for [@referential, @line, @route, @vehicle_journey, VehicleTranslation.new] do |form| %> +  <%= form.inputs do %>  +    <%= form.input :duration %> +    <%= form.input :count %> +    <% end %> +    <%= form.actions do %> +      <%= form.action :submit, :as => :button, :label => t('.validation') %> +    <% end %> +  <% end %> +  </div>  <% end %> diff --git a/app/views/vehicle_journeys/timeless.html.erb b/app/views/vehicle_journeys/timeless.html.erb new file mode 100644 index 000000000..af5ee93ea --- /dev/null +++ b/app/views/vehicle_journeys/timeless.html.erb @@ -0,0 +1,28 @@ +<%= title_tag t('.title', :route => @route.name ) %> + +<div class="timeless_vehicle_journey_index"> +  <div class="summary"> +    <p> +      <label><%= @route.human_attribute_name(:line) %>: </label> +      <%= link_to line_formatted_name( @line), [@referential, @line] %> +    </p> +    <p> +      <label><%= Chouette::Route.model_name.human %>: </label> +      <%= link_to @route.name, [@referential, @line, @route] %> +    </p> +  </div> +</div> + +<h3><%= t('.vehicles_list') %></h3> +<div class="timeless_vehicles"> +  <%= render :partial => "timeless_vehicle_journey", :collection => @vehicle_journeys, :as => :vehicle_journey %> +</div> + +<% content_for :sidebar do %> +<ul class="actions"> +  <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('.vehicle_journeys'), [@referential, @line, @route, :vehicle_journeys], :class => "link" %></li> +</ul> +<% end %> diff --git a/config/locales/routes.yml b/config/locales/routes.yml index 7ab2ca623..36de61539 100644 --- a/config/locales/routes.yml +++ b/config/locales/routes.yml @@ -31,6 +31,8 @@ en:            positive: forward            negative: backward          line: Line +        vehicle_journeys: Vehicle journeys +        journey_patterns: Journey patterns          name: Name          published_name: Published name                  comment: Comments @@ -76,6 +78,8 @@ fr:            positive: Aller            negative: Retour          line: Ligne +        vehicle_journeys: Courses +        journey_patterns: Missions          name: Nom          published_name: Nom public                  number: Indice diff --git a/config/locales/vehicle_journeys.yml b/config/locales/vehicle_journeys.yml index 801163b82..bc6a05427 100644 --- a/config/locales/vehicle_journeys.yml +++ b/config/locales/vehicle_journeys.yml @@ -19,6 +19,10 @@ en:        departure: Departure        arrival: Arrival        time_tables: Associated calendars to vehicle journey +    timeless: +      title: Timeless vehicle journeys +      vehicle_journeys: Vehicle journeys with times at stop +      vehicles_list: Vehicles list      show:        title: Vehicle Journey %{vehicle journey}        stop_title: Stop @@ -26,6 +30,7 @@ en:        arrival: Arrival        time_tables: Calendars list        bounding: From %{start} to %{end} +      validation: Clone      index:        title: Vehicle journeys on route %{route}        vehicle_journeys: "Departure's times" @@ -45,6 +50,7 @@ en:          line: Line          route: Route          journey_pattern: Journey Pattern +        time_tables: Calendars          time_slot: Time Slot          company: Company          comment: Comments @@ -86,6 +92,10 @@ fr:        departure: Départ        arrival: Arrivée        time_tables: Calendriers associés à la course +    timeless: +      title: Courses sans horaire +      vehicle_journeys: Courses ayant des horaires +      vehicles_list: Liste des courses      show:        title: "Course au départ de %{stop} à %{time} sur la séquence %{route}"        stop_title: Arrêt @@ -93,8 +103,10 @@ fr:        arrival: Arrivée        time_tables: Liste des calendriers        bounding: De %{start} à %{end} +      validation: Cloner      index:        title: "Courses de la séquence d'arrêts %{route}" +      timeless: Courses sans horaire        vehicle_journeys: "Horaires de départ aux arrêts"        selection: Filtrer sur        selection_all: Tous @@ -112,6 +124,7 @@ fr:          line: Ligne          route: "Séquence d'arrêt"          journey_pattern: Mission +        time_tables: Calendriers          time_slot: Fréquence          company: Transporteur          comment: Commentaires diff --git a/config/locales/vehicle_translations.yml b/config/locales/vehicle_translations.yml new file mode 100644 index 000000000..f945cc81c --- /dev/null +++ b/config/locales/vehicle_translations.yml @@ -0,0 +1,19 @@ +en: +  vehicle_translations: +    success: "%{count} vehicle journeys created by translation" +    failure: "Fail when creating vehicle journeys by translation" +  activemodel:         +    attributes: +      vehicle_translation: +        duration: Duration +        count: Count +fr: +  vehicle_translations: +    success: "%{count} course(s) crée(s) par translation" +    failure: "Echec de la création de courses par tanslation" +  activemodel:         +    attributes: +      vehicle_translation: +        duration: "Durée de l'intervalle (en minutes)" +        count: "Quantité de courses à ajouter" + diff --git a/config/routes.rb b/config/routes.rb index f74c74c28..6c3969f4f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -37,9 +37,9 @@ ChouetteIhm::Application.routes.draw do            end          end          resources :vehicle_journeys do -          member do -            get 'select_journey_pattern' -          end +          get 'timeless', :on => :collection +          get 'select_journey_pattern', :on => :member +          resources :vehicle_translations          end          resources :stop_points do            collection do diff --git a/spec/factories.rb b/spec/factories.rb index faf1fef94..8e62b3b64 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -33,4 +33,9 @@ FactoryGirl.define do      f.sequence(:key) { "key_#{n}" }    end +  factory :vehicle_translation do |f| +    f.count 1 +    f.duration 1 +  end +  end diff --git a/spec/models/vehicle_translation_spec.rb b/spec/models/vehicle_translation_spec.rb new file mode 100644 index 000000000..2a9c53371 --- /dev/null +++ b/spec/models/vehicle_translation_spec.rb @@ -0,0 +1,60 @@ +require 'spec_helper' + +describe VehicleTranslation do +  let!(:company){ Factory(:company )} +  let!(:journey_pattern){Factory(:journey_pattern)} +  let!(:vehicle_journey){ Factory(:vehicle_journey,  +                                  :objectid => "dummy", +                                  :journey_pattern => journey_pattern, +                                  :route => journey_pattern.route, +                                  :company => company, +                                  :transport_mode => Chouette::TransportMode.new("metro"),  +                                  :published_journey_name => "dummy" +                                  )} +  subject {Factory.build(:vehicle_translation, :vehicle_journey_id => vehicle_journey.id)} + +  describe "#translate" do +    it "should add new vehicle" do +      count_before = Chouette::VehicleJourney.count +      subject.translate +      count_after = Chouette::VehicleJourney.count +      count_after.should == count_before + subject.count.to_i +    end +    def last_created_vehicle +      Chouette::VehicleJourney.find( :all, :order => :creation_time).last +    end +    it "should add vehicle having same published_journey_name" do +      subject.translate +      last_created_vehicle.published_journey_name.should == vehicle_journey.published_journey_name +    end +    it "should add vehicle having same transport_mode" do +      subject.translate +      last_created_vehicle.transport_mode.should == vehicle_journey.transport_mode  +    end +    it "should add vehicle having same journey_pattern" do +      subject.translate +      last_created_vehicle.journey_pattern.should == vehicle_journey.journey_pattern  +    end +    it "should add vehicle having same route" do +      subject.translate +      last_created_vehicle.route.should == vehicle_journey.route  +    end +    it "should add vehicle having same company" do +      subject.translate +      last_created_vehicle.company.should == vehicle_journey.company  +    end +    it "should add vehicle with as many vehicle_journey_at_stops as on basic vehicle" do +      subject.translate +      last_created_vehicle.vehicle_journey_at_stops.count.should == vehicle_journey.vehicle_journey_at_stops.count +    end +    it "should add vehicle where vehicle_journey_at_stops are translated with #duration" do +      read_vehicle = Chouette::VehicleJourney.find(vehicle_journey.id)  # read from bd, change time values +      subject.translate +      last_created_vehicle.vehicle_journey_at_stops.each_with_index do |vjas, index| +        vjas.departure_time.should == (read_vehicle.vehicle_journey_at_stops[index].departure_time + subject.duration.minutes) +        vjas.arrival_time.should == (read_vehicle.vehicle_journey_at_stops[index].arrival_time + subject.duration.minutes) +      end +    end +  end +end +  | 
