Commit 1abaaf1a477fb080e8748f3e1c137bbde060fcd7

Authored by AntonioTerceiro
1 parent 60c3a8e0

ActionItem33: implementing ProductCategory class and making possible for the adm…

…inistrator to create different types of categories



git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@609 3f533792-8f58-4932-b0fe-aaf55b0a4547
app/controllers/environment_admin/categories_controller.rb
... ... @@ -6,9 +6,14 @@ class CategoriesController < EnvironmentAdminController
6 6 @categories = environment.top_level_categories
7 7 end
8 8  
  9 + ALLOWED_TYPES = CategoriesHelper::TYPES.map {|item| item[1] }
  10 +
9 11 # posts back
10 12 def new
11   - @category = Category.new(params[:category])
  13 + type = (params[:type] || 'Category')
  14 + raise 'Type not allowed' unless ALLOWED_TYPES.include?(type)
  15 +
  16 + @category = type.constantize.new(params[:category])
12 17 @category.environment = environment
13 18 if params[:parent_id]
14 19 @category.parent = environment.categories.find(params[:parent_id])
... ...
app/helpers/categories_helper.rb
... ... @@ -10,6 +10,11 @@ module CategoriesHelper
10 10 [ N_('Orange'), 4 ],
11 11 ]
12 12  
  13 + TYPES = [
  14 + [ _('Categoria Geral'), Category.to_s ],
  15 + [ _('Product Category'), ProductCategory.to_s ],
  16 + ]
  17 +
13 18 def select_color_for_category
14 19 if @category.top_level?
15 20 labelled_form_field(_('Display at the menu?'), select('category', 'display_color', CategoriesHelper::COLORS.map {|item| [gettext(item[0]), item[1]] }))
... ... @@ -27,4 +32,9 @@ module CategoriesHelper
27 32 end
28 33 end
29 34  
  35 + def select_category_type(field)
  36 + value = params[field]
  37 + labelled_form_field(_('Type of category'), select_tag('type', options_for_select(CategoriesHelper::TYPES, value)))
  38 + end
  39 +
30 40 end
... ...
app/models/category.rb
... ... @@ -8,8 +8,16 @@ class Category < ActiveRecord::Base
8 8 validates_inclusion_of :display_color, :in => [ 1, 2, 3, 4, nil ]
9 9 validates_uniqueness_of :display_color, :scope => :environment_id, :if => (lambda { |cat| ! cat.display_color.nil? }), :message => N_('%{fn} was already assigned to another category.')
10 10  
  11 + def validate
  12 + if self.parent && (self.class != self.parent.class)
  13 + self.errors.add(:type, _("%{fn} must be the same as the parents'"))
  14 + end
  15 + end
  16 +
11 17 acts_as_tree :order => 'name'
12 18  
  19 +
  20 +
13 21 def full_name(sep = '/')
14 22 self.parent ? (self.parent.full_name(sep) + sep + self.name) : (self.name)
15 23 end
... ...
app/models/product_category.rb 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +class ProductCategory < Category
  2 +end
... ...
app/views/categories/_form.rhtml
1 1 <%= error_messages_for 'category' %>
2 2  
3 3 <% labelled_form_for 'category' do |f| %>
4   - <% if @category.new_record? && @category.parent %>
5   - <%= hidden_field_tag('parent_id', @category.parent.id) %>
  4 + <% if @category.new_record? %>
  5 + <% if @category.parent %>
  6 + <%= hidden_field_tag('parent_id', @category.parent.id) %>
  7 + <% end %>
  8 + <%= select_category_type :type %>
6 9 <% end %>
7 10  
8 11 <%= select_color_for_category %>
... ...
test/functional/categories_controller_test.rb
... ... @@ -39,12 +39,18 @@ class CategoriesControllerTest &lt; Test::Unit::TestCase
39 39 assert_equal 'new name for category', Category.find(cat1.id).name
40 40 end
41 41  
42   - def test_new
  42 + def test_new_category
43 43 cat = Category.new
44 44 Category.expects(:new).returns(cat)
45 45 get :new
46 46 end
47 47  
  48 + def test_new_product_category
  49 + cat = ProductCategory.new
  50 + ProductCategory.expects(:new).returns(cat)
  51 + get :new, :type => 'ProductCategory'
  52 + end
  53 +
48 54 def test_new_save
49 55 assert_difference Category, :count do
50 56 post :new, :category => { :name => 'a new category' }
... ...
test/unit/product_category_test.rb 0 → 100644
... ... @@ -0,0 +1,20 @@
  1 +require File.dirname(__FILE__) + '/../test_helper'
  2 +
  3 +class ProductCategoryTest < Test::Unit::TestCase
  4 + # TODO: please write tests here when ProductCategory has something
  5 + def test_require_same_class_for_children
  6 + c1 = ProductCategory.new(:name => 'Some Product Type', :environment_id => 1)
  7 + c1.save!
  8 +
  9 + c2 = Category.new(:name => 'wrong', :environment_id => 1)
  10 + c1.children << c2
  11 +
  12 + assert !c2.valid?
  13 + assert c2.errors.invalid?(:type)
  14 +
  15 + c3 = ProductCategory.new(:name => 'right', :environment_id => 1)
  16 + c1.children << c3
  17 + assert c3.valid?
  18 + assert !c3.errors.invalid?(:type)
  19 + end
  20 +end
... ...