VRFS-2424 added user.genres; refactored band_genres to genre_players; incorporated editing of user genres in profile
This commit is contained in:
parent
e4e3121b31
commit
9f60327d20
|
|
@ -229,4 +229,5 @@ deletable_recordings.sql
|
|||
jam_tracks.sql
|
||||
shopping_carts.sql
|
||||
recurly.sql
|
||||
add_track_resource_id.sql
|
||||
add_track_resource_id.sql
|
||||
user_genres.sql
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ require "jam_ruby/models/feedback_observer"
|
|||
#require "jam_ruby/models/max_mind_geo"
|
||||
#require "jam_ruby/models/max_mind_isp"
|
||||
require "jam_ruby/models/max_mind_release"
|
||||
require "jam_ruby/models/band_genre"
|
||||
require "jam_ruby/models/genre_player"
|
||||
require "jam_ruby/models/genre"
|
||||
require "jam_ruby/models/user"
|
||||
require "jam_ruby/models/rsvp_request"
|
||||
|
|
|
|||
|
|
@ -30,8 +30,8 @@ module JamRuby
|
|||
has_many :users, :through => :band_musicians, :class_name => "JamRuby::User"
|
||||
|
||||
# genres
|
||||
has_many :band_genres, class_name: "JamRuby::BandGenre", dependent: :destroy
|
||||
has_many :genres, class_name: "JamRuby::Genre", :through => :band_genres
|
||||
has_many :genre_players, as: :player, class_name: "JamRuby::GenrePlayer", dependent: :destroy
|
||||
has_many :genres, through: :genre_players, class_name: "JamRuby::Genre"
|
||||
|
||||
# recordings
|
||||
has_many :recordings, :class_name => "JamRuby::Recording", :foreign_key => "band_id", dependent: :destroy
|
||||
|
|
|
|||
|
|
@ -1,11 +0,0 @@
|
|||
module JamRuby
|
||||
class BandGenre < ActiveRecord::Base
|
||||
|
||||
self.table_name = "bands_genres"
|
||||
|
||||
self.primary_key = 'id'
|
||||
|
||||
belongs_to :user, class_name: "JamRuby::User"
|
||||
belongs_to :genre, class_name: "JamRuby::Genre"
|
||||
end
|
||||
end
|
||||
|
|
@ -4,8 +4,9 @@ module JamRuby
|
|||
self.primary_key = 'id'
|
||||
|
||||
# bands
|
||||
has_many :band_genres, class_name: "JamRuby::BandGenre"
|
||||
has_many :bands, class_name: "JamRuby::Band", :through => :band_genres
|
||||
# has_many :genre_players, class_name: "JamRuby::GenrePlayer"
|
||||
# has_many :bands, class_name: "JamRuby::Band", through: :genre_players, condition: ['player_type = ?', 'JamRuby::Band']
|
||||
# has_many :users, class_name: "JamRuby::User", through: :genre_players, condition: ['player_type = ?', 'JamRuby::User']
|
||||
|
||||
|
||||
# music sessions
|
||||
|
|
@ -21,4 +22,4 @@ module JamRuby
|
|||
description
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
module JamRuby
|
||||
class GenrePlayer < ActiveRecord::Base
|
||||
|
||||
self.table_name = "genre_players"
|
||||
|
||||
belongs_to :player, polymorphic: true
|
||||
belongs_to :genre, class_name: "JamRuby::Genre"
|
||||
|
||||
end
|
||||
end
|
||||
|
|
@ -432,7 +432,7 @@ module JamRuby
|
|||
rel = Band.scoped
|
||||
|
||||
unless (genre = params[:genre]).blank?
|
||||
rel = Band.joins("RIGHT JOIN bands_genres AS bgenres ON bgenres.band_id = bands.id")
|
||||
rel = Band.joins("RIGHT JOIN genre_players AS bgenres ON bgenres.player_id = bands.id AND bgenres.player_type = 'JamRuby::Band'")
|
||||
.where(['bgenres.genre_id = ? AND bands.id IS NOT NULL', genre])
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,10 @@ module JamRuby
|
|||
has_many :band_musicians, :class_name => "JamRuby::BandMusician"
|
||||
has_many :bands, :through => :band_musicians, :class_name => "JamRuby::Band"
|
||||
|
||||
# genres
|
||||
has_many :genre_players, as: :player, class_name: "JamRuby::GenrePlayer", dependent: :destroy
|
||||
has_many :genres, through: :genre_players, class_name: "JamRuby::Genre"
|
||||
|
||||
# recordings
|
||||
has_many :owned_recordings, :class_name => "JamRuby::Recording", :foreign_key => "owner_id"
|
||||
has_many :recordings, :through => :claimed_recordings, :class_name => "JamRuby::Recording"
|
||||
|
|
@ -601,6 +605,16 @@ module JamRuby
|
|||
return recordings
|
||||
end
|
||||
|
||||
def update_genres(gids)
|
||||
unless self.new_record?
|
||||
GenrePlayer.delete_all(["player_id = ? AND player_type = ?",
|
||||
self.id, self.class.name])
|
||||
end
|
||||
gids.each do |gid|
|
||||
self.genres << Genre.find_by_id(gid)
|
||||
end
|
||||
end
|
||||
|
||||
# given an array of instruments, update a user's instruments
|
||||
def update_instruments(instruments)
|
||||
# delete all instruments for this user first
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
$('#account-profile-content-scroller form .error').removeClass("error")
|
||||
}
|
||||
|
||||
function populateAccountProfile(userDetail, instruments) {
|
||||
function populateAccountProfile(userDetail, instruments) {
|
||||
var template = context.JK.fillTemplate($('#template-account-profile').html(), {
|
||||
country: userDetail.country,
|
||||
region: userDetail.state,
|
||||
|
|
@ -48,11 +48,9 @@
|
|||
});
|
||||
|
||||
var content_root = $('#account-profile-content-scroller')
|
||||
|
||||
content_root.html(template);
|
||||
|
||||
// now use javascript to fix up values too hard to do with templating
|
||||
|
||||
// set gender
|
||||
$('select[name=gender]', content_root).val(userDetail.gender)
|
||||
|
||||
|
|
@ -66,22 +64,18 @@
|
|||
$('select#user_birth_date_1i', content_root).val(parseInt(birthDateYear));
|
||||
$('select#user_birth_date_2i', content_root).val(parseInt(birthDateMonth));
|
||||
$('select#user_birth_date_3i', content_root).val(parseInt(birthDateDay));
|
||||
|
||||
}
|
||||
|
||||
loadGenres(userDetail.genres);
|
||||
|
||||
// update instruments
|
||||
$.each(instruments, function(index, instrument) {
|
||||
|
||||
var template = context.JK.fillTemplate($('#account-profile-instrument').html(), {
|
||||
checked : isUserInstrument(instrument, userDetail.instruments) ? "checked=\"checked\"" :"",
|
||||
description : instrument.description,
|
||||
id : instrument.id
|
||||
})
|
||||
|
||||
|
||||
$('.instrument_selector', content_root).append(template)
|
||||
|
||||
|
||||
})
|
||||
// and fill in the proficiency for the instruments that the user can play
|
||||
if(userDetail.instruments) {
|
||||
|
|
@ -91,7 +85,6 @@
|
|||
}
|
||||
|
||||
context.JK.dropdown($('select', content_root));
|
||||
|
||||
}
|
||||
|
||||
function isUserInstrument(instrument, userInstruments) {
|
||||
|
|
@ -107,6 +100,47 @@
|
|||
return isUserInstrument;
|
||||
}
|
||||
|
||||
function loadGenres(selectedGenres) {
|
||||
$("#user-genres").empty();
|
||||
|
||||
rest.getGenres().done(function (genres) {
|
||||
$.each(genres, function (index, genre) {
|
||||
var genreTemplate = $('#template-user-setup-genres').html();
|
||||
var selected = '';
|
||||
if (selectedGenres) {
|
||||
var genreMatch = $.grep(selectedGenres, function (n, i) {
|
||||
return n.id === genre.id;
|
||||
});
|
||||
if (genreMatch.length > 0) {
|
||||
selected = "checked";
|
||||
}
|
||||
}
|
||||
var genreHtml = context.JK.fillTemplate(genreTemplate, {
|
||||
id: genre.id,
|
||||
description: genre.description,
|
||||
checked: selected
|
||||
});
|
||||
|
||||
$('#user-genres').append(genreHtml);
|
||||
});
|
||||
});
|
||||
}
|
||||
function resetGenres() {
|
||||
$('input[type=checkbox]:checked', '#user-genres').each(function (i) {
|
||||
$(this).removeAttr("checked");
|
||||
});
|
||||
var $tdGenres = $("#tdBandGenres");
|
||||
}
|
||||
|
||||
function getSelectedGenres() {
|
||||
var genres = [];
|
||||
$('input[type=checkbox]:checked', '#user-genres').each(function (i) {
|
||||
var genre = $(this).val();
|
||||
genres.push(genre);
|
||||
});
|
||||
return genres;
|
||||
}
|
||||
|
||||
function populateAccountProfileLocation(userDetail, regions, cities) {
|
||||
populateRegions(regions, userDetail.state);
|
||||
populateCities(cities, userDetail.city);
|
||||
|
|
@ -259,12 +293,12 @@
|
|||
|
||||
$.when( api.getUserDetail(),
|
||||
api.getInstruments())
|
||||
.done(function(userDetailResponse, instrumentsResponse) {
|
||||
.done(function(userDetailResponse, instrumentsResponse) {
|
||||
var userDetail = userDetailResponse[0];
|
||||
recentUserDetail = userDetail // store userDetail for later
|
||||
var instruments = instrumentsResponse[0];
|
||||
// show page; which can be done quickly at this point
|
||||
populateAccountProfile(userDetail, instruments);
|
||||
populateAccountProfile(userDetail,
|
||||
instrumentsResponse[0]);
|
||||
|
||||
selectLocation = new context.JK.SelectLocation(getCountryElement(), getRegionElement(), getCityElement(), app);
|
||||
selectLocation.load(userDetail.country, userDetail.state, userDetail.city)
|
||||
|
|
@ -295,6 +329,7 @@
|
|||
var subscribeEmail = getSubscribeEmail().is(':checked');
|
||||
var birthDate = getBirthDate();
|
||||
var instruments = getInstrumentsValue();
|
||||
var genres = getSelectedGenres();
|
||||
|
||||
api.updateUser({
|
||||
country: country,
|
||||
|
|
@ -305,6 +340,7 @@
|
|||
gender: gender,
|
||||
birth_date: birthDate,
|
||||
instruments: instruments,
|
||||
genres: genres,
|
||||
subscribe_email: subscribeEmail
|
||||
})
|
||||
.done(postUpdateProfileSuccess)
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@
|
|||
box-shadow: 2px 2px 3px 0 #888888 inset;
|
||||
color: #000;
|
||||
font-size: 14px;
|
||||
height: 178px;
|
||||
height: 100px;
|
||||
overflow: auto;
|
||||
width: 100%;
|
||||
|
||||
|
|
|
|||
|
|
@ -205,6 +205,18 @@
|
|||
padding-right:5px;
|
||||
}
|
||||
|
||||
.user-setup-genres {
|
||||
width:40%;
|
||||
height:90px;
|
||||
background-color:#c5c5c5;
|
||||
border:none;
|
||||
-webkit-box-shadow: inset 2px 2px 3px 0px #888;
|
||||
box-shadow: inset 2px 2px 3px 0px #888;
|
||||
color:#000;
|
||||
overflow:auto;
|
||||
font-size:14px;
|
||||
}
|
||||
|
||||
.profile-band-list-result {
|
||||
width:100%;
|
||||
min-height:85px;
|
||||
|
|
|
|||
|
|
@ -23,9 +23,10 @@ class ApiUsersController < ApiController
|
|||
end
|
||||
|
||||
def show
|
||||
@user = User.includes([{:musician_instruments => :instrument},
|
||||
{:band_musicians => :user},
|
||||
:bands, :instruments])
|
||||
@user = User.includes([{musician_instruments: :instrument},
|
||||
{band_musicians: :user},
|
||||
{genre_players: :genre},
|
||||
:bands, :instruments, :genres])
|
||||
.find(params[:id])
|
||||
|
||||
respond_with @user, responder: ApiResponder, :status => 200
|
||||
|
|
@ -43,6 +44,7 @@ class ApiUsersController < ApiController
|
|||
@user.country = params[:country] if params.has_key?(:country)
|
||||
@user.musician = params[:musician] if params.has_key?(:musician)
|
||||
@user.update_instruments(params[:instruments].nil? ? [] : params[:instruments]) if params.has_key?(:instruments)
|
||||
@user.update_genres(params[:genres].nil? ? [] : params[:genres]) if params.has_key?(:genres)
|
||||
@user.show_whats_next = params[:show_whats_next] if params.has_key?(:show_whats_next)
|
||||
@user.subscribe_email = params[:subscribe_email] if params.has_key?(:subscribe_email)
|
||||
@user.biography = params[:biography] if params.has_key?(:biography)
|
||||
|
|
|
|||
|
|
@ -83,6 +83,10 @@ child :musician_instruments => :instruments do
|
|||
attributes :description, :proficiency_level, :priority, :instrument_id
|
||||
end
|
||||
|
||||
child :genres do
|
||||
attributes :description, :id
|
||||
end
|
||||
|
||||
child :music_sessions => :sessions do
|
||||
attributes :id, :description, :musician_access, :approval_required, :fan_access
|
||||
end
|
||||
|
|
|
|||
|
|
@ -94,6 +94,13 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="user-genres">Genres:</label>
|
||||
<div class="user-setup-genres">
|
||||
<table id="user-genres" width="100%" cellpadding="10" cellspacing="6"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<input type="checkbox" name="subscribe_email" {subscribe_email} /> I will accept email from JamKazam about this service.
|
||||
</div>
|
||||
|
|
@ -122,3 +129,7 @@
|
|||
</select></td>
|
||||
</tr>
|
||||
</script>
|
||||
|
||||
<script type="text/template" id="template-user-setup-genres">
|
||||
<tr><td><input value="{id}" {checked} type="checkbox" />{description}</td></tr>
|
||||
</script>
|
||||
|
|
|
|||
Loading…
Reference in New Issue