aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Florisson2012-07-06 16:45:42 +0200
committerMarc Florisson2012-07-06 16:45:42 +0200
commita94b6b696990fd038cc425ed93f6971c1093e8cf (patch)
treeb3f1c76361cf124cf8098e61f9f7e23dd53c4b96
parent9758efc6d12d8dd2e38a43aa0103ce2a38e27ffd (diff)
downloadchouette-core-a94b6b696990fd038cc425ed93f6971c1093e8cf.tar.bz2
fix Refs #88, Refs #85, Refs #82
-rw-r--r--app/assets/stylesheets/journey_patterns.css.scss3
-rw-r--r--app/assets/stylesheets/layout.css.scss23
-rw-r--r--app/assets/stylesheets/lines.css.scss9
-rw-r--r--app/assets/stylesheets/vehicle_journeys.css.scss35
-rw-r--r--app/controllers/vehicle_journeys_controller.rb4
-rw-r--r--app/controllers/vehicle_translations_controller.rb24
-rw-r--r--app/models/vehicle_translation.rb49
-rw-r--r--app/views/routes/show.html.erb18
-rw-r--r--app/views/vehicle_journeys/_timeless_vehicle_journey.html.erb15
-rw-r--r--app/views/vehicle_journeys/index.html.erb5
-rw-r--r--app/views/vehicle_journeys/show.html.erb26
-rw-r--r--app/views/vehicle_journeys/timeless.html.erb28
-rw-r--r--config/locales/routes.yml4
-rw-r--r--config/locales/vehicle_journeys.yml13
-rw-r--r--config/locales/vehicle_translations.yml19
-rw-r--r--config/routes.rb6
-rw-r--r--spec/factories.rb5
-rw-r--r--spec/models/vehicle_translation_spec.rb60
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
+