diff --git a/app/models/environment_mailing.rb b/app/models/environment_mailing.rb index 2da0dc0..cf4502a 100644 --- a/app/models/environment_mailing.rb +++ b/app/models/environment_mailing.rb @@ -1,16 +1,17 @@ class EnvironmentMailing < Mailing - def recipient(offset=0) - source.people.first(:order => :id, :offset => offset) + def recipients(offset=0, limit=100) + source.people.all(:order => :id, :offset => offset, :limit => limit, :joins => "LEFT OUTER JOIN mailing_sents m ON (m.mailing_id = #{id} AND m.person_id = profiles.id)", :order => :id, :conditions => { "m.person_id" => nil }) end def each_recipient offset = 0 - while person = recipient(offset) - unless self.already_sent_mailing_to?(person) - yield person + limit = 100 + while !(people = recipients(offset, limit)).empty? + people.each do |person| + yield person end - offset = offset + 1 + offset = offset + limit end end diff --git a/app/models/mailing.rb b/app/models/mailing.rb index 81b848b..29ea1bd 100644 --- a/app/models/mailing.rb +++ b/app/models/mailing.rb @@ -28,13 +28,7 @@ class Mailing < ActiveRecord::Base '' end - def already_sent_mailing_to?(recipient) - self.mailing_sents.find_by_person_id(recipient.id) - end - def deliver - offset = 0 - people = [] each_recipient do |recipient| Mailing::Sender.deliver_mail(self, recipient.email) self.mailing_sents.create(:person => recipient) diff --git a/app/models/organization_mailing.rb b/app/models/organization_mailing.rb index d4289e8..eafed6d 100644 --- a/app/models/organization_mailing.rb +++ b/app/models/organization_mailing.rb @@ -4,17 +4,18 @@ class OrganizationMailing < Mailing "#{person.name} <#{source.environment.contact_email}>" end - def recipient(offset=0) - source.members.first(:order => :id, :offset => offset) + def recipients(offset=0, limit=100) + source.members.all(:order => :id, :offset => offset, :limit => limit, :joins => "LEFT OUTER JOIN mailing_sents m ON (m.mailing_id = #{id} AND m.person_id = profiles.id)", :order => :id, :conditions => { "m.person_id" => nil }) end def each_recipient offset = 0 - while person = recipient(offset) - unless self.already_sent_mailing_to?(person) - yield person + limit = 50 + while !(people = recipients(offset, limit)).empty? + people.each do |person| + yield person end - offset = offset + 1 + offset = offset + limit end end diff --git a/test/unit/environment_mailing_test.rb b/test/unit/environment_mailing_test.rb index 2469025..488f7bc 100644 --- a/test/unit/environment_mailing_test.rb +++ b/test/unit/environment_mailing_test.rb @@ -7,10 +7,10 @@ class EnvironmentMailingTest < ActiveSupport::TestCase ActionMailer::Base.perform_deliveries = true ActionMailer::Base.deliveries = [] @environment = fast_create(Environment, :name => 'Network') - create_user('user_one', :environment_id => @environment.id) - create_user('user_two', :environment_id => @environment.id) + @person_1 = create_user('user_one', :environment_id => @environment.id).person + @person_2 = create_user('user_two', :environment_id => @environment.id).person end - attr_reader :environment + attr_reader :environment, :person_1, :person_2 should 'require source_id' do @@ -45,53 +45,53 @@ class EnvironmentMailingTest < ActiveSupport::TestCase end should 'display name and email on generate_from' do - person = Person['user_one'] - mailing = EnvironmentMailing.new(:source => environment, :person => person) + mailing = EnvironmentMailing.new(:source => environment, :person => person_1) assert_equal "#{environment.name} <#{environment.contact_email}>", mailing.generate_from end should 'deliver mailing to each recipient after create' do - person = Person['user_one'] - mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :person => person) + mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :person => person_1) process_delayed_job_queue assert_equal 2, ActionMailer::Base.deliveries.count end should 'create mailing sent to each recipient after delivering mailing' do - person = Person['user_one'] - mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :person => person) + mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :person => person_1) assert_difference MailingSent, :count, 2 do process_delayed_job_queue end end should 'change locale according to the mailing locale' do - person = Person['user_one'] - mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :locale => 'pt', :person => person) + mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :locale => 'pt', :person => person_1) Noosfero.expects(:with_locale).with('pt') process_delayed_job_queue end - should 'return recipient' do - mailing = EnvironmentMailing.new(:source => environment) - assert_equal Person['user_one'], mailing.recipient + should 'return recipients' do + mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :locale => 'pt', :person => person_1) + assert_equal [person_1, person_2], mailing.recipients + end + + should 'return recipients according to limit' do + mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :locale => 'pt', :person => person_1) + assert_equal [person_1], mailing.recipients(0, 1) end should 'return true if already sent mailing to a recipient' do - person = Person['user_one'] - mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :person => person) + mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :person => person_1) process_delayed_job_queue - assert mailing.already_sent_mailing_to?(person) + assert mailing.mailing_sents.find_by_person_id(person_1.id) end should 'return false if did not sent mailing to a recipient' do recipient = fast_create(Person) person = Person['user_one'] - mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :person => person) + mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :person => person_1) process_delayed_job_queue - assert !mailing.already_sent_mailing_to?(recipient) + assert !mailing.mailing_sents.find_by_person_id(recipient.id) end end diff --git a/test/unit/organization_mailing_test.rb b/test/unit/organization_mailing_test.rb index 6823f09..a9e007f 100644 --- a/test/unit/organization_mailing_test.rb +++ b/test/unit/organization_mailing_test.rb @@ -87,15 +87,20 @@ class OrganizationMailingTest < ActiveSupport::TestCase end should 'return recipient' do - mailing = OrganizationMailing.new(:source => community) - assert_equal Person['user_one'], mailing.recipient + mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) + assert_equal [Person['user_one'], Person['user_two']], mailing.recipients + end + + should 'return recipients according to limit' do + mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) + assert_equal [Person['user_one']], mailing.recipients(0, 1) end should 'return true if already sent mailing to a recipient' do member = Person['user_one'] mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) process_delayed_job_queue - assert mailing.already_sent_mailing_to?(member) + assert mailing.mailing_sents.find_by_person_id(member.id) end should 'return false if did not sent mailing to a recipient' do @@ -103,7 +108,7 @@ class OrganizationMailingTest < ActiveSupport::TestCase mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) process_delayed_job_queue - assert !mailing.already_sent_mailing_to?(recipient) + assert !mailing.mailing_sents.find_by_person_id(recipient.id) end protected -- libgit2 0.21.2