choose list when importing from pets
This commit is contained in:
parent
1dd3acbe92
commit
019303031b
3 changed files with 30 additions and 3 deletions
|
@ -9,6 +9,7 @@ class NeopetsUsersController < ApplicationController
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@neopets_user.username = params[:neopets_user][:username]
|
@neopets_user.username = params[:neopets_user][:username]
|
||||||
|
@neopets_user.list_id = params[:neopets_user][:list_id]
|
||||||
@neopets_user.load!
|
@neopets_user.load!
|
||||||
@neopets_user.save_hangers!
|
@neopets_user.save_hangers!
|
||||||
|
|
||||||
|
|
|
@ -5,12 +5,27 @@ class NeopetsUser
|
||||||
extend ActiveModel::Naming
|
extend ActiveModel::Naming
|
||||||
|
|
||||||
attr_accessor :username
|
attr_accessor :username
|
||||||
attr_reader :hangers
|
attr_reader :hangers, :list_id
|
||||||
|
|
||||||
def initialize(app_user)
|
def initialize(app_user)
|
||||||
@app_user = app_user
|
@app_user = app_user
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def list_id=(list_id)
|
||||||
|
# TODO: DRY up with ClosetPage
|
||||||
|
@list_id = list_id
|
||||||
|
if list_id == 'true'
|
||||||
|
@closet_list = nil
|
||||||
|
@hangers_owned = true
|
||||||
|
elsif list_id == 'false'
|
||||||
|
@closet_list = nil
|
||||||
|
@hangers_owned = false
|
||||||
|
elsif list_id.present?
|
||||||
|
@closet_list = @app_user.closet_lists.find(list_id)
|
||||||
|
@hangers_owned = @closet_list.hangers_owned?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def load!
|
def load!
|
||||||
user = Neopets::User.new(@username)
|
user = Neopets::User.new(@username)
|
||||||
|
|
||||||
|
@ -23,19 +38,29 @@ class NeopetsUser
|
||||||
pets = pets.map { |pet| Pet.find_or_initialize_by_name(pet.name) }
|
pets = pets.map { |pet| Pet.find_or_initialize_by_name(pet.name) }
|
||||||
items = pets.each(&:load!).map(&:items).flatten
|
items = pets.each(&:load!).map(&:items).flatten
|
||||||
item_ids = items.map(&:id)
|
item_ids = items.map(&:id)
|
||||||
existing_hanger_item_ids = @app_user.closet_hangers.select(:item_id).where(:item_id => item_ids).map(&:item_id)
|
|
||||||
item_quantities = {}
|
item_quantities = {}
|
||||||
items.each do |i|
|
items.each do |i|
|
||||||
item_quantities[i] ||= 0
|
item_quantities[i] ||= 0
|
||||||
item_quantities[i] += 1
|
item_quantities[i] += 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# TODO: DRY up with ClosetPage
|
||||||
|
# We don't want to insert duplicate hangers of what a user owns if they
|
||||||
|
# already have it in another list (e.g. imports to Items You Own *after*
|
||||||
|
# curating their Up For Trade list), so we check for the hanger's presence
|
||||||
|
# in *all* items the user owns or wants (whichever is appropriate for this
|
||||||
|
# request).
|
||||||
|
hangers_scope = @app_user.closet_hangers.where(owned: @hangers_owned)
|
||||||
|
existing_hanger_item_ids = hangers_scope.select(:item_id).
|
||||||
|
where(item_id: item_ids).map(&:item_id)
|
||||||
|
|
||||||
@hangers = []
|
@hangers = []
|
||||||
item_quantities.each do |item, quantity|
|
item_quantities.each do |item, quantity|
|
||||||
next if existing_hanger_item_ids.include?(item.id)
|
next if existing_hanger_item_ids.include?(item.id)
|
||||||
hanger = @app_user.closet_hangers.build
|
hanger = hangers_scope.build
|
||||||
hanger.item = item
|
hanger.item = item
|
||||||
hanger.quantity = quantity
|
hanger.quantity = quantity
|
||||||
|
hanger.list = @closet_list
|
||||||
@hangers << hanger
|
@hangers << hanger
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,5 +7,6 @@
|
||||||
|
|
||||||
= f.label :username, t('.username_label')
|
= f.label :username, t('.username_label')
|
||||||
= f.text_field :username
|
= f.text_field :username
|
||||||
|
= f.select :list_id, neopets_page_list_options(current_user)
|
||||||
= f.submit t('.submit')
|
= f.submit t('.submit')
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue