From c39928159ec2e3642df00e36bbb813fcd1da9998 Mon Sep 17 00:00:00 2001 From: Sinclair Target Date: Mon, 4 Mar 2019 16:15:58 -0600 Subject: [PATCH 1/4] Add of_line_type query helper to Line model. --- app/models/line.rb | 25 +++++++++++++++++++++++-- test/models/line_test.rb | 38 +++++++++++++++++++++++++++++++++----- 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/app/models/line.rb b/app/models/line.rb index 91c5e7c5..c315757c 100644 --- a/app/models/line.rb +++ b/app/models/line.rb @@ -8,6 +8,11 @@ class Line < ApplicationRecord self.primary_key = "onestop_id" + # GTFS route types + TRAM_SYSTEM_TYPE = 0 + METRO_SYSTEM_TYPE = 1 + BUS_SYSTEM_TYPE = 3 + # Returns the longest available name def long_name route_long_name ? route_long_name : name @@ -26,7 +31,7 @@ def bus? if system_type.nil? # Prefer system_type if present vehicle_type == "bus" else - system_type == 3 + system_type == BUS_SYSTEM_TYPE end end @@ -36,7 +41,23 @@ def train? if system_type.nil? vehicle_type == "tram" || vehicle_type == "metro" else - system_type == 0 || system_type == 1 + system_type == TRAM_SYSTEM_TYPE || system_type == METRO_SYSTEM_TYPE + end + end + + # Query for bus/train lines. + # line_type can be "train" or "bus". + def self.of_line_type(line_type) + if line_type == "train" + Line.where(system_type: [TRAM_SYSTEM_TYPE, METRO_SYSTEM_TYPE]) + .or(Line.where(vehicle_type: ["tram", "metro"])) + .order(:name) + elsif line_type == "bus" + Line.where(system_type: BUS_SYSTEM_TYPE) + .or(Line.where(vehicle_type: "bus")) + .order(:name) + else + Line.order(:name) end end end diff --git a/test/models/line_test.rb b/test/models/line_test.rb index 7be50138..6fddf739 100644 --- a/test/models/line_test.rb +++ b/test/models/line_test.rb @@ -3,6 +3,15 @@ require "test_helper" class LineTest < ActiveSupport::TestCase + setup do + Line.create(name: "RouteShort") + Line.create(name: "RouteShort", vehicle_type: "bus") + Line.create(name: "RouteShort", vehicle_type: "train") + Line.create(name: "RouteShort", system_type: Line::TRAM_SYSTEM_TYPE) + Line.create(name: "RouteShort", system_type: Line::METRO_SYSTEM_TYPE) + Line.create(name: "RouteShort", system_type: Line::BUS_SYSTEM_TYPE) + end + test "returns proper long name" do route_long_name = "RouteLong" route_short_name = "RouteShort" @@ -33,12 +42,12 @@ class LineTest < ActiveSupport::TestCase line = Line.new(vehicle_type: "bus") assert line.bus? - line = Line.new(system_type: 3) + line = Line.new(system_type: Line::BUS_SYSTEM_TYPE) assert line.bus? end test "bus? returns false if system type is not bus type" do - line = Line.new(system_type: 1, vehicle_type: "bus") + line = Line.new(system_type: Line::METRO_SYSTEM_TYPE, vehicle_type: "bus") assert_not line.bus? end @@ -48,10 +57,10 @@ class LineTest < ActiveSupport::TestCase end test "train? returns true if system type is tram or metro" do - line = Line.new(system_type: 0) + line = Line.new(system_type: Line::TRAM_SYSTEM_TYPE) assert line.train? - line = Line.new(system_type: 1) + line = Line.new(system_type: Line::METRO_SYSTEM_TYPE) assert line.train? end @@ -64,7 +73,7 @@ class LineTest < ActiveSupport::TestCase end test "train? returns false if system type is not tram or metro" do - line = Line.new(system_type: 3, vehicle_type: "tram") + line = Line.new(system_type: Line::BUS_SYSTEM_TYPE, vehicle_type: "tram") assert_not line.train? end @@ -78,4 +87,23 @@ class LineTest < ActiveSupport::TestCase assert_not line.bus? assert_not line.train? end + + test "of_line_type(bus) returns all bus lines" do + lines = Line.of_line_type("bus") + assert_not lines.empty? + assert lines.all?(&:bus?) + end + + test "of_line_type(train) returns all train lines" do + lines = Line.of_line_type("train") + assert_not lines.empty? + assert lines.all?(&:train?) + end + + test "of_line_type(nil) returns all lines" do + line_count = Line.count + lines = Line.of_line_type(nil) + assert_not lines.empty? + assert_equal line_count, lines.count + end end From c5f9ddc3679f07dfc8648eee75322218a3d44393 Mon Sep 17 00:00:00 2001 From: Sinclair Target Date: Mon, 4 Mar 2019 16:16:57 -0600 Subject: [PATCH 2/4] Restrict line dropdown when creating a new issue depending on line type. --- app/controllers/issues_controller.rb | 2 ++ app/views/issues/_form.html.erb | 3 ++- app/views/issues/new.html.erb | 4 ++-- app/views/pages/home.html.erb | 4 ++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 54e11bb8..9bc1f5cf 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -19,6 +19,8 @@ def new unless user_signed_in? redirect_to new_user_session_path end + + @line_type = params[:line_type] @issue = Issue.new(stop_onestop_id: params[:stop_id], line_onestop_id: params[:line_id]) end diff --git a/app/views/issues/_form.html.erb b/app/views/issues/_form.html.erb index b105b419..9a3d98b1 100644 --- a/app/views/issues/_form.html.erb +++ b/app/views/issues/_form.html.erb @@ -1,3 +1,4 @@ +<% line_type = nil if local_assigns[:line_type].nil? %> <%= form_for(issue) do |f| %> <% if issue.errors.any? %>
@@ -13,7 +14,7 @@
<%= f.label 'Line' %>
- <%= f.collection_select(:line_onestop_id, Line.order('vehicle_type DESC, name'), :id, :route_long_name, + <%= f.collection_select(:line_onestop_id, Line.of_line_type(line_type), :id, :route_long_name, {prompt: 'Select Line'}, {:class => "new-issue-line"} ) %> diff --git a/app/views/issues/new.html.erb b/app/views/issues/new.html.erb index 2d89bb56..fdf4cf9b 100644 --- a/app/views/issues/new.html.erb +++ b/app/views/issues/new.html.erb @@ -1,7 +1,7 @@

New Issue

- <%= render 'form', issue: @issue %> + <%= render 'form', issue: @issue, line_type: @line_type %> <%= link_to 'Back', issues_path %> -
\ No newline at end of file +
diff --git a/app/views/pages/home.html.erb b/app/views/pages/home.html.erb index 3ace61d4..6883cc6e 100644 --- a/app/views/pages/home.html.erb +++ b/app/views/pages/home.html.erb @@ -15,12 +15,12 @@
Report An Issue
- <%= link_to(new_issue_path, class: 'blue-btn transit') do %> + <%= link_to(new_issue_path(line_type: 'bus'), class: 'blue-btn transit') do %>
Bus
<%= image_tag "bus_white.svg", alt: '' %> <% end %> - <%= link_to(new_issue_path, class: 'blue-btn transit') do %> + <%= link_to(new_issue_path(line_type: 'train'), class: 'blue-btn transit') do %>
Train
<%= image_tag "train_white.svg", alt: '' %> <% end %> From b4411322f5a30ac2bf3c3e1d76342328c40f7338 Mon Sep 17 00:00:00 2001 From: Sinclair Target Date: Mon, 4 Mar 2019 16:21:59 -0600 Subject: [PATCH 3/4] Restrict lines when editing issue also. --- app/models/line.rb | 10 ++++++++++ app/views/issues/edit.html.erb | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/models/line.rb b/app/models/line.rb index c315757c..b9ae3f5b 100644 --- a/app/models/line.rb +++ b/app/models/line.rb @@ -45,6 +45,16 @@ def train? end end + def line_type + if train? + "train" + elsif bus? + "bus" + else + nil + end + end + # Query for bus/train lines. # line_type can be "train" or "bus". def self.of_line_type(line_type) diff --git a/app/views/issues/edit.html.erb b/app/views/issues/edit.html.erb index cde211e5..66df08f6 100644 --- a/app/views/issues/edit.html.erb +++ b/app/views/issues/edit.html.erb @@ -1,6 +1,6 @@

Editing Issue

-<%= render 'form', issue: @issue %> +<%= render 'form', issue: @issue, line_type: @issue.line&.line_type %> <%= link_to 'Show', @issue %> | <%= link_to 'Back', issues_path %> From 536985860d2497b6d07b3fc03c106fff089bc8fd Mon Sep 17 00:00:00 2001 From: Sinclair Target Date: Mon, 4 Mar 2019 16:23:03 -0600 Subject: [PATCH 4/4] Placate rubocop. --- app/models/line.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/models/line.rb b/app/models/line.rb index b9ae3f5b..3cab6c05 100644 --- a/app/models/line.rb +++ b/app/models/line.rb @@ -60,12 +60,12 @@ def line_type def self.of_line_type(line_type) if line_type == "train" Line.where(system_type: [TRAM_SYSTEM_TYPE, METRO_SYSTEM_TYPE]) - .or(Line.where(vehicle_type: ["tram", "metro"])) - .order(:name) + .or(Line.where(vehicle_type: ["tram", "metro"])) + .order(:name) elsif line_type == "bus" Line.where(system_type: BUS_SYSTEM_TYPE) - .or(Line.where(vehicle_type: "bus")) - .order(:name) + .or(Line.where(vehicle_type: "bus")) + .order(:name) else Line.order(:name) end