From 2e14e80a12f2b5f1bf051f29baed0fbe84ef9451 Mon Sep 17 00:00:00 2001 From: Michel Felipe Date: Thu, 5 Mar 2015 19:20:41 -0300 Subject: [PATCH] Created 'AddMemberJob' to enqueue added members action to execute in another moment. Added functional test for this feature --- app/controllers/public/invite_controller.rb | 40 ++++++++++++++++++++-------------------- app/models/invitation.rb | 19 +------------------ app/models/profile.rb | 26 ++++++++++++++++++++++++++ lib/add_members_job.rb | 11 +++++++++++ test/functional/invite_controller_test.rb | 28 ++++++++++++++++++++++++++++ 5 files changed, 86 insertions(+), 38 deletions(-) create mode 100644 lib/add_members_job.rb diff --git a/app/controllers/public/invite_controller.rb b/app/controllers/public/invite_controller.rb index f7e4fb6..77885eb 100644 --- a/app/controllers/public/invite_controller.rb +++ b/app/controllers/public/invite_controller.rb @@ -65,33 +65,33 @@ class InviteController < PublicController #Invite or add member without create a task #if logged user is admin of environment def invite_registered_friend - contacts_to_invite = params['q'].split(',') - if !contacts_to_invite.empty? && request.post? - if user.is_admin? - person = Person.find(user.id) - session[:invited_members] = [] + if !params['q'].present? || !request.post? - Invitation.invite(person, contacts_to_invite, '', profile) do |added_member| - session[:invited_members] << added_member.id - end + redirect_to :action => 'invite_friends' + session[:notice] = _('Please enter a valid profile.') - session[:notice] = _('This friends was added!') - else - Delayed::Job.enqueue InvitationJob.new(user.id, contacts_to_invite, '', profile.id, nil, locale) - session[:notice] = _('Your invitations are being sent.') - end + return + end + contacts_to_invite = params['q'].split(',') - if profile.person? - redirect_to :controller => 'profile', :action => 'friends' - else - redirect_to :controller => 'profile', :action => 'members' - end + if user.is_admin? && profile.community? + + Delayed::Job.enqueue AddMembersJob.new contacts_to_invite, profile.id, locale + + session[:notice] = _('This friends was added!') else - redirect_to :action => 'invite_friends' - session[:notice] = _('Please enter a valid profile.') + Delayed::Job.enqueue InvitationJob.new(user.id, contacts_to_invite, '', profile.id, nil, locale) + session[:notice] = _('Your invitations are being sent.') end + + if profile.person? + redirect_to :controller => 'profile', :action => 'friends' + else + redirect_to :controller => 'profile', :action => 'members' + end + end def search diff --git a/app/models/invitation.rb b/app/models/invitation.rb index 0a7d0f8..3b8b21e 100644 --- a/app/models/invitation.rb +++ b/app/models/invitation.rb @@ -47,7 +47,6 @@ class Invitation < Task end def self.invite(person, contacts_to_invite, message, profile) - contacts_to_invite.each do |contact_to_invite| next if contact_to_invite == _("Firstname Lastname ") @@ -80,23 +79,7 @@ class Invitation < Task if profile.person? InviteFriend.create(task_args) if user.nil? || !user.person.is_a_friend?(person) elsif profile.community? - - if person.is_admin? - unless user.person.is_member_of?(profile) - - profile.add_member(user.person) - - #Call after add member callback - yield user - - end - else - - InviteMember.create(task_args.merge(:community_id => profile.id)) if user.nil? || !user.person.is_member_of?(profile) - - #Call after create invite member task callback - yield user,task_args - end + InviteMember.create(task_args.merge(:community_id => profile.id)) if user.nil? || !user.person.is_member_of?(profile) else raise NotImplementedError, 'Don\'t know how to invite people to a %s' % profile.class.to_s end diff --git a/app/models/profile.rb b/app/models/profile.rb index e0c6516..db990e7 100644 --- a/app/models/profile.rb +++ b/app/models/profile.rb @@ -665,6 +665,32 @@ private :generate_url, :url_options end end + # Adds many people to profile by id's or email's + def add_members(people_ids) + + unless people_ids.nil? && people_ids.empty? + people = [] + + if people_ids.first =~ /\@/ + people = User.where(email: people_ids) + else + people = Person.where(id: people_ids) + end + + people.each do |profile| + person = profile + + if profile.is_a? User + person = profile.person + end + + unless person.is_member_of?(self) + add_member person + end + end + end + end + def remove_member(person) self.disaffiliate(person, Profile::Roles.all_roles(environment.id)) end diff --git a/lib/add_members_job.rb b/lib/add_members_job.rb new file mode 100644 index 0000000..a6bb20e --- /dev/null +++ b/lib/add_members_job.rb @@ -0,0 +1,11 @@ +class AddMembersJob < Struct.new(:people_ids, :profile_id, :locale) + + def perform + Noosfero.with_locale(locale) do + + profile = Profile.find(profile_id) + profile.add_members people_ids + + end + end +end diff --git a/test/functional/invite_controller_test.rb b/test/functional/invite_controller_test.rb index 05bd95c..83a002f 100644 --- a/test/functional/invite_controller_test.rb +++ b/test/functional/invite_controller_test.rb @@ -284,6 +284,11 @@ class InviteControllerTest < ActionController::TestCase assert_empty json_response end + #@todo Copy this test and create a another version + #of this, for test add members in a community + #logged as admin of environment! + # #issue227 + # should 'invite registered users through profile id' do friend1 = create_user('testuser1').person friend2 = create_user('testuser2').person @@ -297,6 +302,29 @@ class InviteControllerTest < ActionController::TestCase end end + should 'add registered users imediatly instead invite if logged user is a environment admin' do + + #Add user like a environment admin + Environment.default.add_admin profile + + friend1 = create_user('testuser1').person + friend2 = create_user('testuser2').person + + assert_difference 'Delayed::Job.count', 1 do + assert_equal 0,community.members.count + + post :invite_registered_friend, :profile => @community.identifier, :q => [friend1.id,friend2.id] + + assert_response :redirect + assert_redirected_to :controller => 'profile', :action => 'members' + end + + Delayed::Worker.new.run(Delayed::Job.last) + + assert_equal 2,community.members.count + + end + private def json_response -- libgit2 0.21.2