diff --git a/app/controllers/closet_pages_controller.rb b/app/controllers/closet_pages_controller.rb new file mode 100644 index 00000000..02a9624e --- /dev/null +++ b/app/controllers/closet_pages_controller.rb @@ -0,0 +1,63 @@ +class ClosetPagesController < ApplicationController + include ActionView::Helpers::TextHelper + + before_filter :authenticate_user!, :build_closet_page + + rescue_from ClosetPage::ParseError, :with => :on_parse_error + + def create + if params[:closet_page] && params[:closet_page][:source] + @closet_page.source = params[:closet_page][:source] + saved_counts = @closet_page.save_hangers! + + any_created = saved_counts[:created] > 0 + any_updated = saved_counts[:updated] > 0 + if any_created || any_updated + message = "Page #{@closet_page.index} saved! We " + message << "added " + pluralize(saved_counts[:created], 'item') + " to your closet" if any_created + message << " and " if any_created && any_updated + message << "updated the count on " + pluralize(saved_counts[:updated], 'item') if any_updated + message << ". " + else + message = "Success! We checked that page, and we already had all this data recorded. " + end + + unless @closet_page.unknown_item_names.empty? + message << "We also found " + + pluralize(@closet_page.unknown_item_names.size, 'item') + + " we didn't recognize: " + + @closet_page.unknown_item_names.to_sentence + + ". Please put each item on your pet and type its name in on the " + + "home page so we can have a record of it. Thanks! " + end + + if @closet_page.last? + message << "That was the last page of your Neopets closet." + destination = user_closet_hangers_path(current_user) + else + message << "Let's move onto the next page!" + destination = {:action => :new, :page => (@closet_page.index + 1)} + end + + flash[:success] = message + redirect_to destination + else + redirect_to :action => :new + end + end + + def new + end + + protected + + def build_closet_page + @closet_page = ClosetPage.new(current_user) + end + + def on_parse_error + flash[:alert] = "We had trouble reading your source code. Is it a valid HTML document? Make sure you pasted the computery-looking result of right-click > View Source, and not the pretty page itself." + render :action => :new + end +end + diff --git a/app/helpers/closet_pages_helper.rb b/app/helpers/closet_pages_helper.rb new file mode 100644 index 00000000..dab106d2 --- /dev/null +++ b/app/helpers/closet_pages_helper.rb @@ -0,0 +1,2 @@ +module ClosetPagesHelper +end diff --git a/app/models/closet_page.rb b/app/models/closet_page.rb index d9de7430..b9e25f8b 100644 --- a/app/models/closet_page.rb +++ b/app/models/closet_page.rb @@ -1,6 +1,9 @@ require 'yaml' class ClosetPage + include ActiveModel::Conversion + extend ActiveModel::Naming + SELECTORS = { :items => "form[action=\"process_closet.phtml\"] tr[bgcolor!=silver][bgcolor!=\"#E4E4E4\"]", :item_thumbnail => "img", @@ -11,18 +14,39 @@ class ClosetPage :selected => "option[selected]" } - attr_reader :hangers, :index, :total_pages, :unknown_item_names + attr_reader :hangers, :index, :source, :total_pages, :unknown_item_names, :user def initialize(user) raise ArgumentError, "Expected #{user.inspect} to be a User", caller unless user.is_a?(User) @user = user end + def last? + @index == @total_pages + end + + def persisted? + false + end + def save_hangers! - @hangers.each(&:save!) + counts = {:created => 0, :updated => 0} + ClosetHanger.transaction do + @hangers.each do |hanger| + if hanger.new_record? + counts[:created] += 1 + hanger.save! + elsif hanger.changed? + counts[:updated] += 1 + hanger.save! + end + end + end + counts end def source=(source) + @source = source parse_source!(source) end @@ -42,7 +66,7 @@ class ClosetPage page_selector = element(:page_select, doc) @total_pages = page_selector.children.size - @index = element(:selected, page_selector)['value'] + @index = element(:selected, page_selector)['value'].to_i items_data = { :id => {}, @@ -89,8 +113,7 @@ class ClosetPage @hangers = items.map do |item| data = items_data[:id].delete(item.id) || items_data[:thumbnail_url].delete(item.thumbnail_url) - hanger = @user.closet_hangers.build - hanger.item = item + hanger = @user.closet_hangers.find_or_initialize_by_item_id(item.id) hanger.quantity = data[:quantity] hanger end diff --git a/app/views/closet_pages/new.html.haml b/app/views/closet_pages/new.html.haml new file mode 100644 index 00000000..e141128a --- /dev/null +++ b/app/views/closet_pages/new.html.haml @@ -0,0 +1,5 @@ += form_for(@closet_page) do |f| + = f.label :source + = f.text_area :source + = f.submit 'Add items to closet' + diff --git a/config/routes.rb b/config/routes.rb index cd3e06ff..6ad714b7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -24,6 +24,8 @@ OpenneoImpressItems::Application.routes.draw do |map| resources :pet_attributes, :only => [:index] resources :swf_assets, :only => [:index, :show] + resources :closet_pages, :only => [:new, :create], :path => 'closet/pages' + match '/users/current-user/outfits' => 'outfits#index', :as => :current_user_outfits match '/pets/load' => 'pets#load', :method => :post, :as => :load_pet @@ -37,6 +39,7 @@ OpenneoImpressItems::Application.routes.draw do |map| resources :contributions, :only => [:index] resources :closet_hangers, :only => [:index], :path => 'closet' end + match 'users/top-contributors' => 'users#top_contributors', :as => :top_contributors match 'users/top_contributors' => redirect('/users/top-contributors') diff --git a/spec/controllers/closet_pages_controller_spec.rb b/spec/controllers/closet_pages_controller_spec.rb new file mode 100644 index 00000000..9f7b67ac --- /dev/null +++ b/spec/controllers/closet_pages_controller_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe ClosetPagesController do + +end diff --git a/spec/helpers/closet_pages_helper_spec.rb b/spec/helpers/closet_pages_helper_spec.rb new file mode 100644 index 00000000..9483444d --- /dev/null +++ b/spec/helpers/closet_pages_helper_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +# Specs in this file have access to a helper object that includes +# the ClosetPagesHelper. For example: +# +# describe ClosetPagesHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# helper.concat_strings("this","that").should == "this that" +# end +# end +# end +describe ClosetPagesHelper do + pending "add some examples to (or delete) #{__FILE__}" +end