From deb0aa90f0c6e461a38e4205ed60da1ca0028615 Mon Sep 17 00:00:00 2001 From: Matchu Date: Mon, 27 Jul 2015 13:25:24 -0400 Subject: [PATCH] refactor importing --- app/assets/stylesheets/application.css.sass | 2 +- .../_new.sass | 2 +- .../neopets_page_import_tasks_controller.rb | 83 +++++ app/controllers/neopets_pages_controller.rb | 88 ----- ...rb => neopets_page_import_tasks_helper.rb} | 2 +- app/models/closet_list.rb | 12 + app/models/closet_page.rb | 236 ------------- app/models/neopets_page.rb | 328 ++++++++++++++++++ app/views/closet_hangers/index.html.haml | 4 +- .../new.html.haml | 30 +- config/locales/en-MEEP.yml | 2 +- config/locales/en.yml | 2 +- config/locales/es.yml | 2 +- config/locales/pt.yml | 2 +- config/routes.rb | 7 +- 15 files changed, 449 insertions(+), 353 deletions(-) rename app/assets/stylesheets/{neopets_pages => neopets_page_import_tasks}/_new.sass (90%) create mode 100644 app/controllers/neopets_page_import_tasks_controller.rb delete mode 100644 app/controllers/neopets_pages_controller.rb rename app/helpers/{neopets_pages_helper.rb => neopets_page_import_tasks_helper.rb} (90%) delete mode 100644 app/models/closet_page.rb create mode 100644 app/models/neopets_page.rb rename app/views/{neopets_pages => neopets_page_import_tasks}/new.html.haml (59%) diff --git a/app/assets/stylesheets/application.css.sass b/app/assets/stylesheets/application.css.sass index fecda275..815326ad 100644 --- a/app/assets/stylesheets/application.css.sass +++ b/app/assets/stylesheets/application.css.sass @@ -14,7 +14,7 @@ @import closet_hangers/petpage @import closet_lists/form @import donations/show -@import neopets_pages/new +@import neopets_page_import_tasks/new @import neopets_users/form @import contributions/index @import items diff --git a/app/assets/stylesheets/neopets_pages/_new.sass b/app/assets/stylesheets/neopets_page_import_tasks/_new.sass similarity index 90% rename from app/assets/stylesheets/neopets_pages/_new.sass rename to app/assets/stylesheets/neopets_page_import_tasks/_new.sass index 6b783e66..e53ed225 100644 --- a/app/assets/stylesheets/neopets_pages/_new.sass +++ b/app/assets/stylesheets/neopets_page_import_tasks/_new.sass @@ -1,4 +1,4 @@ -body.neopets_pages-new, body.neopets_pages-create +body.neopets_page_import_tasks-new, body.neopets_page_import_tasks-create #title float: left diff --git a/app/controllers/neopets_page_import_tasks_controller.rb b/app/controllers/neopets_page_import_tasks_controller.rb new file mode 100644 index 00000000..6757ad53 --- /dev/null +++ b/app/controllers/neopets_page_import_tasks_controller.rb @@ -0,0 +1,83 @@ +class NeopetsPageImportTasksController < ApplicationController + include ActionView::Helpers::TextHelper + + before_filter :authenticate_user! + + before_filter :require_source, only: [:create] + + rescue_from NeopetsPage::ParseError, with: :on_parse_error + + def create + neopets_page = NeopetsPage.new(params[:page_type], params[:expected_index], params[:neopets_page][:source]) + + @import_task = neopets_page.build_import_task(current_user, params[:neopets_page_import_task][:list_id]) + + messages = [tt('success', index: neopets_page.index)] + + results = @import_task.save + any_created = results[:counts][:created] > 0 + any_updated = results[:counts][:updated] > 0 + any_unchanged = results[:counts][:unchanged] > 0 + + if any_created && any_updated + created_msg = tt('created_and_updated_hangers.created_msg', + count: results[:counts][:created]) + updated_msg = tt('created_and_updated_hangers.updated_msg', + count: results[:counts][:updated]) + messages << tt('created_and_updated_hangers.text', + created_msg: created_msg, + updated_msg: updated_msg) + elsif any_created + messages << tt('created_hangers', + count: results[:counts][:created]) + elsif any_updated + messages << tt('updated_hangers', + count: results[:counts][:updated]) + elsif any_unchanged + messages << tt('no_changes') + else + messages << tt('no_data') + end + + unless results[:unknown_item_names].empty? + messages << tt('unknown_items', + item_names: results[:unknown_item_names].to_sentence, + count: results[:unknown_item_names].size) + end + + if neopets_page.last? + messages << tt('done', name: neopets_page.name) + destination = user_closet_hangers_path(current_user) + else + messages << tt('next_page', + next_index: (neopets_page.index + 1)) + destination = new_neopets_page_import_task_path( + expected_index: neopets_page.index + 1, list_id: @import_task.list_id) + end + + flash[:success] = messages.join(' ') + redirect_to destination + end + + def new + neopets_page = NeopetsPage.new(params[:page_type], params[:expected_index], nil) + @import_task = neopets_page.build_import_task(current_user, params[:list_id]) + end + + def tt(key, params={}) + t("neopets_page_import_tasks.create.#{key}", params) + end + + def require_source + redirect_to(action: :new) if params[:neopets_page][:source].empty? + end + + protected + + def on_parse_error(e) + Rails.logger.info "Neopets page parse error: #{e.message}" + flash[:alert] = tt('parse_error') + render action: :new + end +end + diff --git a/app/controllers/neopets_pages_controller.rb b/app/controllers/neopets_pages_controller.rb deleted file mode 100644 index dbc27078..00000000 --- a/app/controllers/neopets_pages_controller.rb +++ /dev/null @@ -1,88 +0,0 @@ -class NeopetsPagesController < ApplicationController - include ActionView::Helpers::TextHelper - - before_filter :authenticate_user!, :build_neopets_page - - rescue_from ClosetPage::ParseError, with: :on_parse_error - - def create - if @page_params && @page_params[:source] - @neopets_page.index = @page_params[:index] - @neopets_page.list_id = @page_params[:list_id] - @neopets_page.source = @page_params[:source] - - messages = [t('neopets_pages.create.success', - index: @neopets_page.index)] - - saved_counts = @neopets_page.save_hangers! - any_created = saved_counts[:created] > 0 - any_updated = saved_counts[:updated] > 0 - if any_created && any_updated - created_msg = t('neopets_pages.create.created_and_updated_hangers.created_msg', - count: saved_counts[:created]) - updated_msg = t('neopets_pages.create.created_and_updated_hangers.updated_msg', - count: saved_counts[:updated]) - messages << t('neopets_pages.create.created_and_updated_hangers.text', - created_msg: created_msg, - updated_msg: updated_msg) - elsif any_created - messages << t('neopets_pages.create.created_hangers', - count: saved_counts[:created]) - elsif any_updated - messages << t('neopets_pages.create.updated_hangers', - count: saved_counts[:updated]) - elsif @neopets_page.hangers.size > 1 # saw items, but at same quantities - messages << t('neopets_pages.create.no_changes') - else # no items recognized - messages << t('neopets_pages.create.no_data') - end - - unless @neopets_page.unknown_item_names.empty? - messages << t('neopets_pages.create.unknown_items', - item_names: @neopets_page.unknown_item_names.to_sentence, - count: @neopets_page.unknown_item_names.size) - end - - if @neopets_page.last? - messages << t('neopets_pages.create.done', name: @neopets_page.name) - destination = user_closet_hangers_path(current_user) - else - messages << t('neopets_pages.create.next_page', - next_index: (@neopets_page.index + 1)) - destination = {action: :new, index: @neopets_page.index + 1, - list_id: @neopets_page.list_id} - end - - flash[:success] = messages.join(' ') - redirect_to destination - else - redirect_to action: :new - end - end - - def new - @neopets_page.index ||= 1 - end - - protected - - TYPES = { - 'closet' => ClosetPage, - 'sdb' => SafetyDepositPage - } - def build_neopets_page - type_class = TYPES[params[:type]] - - @neopets_page = type_class.new(current_user) - @neopets_page.index = params[:index] - @neopets_page.list_id = params[:list_id] - @page_params = params[type_class.model_name.singular] - end - - def on_parse_error(e) - Rails.logger.info "Neopets page parse error: #{e.message}" - flash[:alert] = t('neopets_pages.create.parse_error') - render action: :new - end -end - diff --git a/app/helpers/neopets_pages_helper.rb b/app/helpers/neopets_page_import_tasks_helper.rb similarity index 90% rename from app/helpers/neopets_pages_helper.rb rename to app/helpers/neopets_page_import_tasks_helper.rb index 83914c83..eda51f4a 100644 --- a/app/helpers/neopets_pages_helper.rb +++ b/app/helpers/neopets_page_import_tasks_helper.rb @@ -1,4 +1,4 @@ -module NeopetsPagesHelper +module NeopetsPageImportTasksHelper def neopets_page_list_options(user) lists = user.closet_lists.group_by(&:hangers_owned?) options = [] diff --git a/app/models/closet_list.rb b/app/models/closet_list.rb index c3ebcc85..621653ff 100644 --- a/app/models/closet_list.rb +++ b/app/models/closet_list.rb @@ -28,6 +28,10 @@ class ClosetList < ActiveRecord::Base end end + def try_non_null(method_name) + send(method_name) + end + module VisibilityMethods delegate :trading?, to: :visibility_level @@ -56,6 +60,14 @@ class ClosetList < ActiveRecord::Base def hangers user.closet_hangers.unlisted.where(owned: hangers_owned) end + + def hangers_owned? + hangers_owned + end + + def try_non_null(method_name) + nil + end end class NullOwned < Null diff --git a/app/models/closet_page.rb b/app/models/closet_page.rb deleted file mode 100644 index bee25acb..00000000 --- a/app/models/closet_page.rb +++ /dev/null @@ -1,236 +0,0 @@ -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", - :item_name => "td:nth-child(2)", - :item_quantity => "td:nth-child(5)", - :item_remove => "input", - :page_select => "select[name=page]", - :selected => "option[selected]" - } - - attr_accessor :index - attr_reader :hangers, :list_id, :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 name - I18n.translate('neopets_pages.names.closet') - end - - def persisted? - false - end - - def save_hangers! - 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 list_id=(list_id) - @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 = @user.closet_lists.find(list_id) - @hangers_owned = @closet_list.hangers_owned? - end - end - - def source=(source) - @source = source - parse_source!(source) - end - - def url - "http://www.neopets.com/closet.phtml?per_page=50&page=#{@index}" - end - - protected - - def element(selector_name, parent) - parent.at_css(self.class.selectors[selector_name]) || - raise(ParseError, "#{selector_name} element not found") - end - - def elements(selector_name, parent) - parent.css(self.class.selectors[selector_name]) - end - - def find_id(row) - element(:item_remove, row)['name'] - end - - def find_index(page_selector) - element(:selected, page_selector)['value'].to_i - end - - def find_items(doc) - elements(:items, doc) - end - - def find_name(row) - # For normal items, the td contains essentially: - # NAME
OPTIONAL ADJECTIVE
- # For PB items, the td contains: - # NAME
OPTIONAL ADJECTIVE - # So, we want the first text node. If it's a PB item, that's the first - # child. If it's a normal item, it's the first child 's child. - name_el = element(:item_name, row).children[0] - name_el = name_el.children[0] if name_el.name == 'b' - name_el.text - end - - def find_page_selector(doc) - element(:page_select, doc) - end - - def find_quantity(row) - element(:item_quantity, row).text.to_i - end - - def find_thumbnail_url(row) - element(:item_thumbnail, row)['src'] - end - - def find_total_pages(page_selector) - page_selector.children.size - end - - def parse_source!(source) - doc = Nokogiri::HTML(source) - - page_selector = find_page_selector(doc) - @total_pages = find_total_pages(page_selector) - @index = find_index(page_selector) - - items_data = { - :id => {}, - :thumbnail_url => {} - } - - - # Go through the items, and find the ID/thumbnail for each and data with it - find_items(doc).each do |row| - data = { - :name => find_name(row), - :quantity => find_quantity(row) - } - - if id = find_id(row) - id = id.to_i - items_data[:id][id] = data - else # if this is a pb item, which does not give ID, go by thumbnail - thumbnail_url = find_thumbnail_url(row) - items_data[:thumbnail_url][thumbnail_url] = data - end - end - - # Find items with either a matching ID or matching thumbnail URL - # Check out that single-query beauty :) - i = Item.arel_table - items = Item.where( - i[:id].in(items_data[:id].keys). - or( - i[:thumbnail_url].in(items_data[:thumbnail_url].keys) - ) - ) - - # And now for some more single-query beauty: check for existing hangers. - # 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 = @user.closet_hangers.where(owned: @hangers_owned) - - # Group existing hangers by item ID and whether they're from the current - # list or another list. - current_list_id = @closet_list.try(:id) - existing_hangers_by_item_id = hangers_scope. - where(item_id: items.map(&:id)). - group_by(&:item_id) - - # Careful! We're just using a single default empty list for performance, - # but it must not be mutated! If mutation becomes necessary, change this - # to a default_proc assignment. - existing_hangers_by_item_id.default = [] - - # Create closet hanger from each item, and remove them from the reference - # lists. - @hangers = items.map do |item| - data = items_data[:id].delete(item.id) || - items_data[:thumbnail_url].delete(item.thumbnail_url) - - # If there's a hanger in the current list, we want it so we can update - # its quantity. If there's a hanger in another list, we want it so we - # know not to build a new one. Otherwise, build away! - existing_hangers = existing_hangers_by_item_id[item.id] - existing_hanger_in_current_list = existing_hangers.detect { |h| - h.list_id == current_list_id - } - hanger = existing_hanger_in_current_list || existing_hangers.first || - hangers_scope.build - - # We also don't want to move existing hangers from other lists, so only - # set the list if the hanger is new. (The item assignment is only - # necessary for new records, so may as well put it here, too.) - if hanger.new_record? - hanger.item = item - hanger.list = @closet_list - end - - # Finally, we don't want to update the quantity of hangers in those other - # lists, either, so only update quantity if it's in this list. (This will - # be true for some existing hangers and all new hangers. This is also the - # only value that could change for existing hangers; if nothing changes, - # it was an existing hanger from another list.) - hanger.quantity = data[:quantity] if hanger.list_id == current_list_id - - hanger - end - - # Take the names of the items remaining in the reference lists, meaning - # that they weren't found - @unknown_item_names = [] - items_data.each do |type, data_by_key| - data_by_key.each do |key, data| - @unknown_item_names << data[:name] - end - end - end - - def self.selectors - @selectors - end - - class ParseError < RuntimeError;end -end - diff --git a/app/models/neopets_page.rb b/app/models/neopets_page.rb new file mode 100644 index 00000000..277ef036 --- /dev/null +++ b/app/models/neopets_page.rb @@ -0,0 +1,328 @@ +class NeopetsPage + include ActiveModel::Conversion + extend ActiveModel::Naming + + + delegate :name, to: :type + + + attr_reader :type, :expected_index, :source + + + def initialize(type_key, expected_index, source) + @type = TYPES.fetch(type_key) + @expected_index = expected_index + @source = source + end + + + def build_import_task(user, list_id) + ImportTask.new self, user, list_id + end + + + def url + @type.url(@expected_index) + end + + + def index + parse_results[:index] + end + + + def page_count + parse_results[:page_count] + end + + + def last? + Rails.logger.debug("last? #{index} == #{page_count}") + index == page_count + end + + + def parse_results + @parse_results ||= @type.parse @source + end + + + def item_refs + parse_results[:items] + end + + + def persisted? + false + end + + + def to_param + @expected_index + end + + + + class ItemRef + attr_reader :id, :thumbnail_url, :name, :quantity + + def initialize(id, thumbnail_url, name, quantity) + @id = id + @thumbnail_url = thumbnail_url + @name = name + @quantity = quantity + end + + def id? + @id.present? + end + end + + + + class Parser + def initialize(selectors) + @selectors = selectors + end + + + def parse(source) + doc = Nokogiri::HTML(source) + page_selector = find_page_selector(doc) + {items: find_items(doc), index: find_index(page_selector), page_count: find_page_count(page_selector)} + end + + + def element(selector_name, parent) + selector = @selectors[selector_name] + parent.at_css(selector) || + raise(ParseError, "#{selector_name} element not found (#{selector} in #{parent})") + end + + + def elements(selector_name, parent) + parent.css(@selectors[selector_name]) + end + + + def find_id(row) + element(:item_remove, row)['name'] + end + + + def find_index(page_selector) + Rails.logger.debug("index: #{element(:selected, page_selector)}") + element(:selected, page_selector)['value'].to_i + end + + + def find_items(doc) + elements(:items, doc).map do |el| + ItemRef.new(find_id(el).try(:to_i), find_thumbnail_url(el), find_name(el), find_quantity(el)) + end + end + + + def find_name(row) + # For normal items, the td contains essentially: + # NAME
OPTIONAL ADJECTIVE
+ # For PB items, the td contains: + # NAME
OPTIONAL ADJECTIVE + # So, we want the first text node. If it's a PB item, that's the first + # child. If it's a normal item, it's the first child 's child. + name_el = element(:item_name, row).children[0] + name_el = name_el.children[0] if name_el.name == 'b' + name_el.text + end + + + def find_page_selector(doc) + element(:page_select, doc) + end + + + def find_quantity(row) + element(:item_quantity, row).text.to_i + end + + + def find_thumbnail_url(row) + element(:item_thumbnail, row)['src'] + end + + + def find_page_count(page_selector) + page_selector.css('option').size + end + end + + + + class Type + attr_reader :name, :parser + delegate :parse, to: :parser + + + def initialize(name, url_template, parser) + @name = name + @url_template = url_template + @parser = parser + end + + + def url(index) + @url_template % index + end + end + + + + TYPES = { + 'closet' => Type.new( + I18n.translate('neopets_page_import_tasks.names.closet'), + 'http://www.neopets.com/closet.phtml?per_page=50&page=%u', + Parser.new( + items: "form[action=\"process_closet.phtml\"] tr[bgcolor!=silver][bgcolor!=\"#E4E4E4\"]", + item_thumbnail: "img", + item_name: "td:nth-child(2)", + item_quantity: "td:nth-child(5)", + item_remove: "input", + page_select: "select[name=page]", + selected: "option[selected]" + ) + ) + } + + + + class ImportTask + include ActiveModel::Conversion + extend ActiveModel::Naming + + + attr_reader :page, :list_id + + + def initialize(page, user, list_id) + @page = page + @user = user + @list_id = list_id + end + + + def save + item_refs = @page.item_refs + + item_refs_by_best_key = {id: {}, thumbnail_url: {}} + item_refs.each do |item_ref| + if item_ref.id? + item_refs_by_best_key[:id][item_ref.id] = item_ref + else + item_refs_by_best_key[:thumbnail_url][item_ref.thumbnail_url] = item_ref + end + end + + # Find items with either a matching ID or matching thumbnail URL + # Check out that single-query beauty :) + i = Item.arel_table + items = Item.where( + i[:id].in(item_refs_by_best_key[:id].keys). + or i[:thumbnail_url].in(item_refs_by_best_key[:thumbnail_url].keys) + ) + + # And now for some more single-query beauty: check for existing hangers. + # 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 = @user.closet_hangers.where(owned: list.hangers_owned?) + + # Group existing hangers by item ID and whether they're from the current + # list or another list. + current_list_id = list.try_non_null(:id) + existing_hangers_by_item_id = hangers_scope. + where(item_id: items.map(&:id)). + group_by(&:item_id) + + # Careful! We're just using a single default empty list for performance, + # but it must not be mutated! If mutation becomes necessary, change this + # to a default_proc assignment. + existing_hangers_by_item_id.default = [] + + # Create closet hanger from each item, and remove them from the reference + # lists. + hangers = items.map do |item| + data = item_refs_by_best_key[:id].delete(item.id) || + item_refs_by_best_key[:thumbnail_url].delete(item.thumbnail_url) + + # If there's a hanger in the current list, we want it so we can update + # its quantity. If there's a hanger in another list, we want it so we + # know not to build a new one. Otherwise, build away! + existing_hangers = existing_hangers_by_item_id[item.id] + existing_hanger_in_current_list = existing_hangers.detect { |h| + h.list_id == current_list_id + } + hanger = existing_hanger_in_current_list || existing_hangers.first || + hangers_scope.build + + # We also don't want to move existing hangers from other lists, so only + # set the list if the hanger is new. (The item assignment is only + # necessary for new records, so may as well put it here, too.) + if hanger.new_record? + hanger.item = item + hanger.list_id = current_list_id + end + + # Finally, we don't want to update the quantity of hangers in those other + # lists, either, so only update quantity if it's in this list. (This will + # be true for some existing hangers and all new hangers. This is also the + # only value that could change for existing hangers; if nothing changes, + # it was an existing hanger from another list.) + hanger.quantity = data.quantity if hanger.list_id == current_list_id + + hanger + end + + # Take the names of the items remaining in the reference lists, meaning + # that they weren't found + unknown_item_names = [] + item_refs_by_best_key.each do |type, item_refs_by_key| + item_refs_by_key.each do |key, item_ref| + unknown_item_names << item_ref.name + end + end + + counts = {created: 0, updated: 0, unchanged: 0} + ClosetHanger.transaction do + hangers.each do |hanger| + if hanger.new_record? + counts[:created] += 1 + Rails.logger.debug("hanger: #{hanger.inspect}") + hanger.save! + elsif hanger.changed? + counts[:updated] += 1 + hanger.save! + else + counts[:unchanged] += 1 + end + end + end + + {counts: counts, unknown_item_names: unknown_item_names} + end + + + def list + @list ||= @user.find_closet_list_by_id_or_null_owned list_id + end + + + def persisted? + false + end + end + + + class ParseError < RuntimeError;end +end diff --git a/app/views/closet_hangers/index.html.haml b/app/views/closet_hangers/index.html.haml index f58950d5..24667e87 100644 --- a/app/views/closet_hangers/index.html.haml +++ b/app/views/closet_hangers/index.html.haml @@ -48,8 +48,8 @@ :value => user_closet_hangers_url(@user), :readonly => true} - = link_to t('.import_from.closet'), new_closet_page_path - = link_to t('.import_from.safety_deposit'), new_safety_deposit_page_path + = link_to t('.import_from.closet'), new_neopets_page_import_task_path(page_type: 'closet', expected_index: 1) + = link_to t('.import_from.safety_deposit'), new_neopets_page_import_task_path(page_type: 'safety_deposit', expected_index: 1) = link_to t('.import_from.neopets_user'), new_neopets_user_path = link_to t('.export_to.petpage'), petpage_user_closet_hangers_path(@user) diff --git a/app/views/neopets_pages/new.html.haml b/app/views/neopets_page_import_tasks/new.html.haml similarity index 59% rename from app/views/neopets_pages/new.html.haml rename to app/views/neopets_page_import_tasks/new.html.haml index 5cd8218b..4695b57d 100644 --- a/app/views/neopets_pages/new.html.haml +++ b/app/views/neopets_page_import_tasks/new.html.haml @@ -1,30 +1,30 @@ -- title t('.title', :name => @neopets_page.name, :index => @neopets_page.index) +- title t('.title', :name => @import_task.page.name, :index => @import_task.page.expected_index) - content_for :before_flashes do = link_to t('.your_items_link'), user_closet_hangers_path(current_user), :id => 'back-to-items' -= form_for @neopets_page, :html => {:id => 'closet-page-form'} do |f| - = f.hidden_field :index += form_for @import_task, :html => {:id => 'closet-page-form'} do |f| #closet-page-frame-wrapper %span %strong - = t '.frame_header', :name => @neopets_page.name, - :index => @neopets_page.index - %iframe#closet-page-frame{:src => @neopets_page.url} + = t '.frame_header', :name => @import_task.page.name, + :index => @import_task.page.expected_index + %iframe#closet-page-frame{:src => @import_task.page.url} #closet-page-source - = f.label :source, t('.source_header') - = f.text_area :source + = fields_for @import_task.page do |p| + = p.label :source, t('.source_header') + = p.text_area :source = f.select :list_id, neopets_page_list_options(current_user) = f.submit t('.submit') - localized_cache :action_suffix => 'explanation' do %p - = t '.help.welcome', :name => @neopets_page.name - = t '.help.intro', :name => @neopets_page.name + = t '.help.welcome', :name => @import_task.page.name + = t '.help.intro', :name => @import_task.page.name %ol %li - = twl '.help.check_frame.header', :page_link_url => @neopets_page.url, - :name => @neopets_page.name, :index => @neopets_page.index + = twl '.help.check_frame.header', :page_link_url => @import_task.page.url, + :name => @import_task.page.name, :index => @import_task.page.expected_index %ul %li %strong= t '.help.check_frame.check_login.summary' @@ -38,7 +38,7 @@ %li %strong = t '.help.check_frame.check_content.summary', - :name => @neopets_page.name + :name => @import_task.page.name = t '.help.check_frame.check_content.details' %li @@ -52,7 +52,7 @@ = t '.help.view_source.other' %li = twl '.help.view_source.troubleshooting', - :page_link_url => @neopets_page.url + :page_link_url => @import_task.page.url %li = t '.help.copy_source.header' @@ -64,4 +64,4 @@ = t '.help.submit.header' %ul %li - = t '.help.submit.description', :name => @neopets_page.name + = t '.help.submit.description', :name => @import_task.page.name diff --git a/config/locales/en-MEEP.yml b/config/locales/en-MEEP.yml index 9d1a7f83..fc7df697 100644 --- a/config/locales/en-MEEP.yml +++ b/config/locales/en-MEEP.yml @@ -331,7 +331,7 @@ en-MEEP: header: Meeped to you by footer: Meep! - neopets_pages: + neopets_page_import_tasks: create: success: Page %{index} meeped! created_and_updated_hangers: diff --git a/config/locales/en.yml b/config/locales/en.yml index fc4caf22..f161f07b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -398,7 +398,7 @@ en: user_wants: wants fits_pet_type: fits - neopets_pages: + neopets_page_import_tasks: create: success: Page %{index} saved! created_and_updated_hangers: diff --git a/config/locales/es.yml b/config/locales/es.yml index c6b62fb0..b482af41 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -279,7 +279,7 @@ es: user_closet_hanger_ownership: usuario user_owns: tiene user_wants: quiere - neopets_pages: + neopets_page_import_tasks: create: success: ¡Página %{index} guardada! created_and_updated_hangers: diff --git a/config/locales/pt.yml b/config/locales/pt.yml index cfccd326..2249d8fc 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -279,7 +279,7 @@ pt: user_closet_hanger_ownership: usuario user_owns: possui user_wants: quer - neopets_pages: + neopets_page_import_tasks: create: success: Página %{index} salva! created_and_updated_hangers: diff --git a/config/routes.rb b/config/routes.rb index 17d0a821..613ad966 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -40,11 +40,8 @@ OpenneoImpressItems::Application.routes.draw do resources :zones, only: [:index] scope 'import' do - resources :closet_pages, :only => [:new, :create], - :controller => 'neopets_pages', :path => 'closet/pages', :type => 'closet' - - resources :safety_deposit_pages, :only => [:new, :create], - :controller => 'neopets_pages', :path => 'sdb/pages', :type => 'sdb' + resources :neopets_page_import_tasks, only: [:new, :create], + path: ':page_type/pages/:expected_index' resources :neopets_users, :only => [:new, :create], :path => 'neopets-users' end