aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Florisson2014-08-21 16:38:25 +0200
committerMarc Florisson2014-08-21 16:38:25 +0200
commit194bb28c4acbc144493c2096341d9126ffeaae35 (patch)
treedd7cb0ad2632cf92f94c1e5f6f98a58c2b185ff6
parentbeed6b8df8d86c86b69fcca2b602bf40e36dcb75 (diff)
parent0bc1d3150175f7db4942003af9a5ba641cce3ffd (diff)
downloadchouette-core-194bb28c4acbc144493c2096341d9126ffeaae35.tar.bz2
Merge branch 'sismo_vj_translate' into sismo
-rw-r--r--app/controllers/vehicle_translations_controller.rb35
-rw-r--r--app/models/vehicle_translation.rb58
-rw-r--r--app/views/vehicle_journeys/show.html.erb32
-rw-r--r--app/views/vehicle_translations/_translate_form.html.erb37
-rw-r--r--app/views/vehicle_translations/new.js.erb4
-rw-r--r--config/locales/vehicle_translations.yml25
-rw-r--r--spec/models/vehicle_translation_spec.rb16
7 files changed, 158 insertions, 49 deletions
diff --git a/app/controllers/vehicle_translations_controller.rb b/app/controllers/vehicle_translations_controller.rb
index af54001ae..65a0db7fe 100644
--- a/app/controllers/vehicle_translations_controller.rb
+++ b/app/controllers/vehicle_translations_controller.rb
@@ -1,5 +1,5 @@
class VehicleTranslationsController < ChouetteController
- respond_to :html, :only => [:create]
+ respond_to :js, :only => [:new, :create]
belongs_to :referential do
belongs_to :line, :parent_class => Chouette::Line do
@@ -8,17 +8,36 @@ class VehicleTranslationsController < ChouetteController
end
end
end
+ after_filter :clean_flash
+
+ def clean_flash
+ # only run this in case it's an Ajax request.
+ return unless request.xhr?
+
+ flash.discard
+ end
+
+ def new
+ @vehicle_translation = VehicleTranslation.new( :vehicle_journey_id => parent.id, :count => 1, :duration => 1)
+ render :action => :new
+ end
def create
+ @vehicle_translation = VehicleTranslation.new( params[:vehicle_translation].merge( :vehicle_journey_id => parent.id))
+
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
+ if @vehicle_translation.valid?
+ @vehicle_translation.translate
+ flash[:notice] = t('vehicle_translations.success', :count => @vehicle_translation.count)
+ else
+ flash[:alert] = @vehicle_translation.errors[ :vehicle_journey_id] unless @vehicle_translation.errors[ :vehicle_journey_id].empty?
+ end
+ rescue => e
+ Rails.logger.error( "VehicleTranslation error, @vehicle_translation=#{@vehicle_translation.inspect}")
+ Rails.logger.error( e.inspect)
flash[:alert] = t('vehicle_translations.failure')
end
- redirect_to referential_line_route_vehicle_journeys_path(@referential, @line, @route)
-
+ render :action => :new
end
-
+
end
diff --git a/app/models/vehicle_translation.rb b/app/models/vehicle_translation.rb
index 5fc7117eb..0457da0fa 100644
--- a/app/models/vehicle_translation.rb
+++ b/app/models/vehicle_translation.rb
@@ -1,22 +1,44 @@
class VehicleTranslation
- include ActiveModel::Validations
- include ActiveModel::Conversion
+ include ActiveModel::Validations
+ include ActiveModel::Conversion
extend ActiveModel::Naming
-
-
+
attr_accessor :vehicle_journey_id, :count, :duration
-
+ attr_accessor :first_stop_arrival_time, :first_stop_departure_time
+
validates_presence_of :count, :duration
+ validates_numericality_of :count, greater_than: 0
+ validates_numericality_of :duration, greater_than: 0
+ validate :starting_time_provided
+ validate :vehicle_has_stop_times
+
+ def initialize(attributes = {})
+ attributes.each do |name, value|
+ send("#{name}=", value)
+ end
+ end
- def initialize(attributes = {})
- attributes.each do |name, value|
- send("#{name}=", value)
- end
- end
-
- def persisted?
- false
- end
+ def starting_time_provided
+ if ( first_stop_arrival_time.blank? && first_stop_departure_time.blank?)
+ errors.add :first_stop_arrival_time, I18n.t('activemodel.errors.models.vehicle_translation.missing_start_time')
+ errors.add :first_stop_departure_time, I18n.t('activemodel.errors.models.vehicle_translation.missing_start_time')
+ #errors.add( :first_stop_departure_time => "un horaire de départ ou d'arrivée au premier arrêt doit être renseigné")
+ elsif first_stop_departure_time.blank?
+ errors.add :first_stop_arrival_time, I18n.t('activemodel.errors.models.vehicle_translation.unreadable_time') unless Time.parse( self.first_stop_arrival_time) rescue false
+ elsif first_stop_arrival_time.blank?
+ errors.add :first_stop_departure_time, I18n.t('activemodel.errors.models.vehicle_translation.unreadable_time') unless Time.parse( self.first_stop_departure_time) rescue false
+ end
+ end
+
+ def vehicle_has_stop_times
+ if vehicle_journey.vehicle_journey_at_stops.empty?
+ errors.add :vehicle_journey_id, I18n.t('activemodel.errors.models.vehicle_translation.uncompiliant_vehicle')
+ end
+ end
+
+ def persisted?
+ false
+ end
def translate
vehicle = vehicle_journey
@@ -37,9 +59,13 @@ class VehicleTranslation
end
end
-
+
+ def first_stop_name
+ @first_stop_name ||= vehicle_journey.vehicle_journey_at_stops.first.stop_point.stop_area.name
+ end
+
def vehicle_journey
- Chouette::VehicleJourney.find( vehicle_journey_id)
+ @vehicle_journey ||= Chouette::VehicleJourney.find( vehicle_journey_id)
end
def self.from_vehicle( vehicle)
diff --git a/app/views/vehicle_journeys/show.html.erb b/app/views/vehicle_journeys/show.html.erb
index 92cce447d..4068757c9 100644
--- a/app/views/vehicle_journeys/show.html.erb
+++ b/app/views/vehicle_journeys/show.html.erb
@@ -1,5 +1,17 @@
<%= title_tag vehicle_title(@vehicle_journey) %>
+<div id="modal_translation" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+ <h4 class="modal-title" id="myModalLabel"><%= t('.translation_form') %></h4>
+ <p id="translate_form"></p>
+ </div>
+ </div>
+ </div>
+</div>
+
<div class="vehicle_journey">
<div class="summary">
<p>
@@ -93,25 +105,13 @@
<%= paginated_content @vehicle_journey.time_tables, "time_table" %>
</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, :data => {:confirm => t('vehicle_journeys.actions.destroy_confirm')}, :class => "remove" %></li>
- </ul>
- <% unless @vehicle_journey.vehicle_journey_at_stops.empty? ||
- @vehicle_journey.vehicle_journey_at_stops.any? { |vjas| vjas.departure_time.nil? } %>
- <h4><%= t('.translation_form') %></h4>
- <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>
- <%= creation_tag(@vehicle_journey) %>
+ <% unless @vehicle_journey.vehicle_journey_at_stops.empty? %>
+ <li><%= link_to t('.translation_form'), new_referential_line_route_vehicle_journey_vehicle_translation_path(@referential, @line, @route, @vehicle_journey), {:remote => true, 'data-toggle' => "modal", 'data-target' => '#modal_translation'} %></li>
<% end %>
+ </ul>
<% end %>
diff --git a/app/views/vehicle_translations/_translate_form.html.erb b/app/views/vehicle_translations/_translate_form.html.erb
new file mode 100644
index 000000000..ea7e15bf0
--- /dev/null
+++ b/app/views/vehicle_translations/_translate_form.html.erb
@@ -0,0 +1,37 @@
+<div id="translate_form">
+ <%= render "shared/flash_messages" %>
+ <%= semantic_form_for [@referential, @line, @route, @vehicle_journey, @vehicle_translation], remote: true do |form| %>
+ <div class="modal-body">
+ <%= form.inputs do %>
+ <%= form.input :first_stop_arrival_time,
+ as: :time_picker, label: t( ".first_stop_arrival_time", stop_name: @vehicle_translation.first_stop_name),
+ input_html: { class: "form-control input-sm timepicker_basic"}, wrapper_html: { class: "input-append bootstrap-timepicker" } %>
+ <%= form.input :first_stop_departure_time,
+ as: :time_picker, label: t( ".first_stop_departure_time", stop_name: @vehicle_translation.first_stop_name),
+ input_html: { class: "form-control input-sm timepicker_basic"}, wrapper_html: { class: "input-append bootstrap-timepicker" } %>
+ <div class="panel-group" id="accordion">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h4 class="panel-title">
+ <a data-toggle="collapse" data-parent="#accordion" href="#collapseOne">
+ <%= t('.multiple_cloning_form') %>
+ </a>
+ </h4>
+ </div>
+ <div id="collapseOne" class="panel-collapse collapse in">
+ <div class="panel-body">
+ <%= form.input :duration, as: :number %>
+ <%= form.input :count, as: :number %>
+ </div>
+ </div>
+ </div>
+ </div>
+ <% end %>
+ </div>
+ <div class="modal-footer">
+ <%= form.actions do %>
+ <%= form.action :submit, as: :button, label: t('.validation') %>
+ <% end %>
+ <% end %>
+ </div>
+</div>
diff --git a/app/views/vehicle_translations/new.js.erb b/app/views/vehicle_translations/new.js.erb
new file mode 100644
index 000000000..0c7869fb6
--- /dev/null
+++ b/app/views/vehicle_translations/new.js.erb
@@ -0,0 +1,4 @@
+var modal_translation_content = '<%= escape_javascript( render "vehicle_translations/translate_form") %> ';
+$('#translate_form').html(modal_translation_content);
+
+
diff --git a/config/locales/vehicle_translations.yml b/config/locales/vehicle_translations.yml
index 3d1e0b702..9c413f2b3 100644
--- a/config/locales/vehicle_translations.yml
+++ b/config/locales/vehicle_translations.yml
@@ -2,18 +2,39 @@ en:
vehicle_translations:
success: "%{count} vehicle journeys created by translation"
failure: "Fail when creating vehicle journeys by translation"
- activemodel:
+ first_stop_arrival_time: "Arrival time at first stop (%{stop_name})"
+ first_stop_departure_time: "Arrival time at first stop (%{stop_name})"
+ translate_form:
+ multiple_cloning_form: "Repeat cloning based on a time interval"
+ activemodel:
attributes:
vehicle_translation:
duration: "Duration"
count: "Count"
+ errors:
+ models:
+ vehicle_translation:
+ missing_start_time: "Departure time or arrival time is required."
+ uncompiliant_vehicle: "Vehicle creation by copy requires that the selected vehicle counts at leat a stop and has departure and arrival times at each stops"
+ unreadable_time: "Expected time format is hh:mm"
fr:
vehicle_translations:
success: "%{count} course(s) crée(s) par translation"
failure: "Echec de la création de courses par tanslation"
- activemodel:
+ first_stop_arrival_time: "Horaire d'arrivée au premier arrêt (%{stop_name})"
+ first_stop_departure_time: "Horaire de départ au premier arrêt (%{stop_name})"
+ translate_form:
+ multiple_cloning_form: "Répéter le clonage à intervalle régulier"
+
+ activemodel:
attributes:
vehicle_translation:
duration: "Durée de l'intervalle (en minutes)"
count: "Quantité de courses à ajouter"
+ errors:
+ models:
+ vehicle_translation:
+ missing_start_time: "L'horaire de départ ou celui d'arrivée est requis"
+ uncompiliant_vehicle: "Pour cloner une course, celle-ci doit compter au moins un arrêt et avoir des horaires départ arrivée sur tous ses arrêts"
+ unreadable_time: "Le format d'horaire attendu est hh:mm"
diff --git a/spec/models/vehicle_translation_spec.rb b/spec/models/vehicle_translation_spec.rb
index 2a9c53371..47be9ff3a 100644
--- a/spec/models/vehicle_translation_spec.rb
+++ b/spec/models/vehicle_translation_spec.rb
@@ -3,15 +3,17 @@ require 'spec_helper'
describe VehicleTranslation do
let!(:company){ Factory(:company )}
let!(:journey_pattern){Factory(:journey_pattern)}
- let!(:vehicle_journey){ Factory(:vehicle_journey,
+ let!(:vehicle_journey){ Factory(:vehicle_journey,
:objectid => "dummy",
:journey_pattern => journey_pattern,
:route => journey_pattern.route,
:company => company,
- :transport_mode => Chouette::TransportMode.new("metro"),
+ :transport_mode => Chouette::TransportMode.new("metro"),
:published_journey_name => "dummy"
)}
- subject {Factory.build(:vehicle_translation, :vehicle_journey_id => vehicle_journey.id)}
+ subject {Factory.build(:vehicle_translation,
+ :vehicle_journey_id => vehicle_journey.id,
+ :first_stop_departure_time => "12:00")}
describe "#translate" do
it "should add new vehicle" do
@@ -29,19 +31,19 @@ describe VehicleTranslation do
end
it "should add vehicle having same transport_mode" do
subject.translate
- last_created_vehicle.transport_mode.should == vehicle_journey.transport_mode
+ 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
+ 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
+ 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
+ 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