Commit b3dc4ef4d288d9120c9d9a95ef276aba0f633555
1 parent
1f1fb02a
Exists in
master
and in
29 other branches
ActionItem133: choosing categories
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1603 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
17 changed files
with
120 additions
and
22 deletions
Show diff stats
app/controllers/my_profile/profile_editor_controller.rb
... | ... | @@ -31,5 +31,15 @@ class ProfileEditorController < MyProfileController |
31 | 31 | end |
32 | 32 | end |
33 | 33 | end |
34 | + | |
35 | + def edit_categories | |
36 | + @profile_object = profile | |
37 | + if request.post? | |
38 | + if profile.update_attributes(params[:profile_object]) | |
39 | + redirect_to :action => 'index' | |
40 | + end | |
41 | + end | |
42 | + end | |
43 | + | |
34 | 44 | end |
35 | 45 | ... | ... |
app/helpers/application_helper.rb
... | ... | @@ -442,4 +442,23 @@ module ApplicationHelper |
442 | 442 | url |
443 | 443 | end |
444 | 444 | |
445 | + attr_reader :environment | |
446 | + def select_categories(object_name) | |
447 | + object = instance_variable_get("@#{object_name}") | |
448 | + | |
449 | + result = content_tag('h4', _('Categories')) | |
450 | + environment.top_level_categories.each do |toplevel| | |
451 | + toplevel.map_traversal do |cat| | |
452 | + if cat.top_level? | |
453 | + result << content_tag('h5', toplevel.name) | |
454 | + else | |
455 | + checkbox_id = "#{object_name}_#{cat.full_name.downcase.gsub(/\s+|\//, '_')}" | |
456 | + result << content_tag('label', check_box_tag("#{object_name}[category_ids][]", cat.id, object.category_ids.include?(cat.id), :id => checkbox_id) + cat.full_name_without_leading(1), :for => checkbox_id) | |
457 | + end | |
458 | + end | |
459 | + end | |
460 | + | |
461 | + content_tag('div', result) | |
462 | + end | |
463 | + | |
445 | 464 | end | ... | ... |
app/helpers/cms_helper.rb
... | ... | @@ -24,22 +24,4 @@ module CmsHelper |
24 | 24 | |
25 | 25 | attr_reader :environment |
26 | 26 | |
27 | - def select_categories(object_name) | |
28 | - object = instance_variable_get("@#{object_name}") | |
29 | - | |
30 | - result = content_tag('h4', _('Categories')) | |
31 | - environment.top_level_categories.each do |toplevel| | |
32 | - toplevel.map_traversal do |cat| | |
33 | - if cat.top_level? | |
34 | - result << content_tag('h5', toplevel.name) | |
35 | - else | |
36 | - checkbox_id = "#{object_name}_#{cat.full_name.downcase.gsub(/\s+|\//, '_')}" | |
37 | - result << content_tag('label', check_box_tag("#{object_name}[category_ids][]", cat.id, object.category_ids.include?(cat.id), :id => checkbox_id) + cat.full_name_without_leading(1), :for => checkbox_id) | |
38 | - end | |
39 | - end | |
40 | - end | |
41 | - | |
42 | - content_tag('div', result) | |
43 | - end | |
44 | - | |
45 | 27 | end | ... | ... |
app/models/category.rb
... | ... | @@ -25,6 +25,9 @@ class Category < ActiveRecord::Base |
25 | 25 | has_many :articles, :through => :article_categorizations |
26 | 26 | has_many :comments, :through => :articles |
27 | 27 | |
28 | + has_many :profile_categorizations | |
29 | + has_many :profiles, :through => :profile_categorizations | |
30 | + | |
28 | 31 | def recent_articles(limit = 10) |
29 | 32 | self.articles.recent(limit) |
30 | 33 | end | ... | ... |
app/models/profile.rb
... | ... | @@ -0,0 +1,7 @@ |
1 | +<% form_for :profile_object, @profile_object, :url => { :action => 'edit_categories'} do |f| %> | |
2 | + <%= select_categories('profile_object') %> | |
3 | + <% button_bar do %> | |
4 | + <%= submit_button('save', _('Save'), :cancel => {:action => 'edit_categories'}) %> | |
5 | + <%= button(:back, _('Back to control panel'), :controller => 'profile_editor') %> | |
6 | + <% end %> | |
7 | +<% end %> | ... | ... |
app/views/profile_editor/index.rhtml
... | ... | @@ -25,6 +25,8 @@ |
25 | 25 | |
26 | 26 | <%= file_manager_button(_('Manage Content'), 'icons-app/cms.png', :controller => 'cms') %> |
27 | 27 | |
28 | + <%= file_manager_button(_('Edit Categories'), 'icons-app/categories.png', :controller => 'profile_editor', :action => 'edit_categories') %> | |
29 | + | |
28 | 30 | <%= file_manager_button(_('Change Password'), 'icons-app/change-password.png', :controller => 'account', :action => 'change_password') if profile.person? %> |
29 | 31 | |
30 | 32 | <%= file_manager_button(_('Manage friends'), 'icons-app/friends.png', :controller => 'friends', :action => 'index') if profile.person? %> | ... | ... |
... | ... | @@ -0,0 +1,12 @@ |
1 | +class CreateCategoriesProfiles < ActiveRecord::Migration | |
2 | + def self.up | |
3 | + create_table :categories_profiles, :id => false do |t| | |
4 | + t.integer :profile_id | |
5 | + t.integer :category_id | |
6 | + end | |
7 | + end | |
8 | + | |
9 | + def self.down | |
10 | + drop_table :categories_profiles | |
11 | + end | |
12 | +end | ... | ... |
public/images/icons-app/README
3.03 KB
test/functional/profile_editor_controller_test.rb
... | ... | @@ -74,12 +74,23 @@ class ProfileEditorControllerTest < Test::Unit::TestCase |
74 | 74 | end |
75 | 75 | |
76 | 76 | should 'display categories to choose to associate profile' do |
77 | - cat = Environment.default.categories.build(:name => 'a category'); cat.save! | |
77 | + cat1 = Environment.default.categories.build(:name => 'top category'); cat1.save! | |
78 | + cat2 = Environment.default.categories.build(:name => 'sub category', :parent => cat1); cat2.save! | |
78 | 79 | person = create_user('test_user').person |
79 | - get :edit, :profile => 'test_user' | |
80 | - assert_tag :tag => 'input', :attributes => {:name => 'profile[category_ids][]'} | |
80 | + get :edit_categories, :profile => 'test_user' | |
81 | + assert_response :success | |
82 | + assert_template 'edit_categories' | |
83 | + assert_tag :tag => 'input', :attributes => {:name => 'profile_object[category_ids][]'} | |
81 | 84 | end |
82 | 85 | |
83 | - should 'save categorization of profile' | |
86 | + should 'save categorization of profile' do | |
87 | + cat1 = Environment.default.categories.build(:name => 'top category'); cat1.save! | |
88 | + cat2 = Environment.default.categories.build(:name => 'sub category', :parent => cat1); cat2.save! | |
89 | + person = create_user('test_user').person | |
90 | + post :edit_categories, :profile => 'test_user', :profile_object => {:category_ids => [cat2.id]} | |
91 | + assert_response :redirect | |
92 | + assert_redirected_to :action => 'index' | |
93 | + assert_includes person.categories, cat2 | |
94 | + end | |
84 | 95 | |
85 | 96 | end | ... | ... |
test/unit/category_test.rb
... | ... | @@ -276,4 +276,14 @@ class CategoryTest < Test::Unit::TestCase |
276 | 276 | assert_equivalent [c1, c2, c3], c.comments |
277 | 277 | end |
278 | 278 | |
279 | + should 'have profiles' do | |
280 | + c = @env.categories.build(:name => 'my category'); c.save! | |
281 | + person1 = create_user('testuser_one').person | |
282 | + person1.categories << c | |
283 | + person2 = create_user('testuser_two').person | |
284 | + person2.categories << c | |
285 | + assert_includes c.profiles, person1 | |
286 | + assert_includes c.profiles, person2 | |
287 | + end | |
288 | + | |
279 | 289 | end | ... | ... |
... | ... | @@ -0,0 +1,13 @@ |
1 | +require File.dirname(__FILE__) + '/../test_helper' | |
2 | + | |
3 | +class ProfileCategorizationTest < ActiveSupport::TestCase | |
4 | + should 'have profile and category' do | |
5 | + person = create_user('test_user').person | |
6 | + cat = Environment.default.categories.build(:name => 'a category'); cat.save! | |
7 | + person.categories << cat | |
8 | + person.save! | |
9 | + assert_includes person.categories, cat | |
10 | + assert_includes cat.profiles, person | |
11 | + assert_equal [cat.id], person.category_ids | |
12 | + end | |
13 | +end | ... | ... |
test/unit/profile_test.rb
... | ... | @@ -377,6 +377,19 @@ class ProfileTest < Test::Unit::TestCase |
377 | 377 | assert_equal [t2, t3], c.tasks.finished |
378 | 378 | end |
379 | 379 | |
380 | + should 'responds to categories' do | |
381 | + c = Profile.create!(:name => 'my test profile', :identifier => 'mytestprofile') | |
382 | + assert_respond_to c, :categories | |
383 | + end | |
384 | + | |
385 | + should 'have categories' do | |
386 | + c = Profile.create!(:name => 'my test profile', :identifier => 'mytestprofile') | |
387 | + cat = Environment.default.categories.build(:name => 'a category'); cat.save! | |
388 | + c.categories << cat | |
389 | + c.save! | |
390 | + assert_includes c.categories, cat | |
391 | + end | |
392 | + | |
380 | 393 | private |
381 | 394 | |
382 | 395 | def assert_invalid_identifier(id) | ... | ... |