Commit 091011fb2091a58530be6910222e9a0d1ff42e0d
Committed by
Antonio Terceiro
1 parent
0261c5e4
Exists in
master
and in
28 other branches
ActionItem900: added join community popup
added an evironment feature to track the join commnity popup made the pupup appear in the rigth context added ask_to_join? method to person moved join to profile controller and added the popup added the popup window
Showing
18 changed files
with
256 additions
and
51 deletions
Show diff stats
app/controllers/my_profile/memberships_controller.rb
| ... | ... | @@ -6,15 +6,6 @@ class MembershipsController < MyProfileController |
| 6 | 6 | @memberships = profile.memberships |
| 7 | 7 | end |
| 8 | 8 | |
| 9 | - def join | |
| 10 | - @to_join = Profile.find(params[:id]) | |
| 11 | - if request.post? && params[:confirmation] | |
| 12 | - @to_join.add_member(profile) | |
| 13 | - flash[:notice] = _('%s administrator still needs to accept you as member.') % @to_join.name if @to_join.closed? | |
| 14 | - redirect_to @to_join.url | |
| 15 | - end | |
| 16 | - end | |
| 17 | - | |
| 18 | 9 | def leave |
| 19 | 10 | @to_leave = Profile.find(params[:id]) |
| 20 | 11 | ... | ... |
app/controllers/public/profile_controller.rb
| ... | ... | @@ -2,6 +2,7 @@ class ProfileController < PublicController |
| 2 | 2 | |
| 3 | 3 | needs_profile |
| 4 | 4 | before_filter :check_access_to_profile |
| 5 | + before_filter :login_required, :only => [:join, :refuse_join] | |
| 5 | 6 | |
| 6 | 7 | helper TagsHelper |
| 7 | 8 | |
| ... | ... | @@ -42,6 +43,21 @@ class ProfileController < PublicController |
| 42 | 43 | @articles = profile.top_level_articles |
| 43 | 44 | end |
| 44 | 45 | |
| 46 | + def join | |
| 47 | + if request.post? && params[:confirmation] | |
| 48 | + profile.add_member(current_user.person) | |
| 49 | + flash[:notice] = _('%s administrator still needs to accept you as member.') % profile.name if profile.closed? | |
| 50 | + redirect_to profile.url | |
| 51 | + end | |
| 52 | + end | |
| 53 | + | |
| 54 | + def refuse_join | |
| 55 | + p = current_user.person | |
| 56 | + p.refused_communities << profile | |
| 57 | + p.save | |
| 58 | + redirect_to profile.url | |
| 59 | + end | |
| 60 | + | |
| 45 | 61 | protected |
| 46 | 62 | |
| 47 | 63 | def check_access_to_profile | ... | ... |
app/helpers/application_helper.rb
| ... | ... | @@ -761,4 +761,11 @@ module ApplicationHelper |
| 761 | 761 | end |
| 762 | 762 | end |
| 763 | 763 | |
| 764 | + def ask_to_join? | |
| 765 | + return if environment.enabled?(:disable_join_community_popup) | |
| 766 | + return unless profile && profile.kind_of?(Community) | |
| 767 | + return true unless logged_in? | |
| 768 | + user.ask_to_join?(profile) | |
| 769 | + end | |
| 770 | + | |
| 764 | 771 | end | ... | ... |
app/models/environment.rb
| ... | ... | @@ -37,6 +37,7 @@ class Environment < ActiveRecord::Base |
| 37 | 37 | 'disable_select_city_for_contact' => _('Disable state/city select for contact form'), |
| 38 | 38 | 'disable_contact_person' => _('Disable contact for people'), |
| 39 | 39 | 'disable_contact_community' => _('Disable contact for groups/communities'), |
| 40 | + 'disable_join_community_popup' => _('Disable the popup that ask to join a group/community'), | |
| 40 | 41 | } |
| 41 | 42 | end |
| 42 | 43 | ... | ... |
app/models/person.rb
| ... | ... | @@ -219,4 +219,15 @@ class Person < Profile |
| 219 | 219 | self.friends.include?(person) |
| 220 | 220 | end |
| 221 | 221 | |
| 222 | + has_and_belongs_to_many :refused_communities, :class_name => 'Community', :join_table => 'refused_join_community' | |
| 223 | + | |
| 224 | + def ask_to_join?(community) | |
| 225 | + return false if memberships.include?(community) | |
| 226 | + !refused_communities.include?(community) | |
| 227 | + end | |
| 228 | + | |
| 229 | + def refuse_join(community) | |
| 230 | + refused_communities << community | |
| 231 | + end | |
| 232 | + | |
| 222 | 233 | end | ... | ... |
app/views/blocks/profile_info_actions/community.rhtml
| ... | ... | @@ -7,7 +7,7 @@ |
| 7 | 7 | </li> |
| 8 | 8 | <% else %> |
| 9 | 9 | <li> |
| 10 | - <%= link_to content_tag('span', _('Join')), { :profile => user.identifier, :controller => 'memberships', :action => 'join', :id => profile.id }, :class => 'button with-text icon-add', :title => _('Join this community') %> | |
| 10 | + <%= link_to content_tag('span', _('Join')), { :profile => profile.identifier, :controller => 'profile', :action => 'join' }, :class => 'button with-text icon-add', :title => _('Join this community') %> | |
| 11 | 11 | </li> |
| 12 | 12 | <% end %> |
| 13 | 13 | ... | ... |
app/views/layouts/application.rhtml
app/views/memberships/join.rhtml
| ... | ... | @@ -1,11 +0,0 @@ |
| 1 | -<h1><%= _('Joining %s') % @to_join.name %></h1> | |
| 2 | - | |
| 3 | -<p> | |
| 4 | -<%= _('Are you sure you want to join %s?') % @to_join.name %> | |
| 5 | -</p> | |
| 6 | - | |
| 7 | -<% form_tag do %> | |
| 8 | - <%= hidden_field_tag(:confirmation, 1) %> | |
| 9 | - <%= submit_button(:ok, _("Yes, I want to join.") % @to_join.name) %> | |
| 10 | - <%= button(:cancel, _("No, I don't want."), :action => 'index') %> | |
| 11 | -<% end %> |
| ... | ... | @@ -0,0 +1,11 @@ |
| 1 | +<h1><%= _('Joining %s') % profile.name %></h1> | |
| 2 | + | |
| 3 | +<p> | |
| 4 | +<%= _('Are you sure you want to join %s?') % profile.name %> | |
| 5 | +</p> | |
| 6 | + | |
| 7 | +<% form_tag do %> | |
| 8 | + <%= hidden_field_tag(:confirmation, 1) %> | |
| 9 | + <%= submit_button(:ok, _("Yes, I want to join.") % profile.name) %> | |
| 10 | + <%= button(:cancel, _("No, I don't want."), :action => 'index') %> | |
| 11 | +<% end %> | ... | ... |
| ... | ... | @@ -0,0 +1,10 @@ |
| 1 | +<div id='join-community-popup'> | |
| 2 | + <h3> <%= __('Do you want to join this community?') %> </h3> | |
| 3 | + | |
| 4 | + <% button_bar do %> | |
| 5 | + <%= button(:ok, _('Yes'), :controller => 'profile', :action => 'join', :profile => profile.identifier) %> | |
| 6 | + <%= button_to_function(:cancel, _('Not now'), "$('join-community-popup').hide()") %> | |
| 7 | + <%= button(:cancel, _('No and don\'t ask again'), :controller => 'profile', :action => 'refuse_join', :profile => profile.identifier) %> | |
| 8 | + <% end %> | |
| 9 | +</div> | |
| 10 | +<%= draggable_element('join-community-popup') %> | ... | ... |
| ... | ... | @@ -0,0 +1,12 @@ |
| 1 | +class AddRefuseJoinTable < ActiveRecord::Migration | |
| 2 | + def self.up | |
| 3 | + create_table :refused_join_community, :id => false do |t| | |
| 4 | + t.integer :person_id | |
| 5 | + t.integer :community_id | |
| 6 | + end | |
| 7 | + end | |
| 8 | + | |
| 9 | + def self.down | |
| 10 | + drop_table :refused_join_community | |
| 11 | + end | |
| 12 | +end | ... | ... |
db/schema.rb
| ... | ... | @@ -9,7 +9,7 @@ |
| 9 | 9 | # |
| 10 | 10 | # It's strongly recommended to check this file into your version control system. |
| 11 | 11 | |
| 12 | -ActiveRecord::Schema.define(:version => 59) do | |
| 12 | +ActiveRecord::Schema.define(:version => 60) do | |
| 13 | 13 | |
| 14 | 14 | create_table "article_versions", :force => true do |t| |
| 15 | 15 | t.integer "article_id" |
| ... | ... | @@ -237,6 +237,11 @@ ActiveRecord::Schema.define(:version => 59) do |
| 237 | 237 | |
| 238 | 238 | add_index "profiles", ["environment_id"], :name => "index_profiles_on_environment_id" |
| 239 | 239 | |
| 240 | + create_table "refused_join_community", :id => false, :force => true do |t| | |
| 241 | + t.integer "person_id" | |
| 242 | + t.integer "community_id" | |
| 243 | + end | |
| 244 | + | |
| 240 | 245 | create_table "region_validators", :id => false, :force => true do |t| |
| 241 | 246 | t.integer "region_id" |
| 242 | 247 | t.integer "organization_id" | ... | ... |
public/stylesheets/common.css
| ... | ... | @@ -419,6 +419,26 @@ div.pending-tasks { |
| 419 | 419 | margin: 1em; |
| 420 | 420 | } |
| 421 | 421 | |
| 422 | +/* join community popup */ | |
| 423 | +#join-community-popup { | |
| 424 | + z-index: 1000; | |
| 425 | + position: absolute; | |
| 426 | + width: 350px; | |
| 427 | + height: 180; | |
| 428 | + right: 50px; | |
| 429 | + top: 50px; | |
| 430 | + background: white; | |
| 431 | + border: 2px solid black; | |
| 432 | +} | |
| 433 | + | |
| 434 | +#join-community-popup { | |
| 435 | + text-align: center; | |
| 436 | + cursor: move; | |
| 437 | +} | |
| 438 | +#join-community-popup .button-bar { | |
| 439 | + margin: 1em; | |
| 440 | +} | |
| 441 | + | |
| 422 | 442 | #content #not-found, |
| 423 | 443 | #content #access-denied { |
| 424 | 444 | padding: 20px; | ... | ... |
test/functional/memberships_controller_test.rb
| ... | ... | @@ -27,32 +27,13 @@ class MembershipsControllerTest < Test::Unit::TestCase |
| 27 | 27 | def test_valid_xhtml |
| 28 | 28 | assert_valid_xhtml |
| 29 | 29 | end |
| 30 | - | |
| 30 | + | |
| 31 | 31 | should 'list current memberships' do |
| 32 | 32 | get :index, :profile => profile.identifier |
| 33 | 33 | |
| 34 | 34 | assert_kind_of Array, assigns(:memberships) |
| 35 | 35 | end |
| 36 | 36 | |
| 37 | - should 'present confirmation before joining a profile' do | |
| 38 | - community = Community.create!(:name => 'my test community') | |
| 39 | - get :join, :profile => profile.identifier, :id => community.id | |
| 40 | - | |
| 41 | - assert_response :success | |
| 42 | - assert_template 'join' | |
| 43 | - end | |
| 44 | - | |
| 45 | - should 'actually join profile' do | |
| 46 | - community = Community.create!(:name => 'my test community') | |
| 47 | - post :join, :profile => profile.identifier, :id => community.id, :confirmation => '1' | |
| 48 | - | |
| 49 | - assert_response :redirect | |
| 50 | - assert_redirected_to community.url | |
| 51 | - | |
| 52 | - profile = Profile.find(@profile.id) | |
| 53 | - assert profile.memberships.include?(community), 'profile should be actually added to the community' | |
| 54 | - end | |
| 55 | - | |
| 56 | 37 | should 'present new community form' do |
| 57 | 38 | get :new_community, :profile => profile.identifier |
| 58 | 39 | assert_response :success |
| ... | ... | @@ -143,13 +124,6 @@ class MembershipsControllerTest < Test::Unit::TestCase |
| 143 | 124 | assert_not_includes profile.memberships, community |
| 144 | 125 | end |
| 145 | 126 | |
| 146 | - should 'create task when join to closed organization' do | |
| 147 | - community = Community.create!(:name => 'my test community', :closed => true) | |
| 148 | - assert_difference AddMember, :count do | |
| 149 | - post :join, :profile => profile.identifier, :id => community.id, :confirmation => '1' | |
| 150 | - end | |
| 151 | - end | |
| 152 | - | |
| 153 | 127 | should 'current user is added as admin after create new community' do |
| 154 | 128 | post :new_community, :profile => profile.identifier, :community => { :name => 'My shiny new community', :description => 'This is a community devoted to anything interesting we find in the internet '} |
| 155 | 129 | assert_equal Profile::Roles.admin, profile.find_roles(Community.find_by_identifier('my-shiny-new-community')).first.role | ... | ... |
test/functional/profile_controller_test.rb
| ... | ... | @@ -67,7 +67,7 @@ class ProfileControllerTest < Test::Unit::TestCase |
| 67 | 67 | login_as(@profile.identifier) |
| 68 | 68 | community = Community.create!(:name => 'my test community') |
| 69 | 69 | get :index, :profile => community.identifier |
| 70 | - assert_tag :tag => 'a', :attributes => { :href => "/myprofile/#{@profile.identifier}/memberships/join/#{community.id}" } | |
| 70 | + assert_tag :tag => 'a', :attributes => { :href => "/profile/#{community.identifier}/join" } | |
| 71 | 71 | end |
| 72 | 72 | |
| 73 | 73 | should 'not show Join This Community button for member users' do |
| ... | ... | @@ -404,4 +404,57 @@ class ProfileControllerTest < Test::Unit::TestCase |
| 404 | 404 | assert_no_tag :tag => 'a', :attributes => { :href => "/contact/#{community.identifier}/new" } |
| 405 | 405 | end |
| 406 | 406 | |
| 407 | + should 'present confirmation before joining a profile' do | |
| 408 | + community = Community.create!(:name => 'my test community') | |
| 409 | + login_as @profile.identifier | |
| 410 | + get :join, :profile => community.identifier | |
| 411 | + | |
| 412 | + assert_response :success | |
| 413 | + assert_template 'join' | |
| 414 | + end | |
| 415 | + | |
| 416 | + should 'actually join profile' do | |
| 417 | + community = Community.create!(:name => 'my test community') | |
| 418 | + login_as @profile.identifier | |
| 419 | + post :join, :profile => community.identifier, :confirmation => '1' | |
| 420 | + | |
| 421 | + assert_response :redirect | |
| 422 | + assert_redirected_to community.url | |
| 423 | + | |
| 424 | + profile = Profile.find(@profile.id) | |
| 425 | + assert profile.memberships.include?(community), 'profile should be actually added to the community' | |
| 426 | + end | |
| 427 | + | |
| 428 | + should 'create task when join to closed organization' do | |
| 429 | + community = Community.create!(:name => 'my test community', :closed => true) | |
| 430 | + login_as @profile.identifier | |
| 431 | + assert_difference AddMember, :count do | |
| 432 | + post :join, :profile => community.identifier, :confirmation => '1' | |
| 433 | + end | |
| 434 | + end | |
| 435 | + | |
| 436 | + should 'require login to join community' do | |
| 437 | + community = Community.create!(:name => 'my test community', :closed => true) | |
| 438 | + get :join, :profile => community.identifier | |
| 439 | + | |
| 440 | + assert_redirected_to :controller => 'account', :action => 'login' | |
| 441 | + end | |
| 442 | + | |
| 443 | + should 'require login to refuse join community' do | |
| 444 | + community = Community.create!(:name => 'my test community', :closed => true) | |
| 445 | + get :refuse_join, :profile => community.identifier | |
| 446 | + | |
| 447 | + assert_redirected_to :controller => 'account', :action => 'login' | |
| 448 | + end | |
| 449 | + | |
| 450 | + should 'register join refusal' do | |
| 451 | + community = Community.create!(:name => 'my test community', :closed => true) | |
| 452 | + login_as @profile.identifier | |
| 453 | + | |
| 454 | + get :refuse_join, :profile => community.identifier | |
| 455 | + | |
| 456 | + p = Person.find(@profile.id) | |
| 457 | + assert_includes p.refused_communities, community | |
| 458 | + end | |
| 459 | + | |
| 407 | 460 | end | ... | ... |
test/unit/application_helper_test.rb
| ... | ... | @@ -332,6 +332,90 @@ class ApplicationHelperTest < Test::Unit::TestCase |
| 332 | 332 | assert_equal '<span>SIGNUP_FIELD</span>', optional_field(profile, 'field', 'SIGNUP_FIELD') |
| 333 | 333 | end |
| 334 | 334 | |
| 335 | + should 'not ask_to_join unless profile defined' do | |
| 336 | + e = Environment.default | |
| 337 | + e.stubs(:enabled?).with(:disable_join_community_popup).returns(false) | |
| 338 | + stubs(:environment).returns(e) | |
| 339 | + | |
| 340 | + stubs(:profile).returns(nil) | |
| 341 | + assert ! ask_to_join? | |
| 342 | + end | |
| 343 | + | |
| 344 | + should 'not ask_to_join unless profile is community' do | |
| 345 | + e = Environment.default | |
| 346 | + e.stubs(:enabled?).with(:disable_join_community_popup).returns(false) | |
| 347 | + stubs(:environment).returns(e) | |
| 348 | + | |
| 349 | + p = create_user('test_user').person | |
| 350 | + stubs(:profile).returns(p) | |
| 351 | + assert ! ask_to_join? | |
| 352 | + end | |
| 353 | + | |
| 354 | + should 'ask_to_join if its not logged and in a community' do | |
| 355 | + e = Environment.default | |
| 356 | + e.stubs(:enabled?).with(:disable_join_community_popup).returns(false) | |
| 357 | + stubs(:environment).returns(e) | |
| 358 | + | |
| 359 | + c = Community.create(:name => 'test_comm', :identifier => 'test_comm') | |
| 360 | + stubs(:profile).returns(c) | |
| 361 | + stubs(:logged_in?).returns(false) | |
| 362 | + assert ask_to_join? | |
| 363 | + end | |
| 364 | + | |
| 365 | + should 'ask_to_join if user say so' do | |
| 366 | + e = Environment.default | |
| 367 | + e.stubs(:enabled?).with(:disable_join_community_popup).returns(false) | |
| 368 | + stubs(:environment).returns(e) | |
| 369 | + | |
| 370 | + c = Community.create(:name => 'test_comm', :identifier => 'test_comm') | |
| 371 | + stubs(:profile).returns(c) | |
| 372 | + stubs(:logged_in?).returns(true) | |
| 373 | + p = create_user('test_user').person | |
| 374 | + p.stubs(:ask_to_join?).with(c).returns(true) | |
| 375 | + stubs(:user).returns(p) | |
| 376 | + | |
| 377 | + assert ask_to_join? | |
| 378 | + end | |
| 379 | + | |
| 380 | + should 'not ask_to_join if user say no' do | |
| 381 | + e = Environment.default | |
| 382 | + e.stubs(:enabled?).with(:disable_join_community_popup).returns(false) | |
| 383 | + stubs(:environment).returns(e) | |
| 384 | + c = Community.create(:name => 'test_comm', :identifier => 'test_comm') | |
| 385 | + stubs(:profile).returns(c) | |
| 386 | + stubs(:logged_in?).returns(true) | |
| 387 | + p = create_user('test_user').person | |
| 388 | + p.stubs(:ask_to_join?).with(c).returns(false) | |
| 389 | + stubs(:user).returns(p) | |
| 390 | + | |
| 391 | + assert !ask_to_join? | |
| 392 | + end | |
| 393 | + | |
| 394 | + should 'not ask_to_join if environment say no even if its not logged and in a community' do | |
| 395 | + e = Environment.default | |
| 396 | + e.stubs(:enabled?).with(:disable_join_community_popup).returns(true) | |
| 397 | + stubs(:environment).returns(e) | |
| 398 | + c = Community.create(:name => 'test_comm', :identifier => 'test_comm') | |
| 399 | + stubs(:profile).returns(c) | |
| 400 | + stubs(:logged_in?).returns(false) | |
| 401 | + assert !ask_to_join? | |
| 402 | + end | |
| 403 | + | |
| 404 | + should 'not ask_to_join if environment say no even if user say so' do | |
| 405 | + e = Environment.default | |
| 406 | + e.stubs(:enabled?).with(:disable_join_community_popup).returns(true) | |
| 407 | + stubs(:environment).returns(e) | |
| 408 | + c = Community.create(:name => 'test_comm', :identifier => 'test_comm') | |
| 409 | + stubs(:profile).returns(c) | |
| 410 | + stubs(:logged_in?).returns(true) | |
| 411 | + p = create_user('test_user').person | |
| 412 | + p.stubs(:ask_to_join?).with(c).returns(true) | |
| 413 | + stubs(:user).returns(p) | |
| 414 | + | |
| 415 | + assert !ask_to_join? | |
| 416 | + end | |
| 417 | + | |
| 418 | + | |
| 335 | 419 | protected |
| 336 | 420 | |
| 337 | 421 | def url_for(args = {}) | ... | ... |
test/unit/folder_test.rb
| ... | ... | @@ -47,7 +47,7 @@ class FolderTest < ActiveSupport::TestCase |
| 47 | 47 | end |
| 48 | 48 | |
| 49 | 49 | should 'can display hits' do |
| 50 | - profile = create_user('test_user').person | |
| 50 | + profile = create_user('testuser').person | |
| 51 | 51 | a = Folder.create!(:name => 'Test article', :profile => profile) |
| 52 | 52 | assert_equal false, a.can_display_hits? |
| 53 | 53 | end | ... | ... |
test/unit/person_test.rb
| ... | ... | @@ -495,4 +495,21 @@ class PersonTest < Test::Unit::TestCase |
| 495 | 495 | assert !p1.is_a_friend?(p2) |
| 496 | 496 | end |
| 497 | 497 | |
| 498 | + should 'refuse join community' do | |
| 499 | + p = create_user('test_user').person | |
| 500 | + c = Community.create!(:name => 'Test community', :identifier => 'test_community') | |
| 501 | + | |
| 502 | + assert p.ask_to_join?(c) | |
| 503 | + p.refuse_join(c) | |
| 504 | + assert !p.ask_to_join?(c) | |
| 505 | + end | |
| 506 | + | |
| 507 | + should 'not ask to join for a member' do | |
| 508 | + p = create_user('test_user').person | |
| 509 | + c = Community.create!(:name => 'Test community', :identifier => 'test_community') | |
| 510 | + c.add_member(p) | |
| 511 | + | |
| 512 | + assert !p.ask_to_join?(c) | |
| 513 | + end | |
| 514 | + | |
| 498 | 515 | end | ... | ... |