aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXinhui2017-04-12 12:36:22 +0200
committerXinhui2017-04-12 12:36:32 +0200
commitd7c6d5ce602219b9bfa47686542dd575f1fe2e50 (patch)
treeb418dd68f2a796b172fda0d90f960606f9fb8865
parent0ee6e6c7a85fa72d325ad32d8aa33583919692fd (diff)
downloadchouette-core-d7c6d5ce602219b9bfa47686542dd575f1fe2e50.tar.bz2
Remove auto create vjas on jv create if all departure time is set to 00:00
Refs #3101
-rw-r--r--app/controllers/vehicle_journeys_controller.rb48
-rw-r--r--app/models/chouette/vehicle_journey.rb13
-rw-r--r--config/initializers/ransack.rb13
-rw-r--r--spec/models/chouette/vehicle_journey_spec.rb15
4 files changed, 69 insertions, 20 deletions
diff --git a/app/controllers/vehicle_journeys_controller.rb b/app/controllers/vehicle_journeys_controller.rb
index 5382b1d4c..0f1d2142b 100644
--- a/app/controllers/vehicle_journeys_controller.rb
+++ b/app/controllers/vehicle_journeys_controller.rb
@@ -2,7 +2,6 @@ class VehicleJourneysController < ChouetteController
defaults :resource_class => Chouette::VehicleJourney
before_action :check_policy, only: [:edit, :update, :destroy]
before_action :user_permissions, only: :index
- before_action :ransack_params, only: :index
respond_to :json, :only => :index
respond_to :js, :only => [:select_journey_pattern, :edit, :new, :index]
@@ -61,8 +60,7 @@ class VehicleJourneysController < ChouetteController
}
end
- @jp_origin = Chouette::JourneyPattern.find_by(objectid: params[:jp])
-
+ @jp_origin = Chouette::JourneyPattern.find_by(objectid: params[:jp])
index! do
if collection.out_of_bounds?
@@ -80,14 +78,40 @@ class VehicleJourneysController < ChouetteController
protected
def collection
+ scope = route.vehicle_journeys.joins(:journey_pattern)#
+ scope = scope.joins('LEFT JOIN "vehicle_journey_at_stops" ON "vehicle_journey_at_stops"."vehicle_journey_id" = "vehicle_journeys"."id"')
+
+ @q = scope.search filtered_ransack_params
+ grouping = ransack_periode_filter
+ @q.build_grouping(grouping) if grouping
+
@ppage = 20
- @q = route.sorted_vehicle_journeys('vehicle_journeys').search params[:q]
- @vehicle_journeys = @q.result.paginate(:page => params[:page], :per_page => @ppage)
+ @vehicle_journeys = @q.result(distinct: true).paginate(:page => params[:page], :per_page => @ppage)
@footnotes = route.line.footnotes.to_json
@matrix = resource_class.matrix(@vehicle_journeys)
@vehicle_journeys
end
+ def ransack_periode_filter
+ if params[:q]
+ params[:q] = params[:q].reject{|k| params[:q][k] == 'undefined'}
+ between = [:departure_time_gteq, :departure_time_lteq].map do |filter|
+ "2000-01-01 #{params[:q]["vehicle_journey_at_stops_#{filter}"]}:00 UTC"
+ end
+ {
+ :m => 'or',
+ :vehicle_journey_at_stops_departure_time_between => between.join(' to '),
+ :vehicle_journey_at_stops_id_null => params[:q][:vehicle_journey_without_departure_time]
+ }
+ end
+ end
+
+ def filtered_ransack_params
+ if params[:q]
+ params[:q].except(:vehicle_journey_at_stops_departure_time_gteq, :vehicle_journey_at_stops_departure_time_lteq)
+ end
+ end
+
def adapted_params
params.tap do |adapted_params|
adapted_params.merge!( :route => parent)
@@ -121,20 +145,6 @@ class VehicleJourneysController < ChouetteController
end
private
- def ransack_params
- if params[:q]
- params[:q] = params[:q].reject{|k| params[:q][k] == 'undefined'}
- [:departure_time_gteq, :departure_time_lteq].each do |filter|
- time = params[:q]["vehicle_journey_at_stops_#{filter}"]
- params[:q]["vehicle_journey_at_stops_#{filter}"] = "2000-01-01 #{time}:00 UTC"
- end
-
- if params[:q]['vehicle_journey_without_departure_time'] == 'false'
- params[:q]["vehicle_journey_at_stops_departure_time_not_eq"] = '2000-01-01 00:00 UTC'
- end
- end
- end
-
def vehicle_journey_params
params.require(:vehicle_journey).permit( { footnote_ids: [] } , :journey_pattern_id, :number, :published_journey_name,
:published_journey_identifier, :comment, :transport_mode,
diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb
index a4a363348..d4a235c68 100644
--- a/app/models/chouette/vehicle_journey.rb
+++ b/app/models/chouette/vehicle_journey.rb
@@ -81,6 +81,14 @@ module Chouette
end
end
+ def state_update_vjas? vehicle_journey_at_stops
+ departure_times = vehicle_journey_at_stops.map do |vjas|
+ "#{vjas['departure_time']['hour']}:#{vjas['departure_time']['minute']}"
+ end
+ times = departure_times.uniq
+ (times.count == 1 && times[0] == '00:00') ? false : true
+ end
+
def self.state_update route, state
transaction do
state.each do |item|
@@ -88,7 +96,10 @@ module Chouette
vj = find_by(objectid: item['objectid']) || state_create_instance(route, item)
next if item['deletable'] && vj.persisted? && vj.destroy
- vj.update_vjas_from_state(item['vehicle_journey_at_stops'])
+ if vj.state_update_vjas?(item['vehicle_journey_at_stops'])
+ vj.update_vjas_from_state(item['vehicle_journey_at_stops'])
+ end
+
vj.update_attributes(state_permited_attributes(item))
item['errors'] = vj.errors if vj.errors.any?
end
diff --git a/config/initializers/ransack.rb b/config/initializers/ransack.rb
new file mode 100644
index 000000000..659ee4a79
--- /dev/null
+++ b/config/initializers/ransack.rb
@@ -0,0 +1,13 @@
+Ransack.configure do |config|
+ config.add_predicate 'between',
+ arel_predicate: 'between',
+ formatter: proc { |v| v.split(' to ') },
+ type: :string
+end
+module Arel
+ module Predications
+ def between other
+ gteq(other[0]).and(lt(other[1]))
+ end
+ end
+end
diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb
index c922731a7..8349199d2 100644
--- a/spec/models/chouette/vehicle_journey_spec.rb
+++ b/spec/models/chouette/vehicle_journey_spec.rb
@@ -59,6 +59,21 @@ describe Chouette::VehicleJourney, :type => :model do
}.to change {Chouette::VehicleJourneyAtStop.count}.by(1)
end
+ it 'should note save vehicle_journey_at_stops of newly created vj if all departure time is set to 00:00' do
+ new_vj = build(:vehicle_journey, objectid: nil, published_journey_name: 'dummy', route: route, journey_pattern: journey_pattern)
+ 2.times do
+ new_vj.vehicle_journey_at_stops << build(:vehicle_journey_at_stop,
+ :vehicle_journey => new_vj,
+ :stop_point => create(:stop_point),
+ :arrival_time => '2000-01-01 00:00:00 UTC',
+ :departure_time => '2000-01-01 00:00:00 UTC')
+ end
+ collection << vehicle_journey_to_state(new_vj)
+ expect {
+ Chouette::VehicleJourney.state_update(route, collection)
+ }.not_to change {Chouette::VehicleJourneyAtStop.count}
+ end
+
it 'should update vj journey_pattern' do
state['journey_pattern'] = create(:journey_pattern).attributes.slice('id', 'name', 'objectid')
Chouette::VehicleJourney.state_update(route, collection)