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 + |
