1
0
Fork 0
forked from OpenNeo/impress

choose list when importing from pets

This commit is contained in:
Emi Matchu 2013-08-17 12:07:04 -04:00
parent 1dd3acbe92
commit 019303031b
3 changed files with 30 additions and 3 deletions

View file

@ -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!

View file

@ -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

View file

@ -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')