Commit 7895b41c43486d5ef685413148ae48ff33d83fd1
1 parent
9db73231
Exists in
master
and in
29 other branches
ActionItem32: added a block, management and add button for favorite enterprises
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1794 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
16 changed files
with
320 additions
and
0 deletions
Show diff stats
app/controllers/my_profile/favorite_enterprises_controller.rb
0 → 100644
... | ... | @@ -0,0 +1,27 @@ |
1 | +class FavoriteEnterprisesController < MyProfileController | |
2 | + | |
3 | +# protect 'manage_favorite_enteprises', :profile | |
4 | + | |
5 | + requires_profile_class Person | |
6 | + | |
7 | + def index | |
8 | + @favorite_enterprises = profile.favorite_enterprises | |
9 | + end | |
10 | + | |
11 | + def add | |
12 | + @favorite_enterprise = Enterprise.find(params[:id]) | |
13 | + if request.post? && params[:confirmation] | |
14 | + profile.favorite_enterprises << @favorite_enterprise | |
15 | + redirect_to :action => 'index' | |
16 | + end | |
17 | + end | |
18 | + | |
19 | + def remove | |
20 | + @favorite_enterprise = profile.favorite_enterprises.find(params[:id]) | |
21 | + if request.post? && params[:confirmation] | |
22 | + profile.favorite_enterprises.delete(@favorite_enterprise) | |
23 | + redirect_to :action => 'index' | |
24 | + end | |
25 | + end | |
26 | + | |
27 | +end | ... | ... |
app/controllers/my_profile/profile_design_controller.rb
app/controllers/public/profile_controller.rb
... | ... | @@ -0,0 +1,34 @@ |
1 | +class FavoriteEnterprisesBlock < ProfileListBlock | |
2 | + | |
3 | + def title | |
4 | + _('Favorite Enterprises') | |
5 | + end | |
6 | + | |
7 | + def help | |
8 | + _('This user\'s favorite enterprises.') | |
9 | + end | |
10 | + | |
11 | + def self.description | |
12 | + _('A block that displays your favorite enterprises') | |
13 | + end | |
14 | + | |
15 | + def footer | |
16 | + owner = self.owner | |
17 | + return '' unless owner.kind_of?(Person) | |
18 | + lambda do | |
19 | + link_to _('All favorite enterprises'), :profile => owner.identifier, :controller => 'profile', :action => 'favorite_enterprises' | |
20 | + end | |
21 | + end | |
22 | + | |
23 | + | |
24 | + def profile_finder | |
25 | + @profile_finder ||= FavoriteEnterprisesBlock::Finder.new(self) | |
26 | + end | |
27 | + | |
28 | + class Finder < ProfileListBlock::Finder | |
29 | + def ids | |
30 | + block.owner.favorite_enterprises.map(&:id) | |
31 | + end | |
32 | + end | |
33 | + | |
34 | +end | ... | ... |
app/models/person.rb
... | ... | @@ -108,4 +108,6 @@ class Person < Profile |
108 | 108 | person_info.nil? ? self[:name] : (person_info.name || self[:name]) |
109 | 109 | end |
110 | 110 | |
111 | + has_and_belongs_to_many :favorite_enterprises, :class_name => 'Enterprise', :join_table => 'favorite_enteprises_people' | |
112 | + | |
111 | 113 | end | ... | ... |
app/views/blocks/profile_info_actions/enterprise.rhtml
... | ... | @@ -0,0 +1,5 @@ |
1 | +<ul> | |
2 | + <%if logged_in? && (! user.favorite_enterprises.include?(profile)) %> | |
3 | + <li><%= link_to content_tag('span', _('Add favorite enterprise')), { :profile => user.identifier, :controller => 'favorite_enterprises', :action => 'add', :id => profile.id }, :class => 'button with-text icon-add' %></li> | |
4 | + <% end %> | |
5 | +</ul> | ... | ... |
... | ... | @@ -0,0 +1,12 @@ |
1 | +<h1><%= _('Adding %s as a favorite enterprise') % @favorite_enterprise.name %></h1> | |
2 | + | |
3 | +<p> | |
4 | +<%= _('Are you sure you want to add %s as your favorite enterprise?') % @favorite_enterprise.name %> | |
5 | +</p> | |
6 | + | |
7 | +<% form_tag do %> | |
8 | + <%= hidden_field_tag(:confirmation, 1) %> | |
9 | + | |
10 | + <%= submit_button(:ok, _("Yes, I want to add %s as a favorite enterprise") % @favorite_enterprise.name) %> | |
11 | + <%= button(:cancel, _("No, I don't want"), :action => 'index') %> | |
12 | +<% end %> | ... | ... |
... | ... | @@ -0,0 +1,33 @@ |
1 | +<div id="manage_favorite_enterprises"> | |
2 | + | |
3 | +<h1><%= _("%s's favorite enteprises") % profile.name %></h1> | |
4 | + | |
5 | +<ul class='profile-list'> | |
6 | +<% @favorite_enterprises.each do |enterprise| %> | |
7 | + <li> | |
8 | + <%= profile_image_link enterprise %> | |
9 | + <div class="controll"> | |
10 | + <%= link_to content_tag('span',_('remove')), | |
11 | + { :action => 'remove', :id => enterprise.id }, | |
12 | + :class => 'button icon-delete', | |
13 | + :title => _('remove'), | |
14 | + :help => _('Clicking on this button will remove your friend relation with %s.') % enterprise.name %> | |
15 | + </div><!-- end class="controll" --> | |
16 | + </li> | |
17 | +<% end %> | |
18 | +</ul> | |
19 | + | |
20 | +<% if @favorite_enterprises.empty? %> | |
21 | +<p> | |
22 | +<em> | |
23 | + <%= _('You have no favorite enteprises yet. Go make some.') %> | |
24 | +</em> | |
25 | +</p> | |
26 | +<% end %> | |
27 | + | |
28 | +<% button_bar do %> | |
29 | + <%= button(:back, _('Go back'), :controller => 'profile_editor') %> | |
30 | +<% end %> | |
31 | + | |
32 | +</div><!-- end id="manage_friends" --> | |
33 | + | ... | ... |
... | ... | @@ -0,0 +1,18 @@ |
1 | +<div id="remove_favorite_enterprise"> | |
2 | + | |
3 | +<h1><%= _('Removing favorite enterprise: %s') % @favorite_enterprise.name %></h1> | |
4 | + | |
5 | +<%= profile_image @favorite_enterprise, :thumb, :class => 'favorite_enterprise_picture' %> | |
6 | + | |
7 | +<p> | |
8 | +<%= _('Are you sure you want to remove %s from your favorite enterprise list?') % @favorite_enterprise.name %> | |
9 | +</p> | |
10 | + | |
11 | +<% form_tag do %> | |
12 | + <%= hidden_field_tag(:confirmation, 1) %> | |
13 | + | |
14 | + <%= submit_button(:ok, _("Yes, I want to remove %s from my favorite enterprise list") % @favorite_enterprise.name) %> | |
15 | + <%= button(:cancel, _("No, I don't want"), :action => 'index') %> | |
16 | +<% end %> | |
17 | + | |
18 | +</div><!-- end id="remove_favorite_enterprise" --> | ... | ... |
... | ... | @@ -0,0 +1,18 @@ |
1 | +<div class="common-profile-list-block" | |
2 | + help="<%= _('Here are all <b>%s</b>\'s favorite enterprises.') % profile.name %>"> | |
3 | + | |
4 | +<h1><%= _("%s's favorite enterprises") % profile.name %></h1> | |
5 | + | |
6 | +<ul class='profile-list'> | |
7 | +<% @favorite_enterprises.each do |enterprise| %> | |
8 | + <li><%= profile_image_link(enterprise)%></li> | |
9 | +<% end %> | |
10 | +</ul> | |
11 | + | |
12 | +<% button_bar do %> | |
13 | + <%= button :back, _('Go back'), { :controller => 'profile' }, | |
14 | + :help => _('Back to the page where you come from.') %> | |
15 | +<% end %> | |
16 | + | |
17 | +</div><!-- fim class="common-profile-list-block" --> | |
18 | + | ... | ... |
... | ... | @@ -0,0 +1,12 @@ |
1 | +class FavoriteEnterprisesPeople < ActiveRecord::Migration | |
2 | + def self.up | |
3 | + create_table :favorite_enteprises_people, :id => false do |t| | |
4 | + t.integer :person_id | |
5 | + t.integer :enterprise_id | |
6 | + end | |
7 | + end | |
8 | + | |
9 | + def self.down | |
10 | + drop_table :favorite_enteprises_people | |
11 | + end | |
12 | +end | ... | ... |
... | ... | @@ -0,0 +1,71 @@ |
1 | +require File.dirname(__FILE__) + '/../test_helper' | |
2 | +require 'favorite_enterprises_controller' | |
3 | + | |
4 | +class FavoriteEnterprisesController; def rescue_action(e) raise e end; end | |
5 | + | |
6 | +class FavoriteEnterprisesControllerTest < Test::Unit::TestCase | |
7 | + | |
8 | + noosfero_test :profile => 'testuser' | |
9 | + | |
10 | + def setup | |
11 | + @controller = FavoriteEnterprisesController.new | |
12 | + @request = ActionController::TestRequest.new | |
13 | + @response = ActionController::TestResponse.new | |
14 | + | |
15 | + self.profile = create_user('testuser').person | |
16 | + self.favorite_enterprise = Enterprise.create!(:name => 'the_enterprise', :identifier => 'the_enterprise') | |
17 | + login_as ('testuser') | |
18 | + end | |
19 | + attr_accessor :profile, :favorite_enterprise | |
20 | + | |
21 | + def test_local_files_reference | |
22 | + assert_local_files_reference | |
23 | + end | |
24 | + | |
25 | + def test_valid_xhtml | |
26 | + assert_valid_xhtml | |
27 | + end | |
28 | + | |
29 | + should 'list favorite enterprises' do | |
30 | + get :index | |
31 | + assert_response :success | |
32 | + assert_template 'index' | |
33 | + assert_kind_of Array, assigns(:favorite_enterprises) | |
34 | + end | |
35 | + | |
36 | + should 'confirm addition of new favorite enterprise' do | |
37 | + get :add, :id => favorite_enterprise.id | |
38 | + | |
39 | + assert_response :success | |
40 | + assert_template 'add' | |
41 | + | |
42 | + ok("must load the favorite enterprise being added to display") { favorite_enterprise == assigns(:favorite_enterprise) } | |
43 | + | |
44 | + end | |
45 | + | |
46 | + should 'actually add favorite_enterprise' do | |
47 | + assert_difference profile.favorite_enterprises, :count do | |
48 | + post :add, :id => favorite_enterprise.id, :confirmation => '1' | |
49 | + assert_response :redirect | |
50 | + end | |
51 | + end | |
52 | + | |
53 | + should 'confirm removal of favorite enterprise' do | |
54 | + profile.favorite_enterprises << favorite_enterprise | |
55 | + | |
56 | + get :remove, :id => favorite_enterprise.id | |
57 | + assert_response :success | |
58 | + assert_template 'remove' | |
59 | + ok("must load the favorite_enterprise being removed") { favorite_enterprise == assigns(:favorite_enterprise) } | |
60 | + end | |
61 | + | |
62 | + should 'actually remove favorite_enterprise' do | |
63 | + profile.favorite_enterprises << favorite_enterprise | |
64 | + | |
65 | + assert_difference profile.favorite_enterprises, :count, -1 do | |
66 | + post :remove, :id => favorite_enterprise.id, :confirmation => '1' | |
67 | + assert_redirected_to :action => 'index' | |
68 | + end | |
69 | + end | |
70 | + | |
71 | +end | ... | ... |
test/functional/profile_controller_test.rb
... | ... | @@ -54,6 +54,14 @@ class ProfileControllerTest < Test::Unit::TestCase |
54 | 54 | assert_template 'members' |
55 | 55 | assert_kind_of Array, assigns(:members) |
56 | 56 | end |
57 | + | |
58 | + should 'list favorite enterprises' do | |
59 | + get :favorite_enterprises | |
60 | + | |
61 | + assert_response :success | |
62 | + assert_template 'favorite_enterprises' | |
63 | + assert_kind_of Array, assigns(:favorite_enterprises) | |
64 | + end | |
57 | 65 | |
58 | 66 | should 'show Join This Community button for non-member users' do |
59 | 67 | login_as(@profile.identifier) | ... | ... |
... | ... | @@ -0,0 +1,63 @@ |
1 | +require File.dirname(__FILE__) + '/../test_helper' | |
2 | + | |
3 | +class FavoriteEnterprisesBlockTest < ActiveSupport::TestCase | |
4 | + | |
5 | + should 'inherit from ProfileListBlock' do | |
6 | + assert_kind_of ProfileListBlock, FavoriteEnterprisesBlock.new | |
7 | + end | |
8 | + | |
9 | + should 'declare its title' do | |
10 | + assert_not_equal ProfileListBlock.new.title, FavoriteEnterprisesBlock.new.title | |
11 | + end | |
12 | + | |
13 | + should 'describe itself' do | |
14 | + assert_not_equal ProfileListBlock.description, FavoriteEnterprisesBlock.description | |
15 | + end | |
16 | + | |
17 | + should 'use its own finder' do | |
18 | + assert_not_equal FavoriteEnterprisesBlock::Finder, ProfileListBlock::Finder | |
19 | + assert_kind_of FavoriteEnterprisesBlock::Finder, FavoriteEnterprisesBlock.new.profile_finder | |
20 | + end | |
21 | + | |
22 | + should 'list owner favorite enterprises' do | |
23 | + | |
24 | + block = FavoriteEnterprisesBlock.new | |
25 | + block.limit = 2 | |
26 | + | |
27 | + owner = mock | |
28 | + block.expects(:owner).returns(owner) | |
29 | + | |
30 | + member1 = mock; member1.stubs(:id).returns(1) | |
31 | + member2 = mock; member2.stubs(:id).returns(2) | |
32 | + member3 = mock; member3.stubs(:id).returns(3) | |
33 | + | |
34 | + owner.expects(:favorite_enterprises).returns([member1, member2, member3]) | |
35 | + | |
36 | + block.profile_finder.expects(:pick_random).with(3).returns(2) | |
37 | + block.profile_finder.expects(:pick_random).with(2).returns(0) | |
38 | + | |
39 | + Profile.expects(:find).with(3).returns(member3) | |
40 | + Profile.expects(:find).with(1).returns(member1) | |
41 | + | |
42 | + assert_equal [member3, member1], block.profiles | |
43 | + end | |
44 | + | |
45 | + should 'link to all enterprises for person' do | |
46 | + person = Person.new | |
47 | + person.expects(:identifier).returns('theprofile') | |
48 | + block = FavoriteEnterprisesBlock.new | |
49 | + block.expects(:owner).returns(person) | |
50 | + | |
51 | + expects(:_).with('All favorite enterprises').returns('All enterprises') | |
52 | + expects(:link_to).with('All enterprises', :controller => 'profile', :profile => 'theprofile', :action => 'favorite_enterprises') | |
53 | + | |
54 | + instance_eval(&block.footer) | |
55 | + end | |
56 | + | |
57 | + should 'give empty footer for unsupported owner type' do | |
58 | + block = FavoriteEnterprisesBlock.new | |
59 | + block.expects(:owner).returns(1) | |
60 | + assert_equal '', block.footer | |
61 | + end | |
62 | + | |
63 | +end | ... | ... |
test/unit/person_test.rb
... | ... | @@ -215,6 +215,15 @@ class PersonTest < Test::Unit::TestCase |
215 | 215 | assert_equal 'randomhacker', p.name |
216 | 216 | end |
217 | 217 | |
218 | + should 'have favorite enterprises' do | |
219 | + p = create_user('test_person').person | |
220 | + e = Enterprise.create!(:name => 'test_ent', :identifier => 'test_ent') | |
221 | + | |
222 | + p.favorite_enterprises << e | |
223 | + | |
224 | + assert_includes Person.find(p.id).favorite_enterprises, e | |
225 | + end | |
226 | + | |
218 | 227 | should 'save info' do |
219 | 228 | person = create_user('new_person').person |
220 | 229 | person.info = {:contact_information => 'my contact'} | ... | ... |