Commit 18bbbd048d5806859fef5fb67c6f559f562578da
1 parent
2c1b5026
Exists in
master
and in
23 other branches
New subcategory uses parent class
* Also including a migration to remove subcategories of
ProductCategory that aren't a subclass of ProductCategory.
(ActionItem2007)
Showing
6 changed files
with
43 additions
and
3 deletions
Show diff stats
app/controllers/admin/categories_controller.rb
| @@ -14,7 +14,7 @@ class CategoriesController < AdminController | @@ -14,7 +14,7 @@ class CategoriesController < AdminController | ||
| 14 | 14 | ||
| 15 | # posts back | 15 | # posts back |
| 16 | def new | 16 | def new |
| 17 | - type = (params[:type] || 'Category') | 17 | + type = (params[:type] || params[:parent_type] || 'Category') |
| 18 | raise 'Type not allowed' unless ALLOWED_TYPES.include?(type) | 18 | raise 'Type not allowed' unless ALLOWED_TYPES.include?(type) |
| 19 | 19 | ||
| 20 | @category = type.constantize.new(params[:category]) | 20 | @category = type.constantize.new(params[:category]) |
app/controllers/my_profile/manage_products_controller.rb
| @@ -40,8 +40,8 @@ class ManageProductsController < ApplicationController | @@ -40,8 +40,8 @@ class ManageProductsController < ApplicationController | ||
| 40 | end | 40 | end |
| 41 | 41 | ||
| 42 | def new | 42 | def new |
| 43 | - @product = @profile.products.build(:product_category_id => params[:selected_category_id]) | ||
| 44 | - @category = @product.product_category | 43 | + @category = params[:selected_category_id] ? Category.find(params[:selected_category_id]) : nil |
| 44 | + @product = @profile.products.build(:product_category => @category) | ||
| 45 | @categories = ProductCategory.top_level_for(environment) | 45 | @categories = ProductCategory.top_level_for(environment) |
| 46 | @level = 0 | 46 | @level = 0 |
| 47 | if request.post? | 47 | if request.post? |
db/migrate/20110520150544_remove_categories_with_invalid_type.rb
0 → 100644
| @@ -0,0 +1,18 @@ | @@ -0,0 +1,18 @@ | ||
| 1 | +class RemoveCategoriesWithInvalidType < ActiveRecord::Migration | ||
| 2 | + | ||
| 3 | + def self.remove_invalid(category) | ||
| 4 | + if category.class != ProductCategory && !category.class.ancestors.include?(ProductCategory) | ||
| 5 | + category.destroy | ||
| 6 | + else | ||
| 7 | + category.children.map { |child| remove_invalid(child) } | ||
| 8 | + end | ||
| 9 | + end | ||
| 10 | + | ||
| 11 | + def self.up | ||
| 12 | + ProductCategory.all.map { |category| remove_invalid(category)} | ||
| 13 | + end | ||
| 14 | + | ||
| 15 | + def self.down | ||
| 16 | + say "this migration can't be reverted" | ||
| 17 | + end | ||
| 18 | +end |
test/functional/categories_controller_test.rb
| @@ -167,4 +167,11 @@ class CategoriesControllerTest < Test::Unit::TestCase | @@ -167,4 +167,11 @@ class CategoriesControllerTest < Test::Unit::TestCase | ||
| 167 | assert_equal [r], assigns(:regions) | 167 | assert_equal [r], assigns(:regions) |
| 168 | end | 168 | end |
| 169 | 169 | ||
| 170 | + should 'use parent\'s type to determine subcategory\'s type' do | ||
| 171 | + parent = ProductCategory.create!(:name => 'Sample category', :environment => Environment.default) | ||
| 172 | + post :new, :parent_id => parent.id, :parent_type => parent.class.name, :category => {:name => 'Subcategory'} | ||
| 173 | + sub = Category.last | ||
| 174 | + assert_equal parent.class, sub.class | ||
| 175 | + end | ||
| 176 | + | ||
| 170 | end | 177 | end |
test/functional/manage_products_controller_test.rb
| @@ -170,6 +170,14 @@ class ManageProductsControllerTest < Test::Unit::TestCase | @@ -170,6 +170,14 @@ class ManageProductsControllerTest < Test::Unit::TestCase | ||
| 170 | end | 170 | end |
| 171 | end | 171 | end |
| 172 | 172 | ||
| 173 | + should 'not create a new product with an invalid category' do | ||
| 174 | + category1 = fast_create(Category, :name => 'Category 1') | ||
| 175 | + category2 = fast_create(Category, :name => 'Category 2', :parent_id => category1) | ||
| 176 | + assert_raise ActiveRecord::AssociationTypeMismatch do | ||
| 177 | + post 'new', :profile => @enterprise.identifier, :product => { :name => 'test product' }, :selected_category_id => category2.id | ||
| 178 | + end | ||
| 179 | + end | ||
| 180 | + | ||
| 173 | should 'filter html from name of product' do | 181 | should 'filter html from name of product' do |
| 174 | category = fast_create(ProductCategory, :name => 'Category 1') | 182 | category = fast_create(ProductCategory, :name => 'Category 1') |
| 175 | post 'new', :profile => @enterprise.identifier, :product => { :name => "<b id='html_name'>name bold</b>" }, :selected_category_id => category.id | 183 | post 'new', :profile => @enterprise.identifier, :product => { :name => "<b id='html_name'>name bold</b>" }, :selected_category_id => category.id |
test/unit/product_test.rb
| @@ -244,6 +244,13 @@ class ProductTest < Test::Unit::TestCase | @@ -244,6 +244,13 @@ class ProductTest < Test::Unit::TestCase | ||
| 244 | assert product.errors.invalid?(:product_category_id) | 244 | assert product.errors.invalid?(:product_category_id) |
| 245 | end | 245 | end |
| 246 | 246 | ||
| 247 | + should 'not save with a invalid category' do | ||
| 248 | + category = Category.new(:name => 'Region', :environment => Environment.default) | ||
| 249 | + assert_raise ActiveRecord::AssociationTypeMismatch do | ||
| 250 | + Product.new(:name => 'Invalid category product', :product_category => category) | ||
| 251 | + end | ||
| 252 | + end | ||
| 253 | + | ||
| 247 | should 'format values to float with 2 decimals' do | 254 | should 'format values to float with 2 decimals' do |
| 248 | ent = fast_create(Enterprise, :name => 'test ent 1', :identifier => 'test_ent1') | 255 | ent = fast_create(Enterprise, :name => 'test ent 1', :identifier => 'test_ent1') |
| 249 | product = fast_create(Product, :enterprise_id => ent.id, :price => 12.994, :discount => 1.994) | 256 | product = fast_create(Product, :enterprise_id => ent.id, :price => 12.994, :discount => 1.994) |