From 3028e421fba5290eed11339aa28d48545da9b2c9 Mon Sep 17 00:00:00 2001 From: Steven Miers Date: Wed, 7 Jan 2015 12:33:49 -0600 Subject: [PATCH] VRFS-2614 : Allow jam track to be hidden to non-admin users by setting available=false. Model, controller, admin UI, web UI, and spec to verify non-available jam_tracks can only be seen by admin users. --- .../views/admin/jam_tracks/_form.html.slim | 5 ++- db/manifest | 1 + db/up/jam_track_available.sql | 3 ++ ruby/lib/jam_ruby/models/jam_track.rb | 8 +++-- .../controllers/api_jam_tracks_controller.rb | 4 +-- .../api_jam_tracks_controller_spec.rb | 31 +++++++++++++++++-- web/spec/factories.rb | 1 + 7 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 db/up/jam_track_available.sql diff --git a/admin/app/views/admin/jam_tracks/_form.html.slim b/admin/app/views/admin/jam_tracks/_form.html.slim index 4f696c996..52e5d9a4b 100644 --- a/admin/app/views/admin/jam_tracks/_form.html.slim +++ b/admin/app/views/admin/jam_tracks/_form.html.slim @@ -1,8 +1,11 @@ = semantic_form_for([:admin, resource], :html => {:multipart => true}, :url => resource.new_record? ? admin_jam_tracks_path : "#{ENV['RAILS_RELATIVE_URL_ROOT']}/admin/jam_tracks/#{resource.id}") do |f| = f.semantic_errors *f.object.errors.keys = f.inputs name: 'JamTrack fields' do - = f.input :name, :input_html => { :rows=>1, :maxlength=>200 } + b style='margin-left:10px' + i + | JamTrack should only be made available (to end users) if all its sub-component are in place: + = f.input :available, as: :boolean = f.input :description, :input_html => { :rows=>5, :maxlength=>1000 } = f.input :bpm = f.input :tap_in_count diff --git a/db/manifest b/db/manifest index b0ee3a716..b0f8b2ae1 100755 --- a/db/manifest +++ b/db/manifest @@ -237,3 +237,4 @@ diagnostics_user_id_index.sql jam_track_updates.sql private_key_in_jam_track_rights.sql jam_track_tap_in.sql +jam_track_available.sql diff --git a/db/up/jam_track_available.sql b/db/up/jam_track_available.sql new file mode 100644 index 000000000..4ebac6be5 --- /dev/null +++ b/db/up/jam_track_available.sql @@ -0,0 +1,3 @@ +ALTER TABLE jam_tracks ADD COLUMN available BOOLEAN NOT NULL DEFAULT FALSE; +ALTER TABLE notifications DROP CONSTRAINT notifications_jam_track_right_id_fkey; +ALTER TABLE notifications ADD CONSTRAINT notifications_jam_track_right_id_fkey FOREIGN KEY (jam_track_right_id) REFERENCES jam_track_rights(id) ON DELETE CASCADE; diff --git a/ruby/lib/jam_ruby/models/jam_track.rb b/ruby/lib/jam_ruby/models/jam_track.rb index 3cad8998f..af28ba855 100644 --- a/ruby/lib/jam_ruby/models/jam_track.rb +++ b/ruby/lib/jam_ruby/models/jam_track.rb @@ -15,7 +15,8 @@ module JamRuby attr_accessible :name, :description, :bpm, :time_signature, :status, :recording_type, :original_artist, :songwriter, :publisher, :licensor, :licensor_id, :pro, :genre, :genre_id, :sales_region, :price, :reproduction_royalty, :public_performance_royalty, :reproduction_royalty_amount, - :licensor_royalty_amount, :pro_royalty_amount, :plan_code, :tap_in_count, :initial_play_silence, :jam_track_tracks_attributes, :jam_track_tap_ins_attributes, as: :admin + :licensor_royalty_amount, :pro_royalty_amount, :plan_code, :tap_in_count, :initial_play_silence, :jam_track_tracks_attributes, + :jam_track_tap_ins_attributes, :available, as: :admin validates :name, presence: true, uniqueness: true, length: {maximum: 200} validates :description, length: {maximum: 1000} @@ -53,7 +54,7 @@ module JamRuby accepts_nested_attributes_for :jam_track_tap_ins, allow_destroy: true class << self - def index(options = {}) + def index(options = {}, force_all=false) limit = options[:limit] limit ||= 20 limit = limit.to_i @@ -64,7 +65,8 @@ module JamRuby query = JamTrack.joins(:jam_track_tracks) .offset(start) .limit(limit) - + + query = query.where("jam_tracks.available = ?", true) unless force_all query = query.where("jam_tracks.genre_id = '#{options[:genre]}'") unless options[:genre].blank? query = query.where("jam_track_tracks.instrument_id = '#{options[:instrument]}'") unless options[:instrument].blank? query = query.where("jam_tracks.sales_region = '#{options[:availability]}'") unless options[:availability].blank? diff --git a/web/app/controllers/api_jam_tracks_controller.rb b/web/app/controllers/api_jam_tracks_controller.rb index 959d0f4ae..f0ed01e44 100644 --- a/web/app/controllers/api_jam_tracks_controller.rb +++ b/web/app/controllers/api_jam_tracks_controller.rb @@ -6,8 +6,8 @@ class ApiJamTracksController < ApiController respond_to :json - def index - data = JamTrack.index(params) + def index + data = JamTrack.index(params, current_user.admin) @jam_tracks, @next = data[0], data[1] render "api_jam_tracks/index", :layout => nil diff --git a/web/spec/controllers/api_jam_tracks_controller_spec.rb b/web/spec/controllers/api_jam_tracks_controller_spec.rb index b6ae5932b..817c3ad3d 100644 --- a/web/spec/controllers/api_jam_tracks_controller_spec.rb +++ b/web/spec/controllers/api_jam_tracks_controller_spec.rb @@ -14,27 +14,52 @@ describe ApiJamTracksController do end before(:each) do + JamTrack.destroy_all @user = FactoryGirl.create(:user) @jam_track = FactoryGirl.create(:jam_track) + @jam_track_unavailable = FactoryGirl.create(:jam_track, :available=>false) controller.current_user = @user end + describe "admin" do + before(:each) do + @admin = FactoryGirl.create(:admin) + controller.current_user = @admin + end + + it "can see unavailable" do + get :index + response.should be_success + json = JSON.parse(response.body) + json["next"].should be_nil + json["jamtracks"].length.should == 2 + + # Create another unavailable track and see: + jam_track2 = FactoryGirl.create(:jam_track, :available=>false) + get :index + response.should be_success + json = JSON.parse(response.body) + json["next"].should be_nil + json["jamtracks"].length.should == 3 + end + end # describe "admin" + describe "download functionality" do it "lists available tracks" do get :index response.should be_success - json = JSON.parse(response.body)#, :symbolize_names => true) + json = JSON.parse(response.body) json["next"].should be_nil json["jamtracks"].length.should == 1 jam_track2 = FactoryGirl.create(:jam_track) get :index response.should be_success - json = JSON.parse(response.body)#, :symbolize_names => true) + json = JSON.parse(response.body) json["next"].should be_nil json["jamtracks"].length.should == 2 end - + it "lists owned tracks" do get :downloads response.should be_success diff --git a/web/spec/factories.rb b/web/spec/factories.rb index aa08e6d0e..1f1308a77 100644 --- a/web/spec/factories.rb +++ b/web/spec/factories.rb @@ -713,6 +713,7 @@ FactoryGirl.define do ignore do make_track true end + available true genre JamRuby::Genre.first association :licensor, factory: :jam_track_licensor