Commit 6e10728cbf0394dfdab909beb8f9cba71a8bf7c9
Exists in
master
and in
29 other branches
Merge branch 'stable'
Conflicts: app/views/themes/index.rhtml db/schema.rb plugins/shopping_cart/views/shopping_cart_plugin_myprofile/edit.html.erb test/unit/person_test.rb
Showing
75 changed files
with
665 additions
and
233 deletions
Show diff stats
app/helpers/comment_helper.rb
@@ -2,7 +2,6 @@ module CommentHelper | @@ -2,7 +2,6 @@ module CommentHelper | ||
2 | 2 | ||
3 | def article_title(article, args = {}) | 3 | def article_title(article, args = {}) |
4 | title = article.title | 4 | title = article.title |
5 | - title = article.display_title if article.kind_of?(UploadedFile) && article.image? | ||
6 | title = content_tag('h1', h(title), :class => 'title') | 5 | title = content_tag('h1', h(title), :class => 'title') |
7 | if article.belongs_to_blog? | 6 | if article.belongs_to_blog? |
8 | unless args[:no_link] | 7 | unless args[:no_link] |
app/helpers/content_viewer_helper.rb
@@ -14,8 +14,7 @@ module ContentViewerHelper | @@ -14,8 +14,7 @@ module ContentViewerHelper | ||
14 | end | 14 | end |
15 | 15 | ||
16 | def article_title(article, args = {}) | 16 | def article_title(article, args = {}) |
17 | - title = article.display_title if article.kind_of?(UploadedFile) && article.image? | ||
18 | - title = article.title if title.blank? | 17 | + title = article.title |
19 | title = content_tag('h1', h(title), :class => 'title') | 18 | title = content_tag('h1', h(title), :class => 'title') |
20 | if article.belongs_to_blog? || article.belongs_to_forum? | 19 | if article.belongs_to_blog? || article.belongs_to_forum? |
21 | unless args[:no_link] | 20 | unless args[:no_link] |
app/models/comment.rb
@@ -172,7 +172,7 @@ class Comment < ActiveRecord::Base | @@ -172,7 +172,7 @@ class Comment < ActiveRecord::Base | ||
172 | def mail(comment) | 172 | def mail(comment) |
173 | profile = comment.article.profile | 173 | profile = comment.article.profile |
174 | recipients comment.notification_emails | 174 | recipients comment.notification_emails |
175 | - from "#{profile.environment.name} <#{profile.environment.contact_email}>" | 175 | + from "#{profile.environment.name} <#{profile.environment.noreply_email}>" |
176 | subject _("[%s] you got a new comment!") % [profile.environment.name] | 176 | subject _("[%s] you got a new comment!") % [profile.environment.name] |
177 | body :recipient => profile.nickname || profile.name, | 177 | body :recipient => profile.nickname || profile.name, |
178 | :sender => comment.author_name, | 178 | :sender => comment.author_name, |
@@ -187,7 +187,7 @@ class Comment < ActiveRecord::Base | @@ -187,7 +187,7 @@ class Comment < ActiveRecord::Base | ||
187 | def mail_to_followers(comment, emails) | 187 | def mail_to_followers(comment, emails) |
188 | profile = comment.article.profile | 188 | profile = comment.article.profile |
189 | bcc emails | 189 | bcc emails |
190 | - from "#{profile.environment.name} <#{profile.environment.contact_email}>" | 190 | + from "#{profile.environment.name} <#{profile.environment.noreply_email}>" |
191 | subject _("[%s] %s commented on a content of %s") % [profile.environment.name, comment.author_name, profile.short_name] | 191 | subject _("[%s] %s commented on a content of %s") % [profile.environment.name, comment.author_name, profile.short_name] |
192 | body :recipient => profile.nickname || profile.name, | 192 | body :recipient => profile.nickname || profile.name, |
193 | :sender => comment.author_name, | 193 | :sender => comment.author_name, |
app/models/contact.rb
@@ -26,7 +26,7 @@ class Contact < ActiveRecord::Base #WithoutTable | @@ -26,7 +26,7 @@ class Contact < ActiveRecord::Base #WithoutTable | ||
26 | content_type 'text/html' | 26 | content_type 'text/html' |
27 | emails = contact.dest.notification_emails | 27 | emails = contact.dest.notification_emails |
28 | recipients emails | 28 | recipients emails |
29 | - from "#{contact.name} <#{contact.dest.environment.contact_email}>" | 29 | + from "#{contact.name} <#{contact.dest.environment.noreply_email}>" |
30 | reply_to contact.email | 30 | reply_to contact.email |
31 | if contact.sender | 31 | if contact.sender |
32 | headers 'X-Noosfero-Sender' => contact.sender.identifier | 32 | headers 'X-Noosfero-Sender' => contact.sender.identifier |
app/models/environment.rb
@@ -606,7 +606,7 @@ class Environment < ActiveRecord::Base | @@ -606,7 +606,7 @@ class Environment < ActiveRecord::Base | ||
606 | # only one environment can be the default one | 606 | # only one environment can be the default one |
607 | validates_uniqueness_of :is_default, :if => (lambda do |environment| environment.is_default? end), :message => N_('Only one Virtual Community can be the default one') | 607 | validates_uniqueness_of :is_default, :if => (lambda do |environment| environment.is_default? end), :message => N_('Only one Virtual Community can be the default one') |
608 | 608 | ||
609 | - validates_format_of :contact_email, :with => Noosfero::Constants::EMAIL_FORMAT, :if => (lambda { |record| ! record.contact_email.blank? }) | 609 | + validates_format_of :contact_email, :noreply_email, :with => Noosfero::Constants::EMAIL_FORMAT, :allow_blank => true |
610 | 610 | ||
611 | xss_terminate :only => [ :message_for_disabled_enterprise ], :with => 'white_list', :on => 'validation' | 611 | xss_terminate :only => [ :message_for_disabled_enterprise ], :with => 'white_list', :on => 'validation' |
612 | 612 | ||
@@ -793,7 +793,7 @@ class Environment < ActiveRecord::Base | @@ -793,7 +793,7 @@ class Environment < ActiveRecord::Base | ||
793 | end | 793 | end |
794 | 794 | ||
795 | def notification_emails | 795 | def notification_emails |
796 | - [contact_email.blank? ? nil : contact_email].compact + admins.map(&:email) | 796 | + [noreply_email.blank? ? nil : noreply_email].compact + admins.map(&:email) |
797 | end | 797 | end |
798 | 798 | ||
799 | after_create :create_templates | 799 | after_create :create_templates |
app/models/friendship.rb
1 | class Friendship < ActiveRecord::Base | 1 | class Friendship < ActiveRecord::Base |
2 | track_actions :new_friendship, :after_create, :keep_params => ["friend.name", "friend.url", "friend.profile_custom_icon"], :custom_user => :person | 2 | track_actions :new_friendship, :after_create, :keep_params => ["friend.name", "friend.url", "friend.profile_custom_icon"], :custom_user => :person |
3 | - | 3 | + |
4 | + extend CacheCounterHelper | ||
5 | + | ||
4 | belongs_to :person, :foreign_key => :person_id | 6 | belongs_to :person, :foreign_key => :person_id |
5 | belongs_to :friend, :class_name => 'Person', :foreign_key => 'friend_id' | 7 | belongs_to :friend, :class_name => 'Person', :foreign_key => 'friend_id' |
8 | + | ||
9 | + after_create do |friendship| | ||
10 | + update_cache_counter(:friends_count, friendship.person, 1) | ||
11 | + update_cache_counter(:friends_count, friendship.friend, 1) | ||
12 | + end | ||
13 | + | ||
14 | + after_destroy do |friendship| | ||
15 | + update_cache_counter(:friends_count, friendship.person, -1) | ||
16 | + update_cache_counter(:friends_count, friendship.friend, -1) | ||
17 | + end | ||
6 | end | 18 | end |
app/models/layout_template.rb
@@ -16,15 +16,15 @@ class LayoutTemplate | @@ -16,15 +16,15 @@ class LayoutTemplate | ||
16 | end | 16 | end |
17 | 17 | ||
18 | def name | 18 | def name |
19 | - @config['name'] | 19 | + _ @config['name'] |
20 | end | 20 | end |
21 | 21 | ||
22 | def title | 22 | def title |
23 | - @config['title'] | 23 | + _ @config['title'] |
24 | end | 24 | end |
25 | 25 | ||
26 | def description | 26 | def description |
27 | - @config['description'] | 27 | + _ @config['description'] |
28 | end | 28 | end |
29 | 29 | ||
30 | def number_of_boxes | 30 | def number_of_boxes |
app/models/mailing.rb
@@ -17,7 +17,7 @@ class Mailing < ActiveRecord::Base | @@ -17,7 +17,7 @@ class Mailing < ActiveRecord::Base | ||
17 | end | 17 | end |
18 | 18 | ||
19 | def generate_from | 19 | def generate_from |
20 | - "#{source.name} <#{source.contact_email}>" | 20 | + "#{source.name} <#{if source.is_a? Environment then source.noreply_email else source.contact_email end}>" |
21 | end | 21 | end |
22 | 22 | ||
23 | def generate_subject | 23 | def generate_subject |
app/models/organization.rb
@@ -26,18 +26,7 @@ class Organization < Profile | @@ -26,18 +26,7 @@ class Organization < Profile | ||
26 | 26 | ||
27 | has_many :mailings, :class_name => 'OrganizationMailing', :foreign_key => :source_id, :as => 'source' | 27 | has_many :mailings, :class_name => 'OrganizationMailing', :foreign_key => :source_id, :as => 'source' |
28 | 28 | ||
29 | - named_scope :more_popular, | ||
30 | - :select => "#{Profile.qualified_column_names}, count(resource_id) as total", | ||
31 | - :group => Profile.qualified_column_names, | ||
32 | - :joins => "LEFT OUTER JOIN role_assignments ON profiles.id = role_assignments.resource_id", | ||
33 | - :order => "total DESC" | ||
34 | - | ||
35 | - named_scope :more_active, | ||
36 | - :select => "#{Profile.qualified_column_names}, count(action_tracker.id) as total", | ||
37 | - :joins => "LEFT OUTER JOIN action_tracker ON profiles.id = action_tracker.target_id", | ||
38 | - :group => Profile.qualified_column_names, | ||
39 | - :order => 'total DESC', | ||
40 | - :conditions => ['action_tracker.created_at >= ? OR action_tracker.id IS NULL', ActionTracker::Record::RECENT_DELAY.days.ago] | 29 | + named_scope :more_popular, :order => 'members_count DESC' |
41 | 30 | ||
42 | def validation_methodology | 31 | def validation_methodology |
43 | self.validation_info ? self.validation_info.validation_methodology : nil | 32 | self.validation_info ? self.validation_info.validation_methodology : nil |
app/models/organization_mailing.rb
1 | class OrganizationMailing < Mailing | 1 | class OrganizationMailing < Mailing |
2 | 2 | ||
3 | def generate_from | 3 | def generate_from |
4 | - "#{person.name} <#{source.environment.contact_email}>" | 4 | + "#{person.name} <#{source.environment.noreply_email}>" |
5 | end | 5 | end |
6 | 6 | ||
7 | def recipients(offset=0, limit=100) | 7 | def recipients(offset=0, limit=100) |
app/models/pending_task_notifier.rb
@@ -2,7 +2,7 @@ class PendingTaskNotifier < ActionMailer::Base | @@ -2,7 +2,7 @@ class PendingTaskNotifier < ActionMailer::Base | ||
2 | 2 | ||
3 | def notification(person) | 3 | def notification(person) |
4 | recipients person.email | 4 | recipients person.email |
5 | - from "#{person.environment.name} <#{person.environment.contact_email}>" | 5 | + from "#{person.environment.name} <#{person.environment.noreply_email}>" |
6 | subject _("[%s] Pending tasks") % person.environment.name | 6 | subject _("[%s] Pending tasks") % person.environment.name |
7 | body :person => person, | 7 | body :person => person, |
8 | :tasks => person.tasks.pending, | 8 | :tasks => person.tasks.pending, |
app/models/person.rb
@@ -71,18 +71,7 @@ class Person < Profile | @@ -71,18 +71,7 @@ class Person < Profile | ||
71 | has_and_belongs_to_many :acepted_forums, :class_name => 'Forum', :join_table => 'terms_forum_people' | 71 | has_and_belongs_to_many :acepted_forums, :class_name => 'Forum', :join_table => 'terms_forum_people' |
72 | has_and_belongs_to_many :articles_with_access, :class_name => 'Article', :join_table => 'article_privacy_exceptions' | 72 | has_and_belongs_to_many :articles_with_access, :class_name => 'Article', :join_table => 'article_privacy_exceptions' |
73 | 73 | ||
74 | - named_scope :more_popular, | ||
75 | - :select => "#{Profile.qualified_column_names}, count(friend_id) as total", | ||
76 | - :group => Profile.qualified_column_names, | ||
77 | - :joins => "LEFT OUTER JOIN friendships on profiles.id = friendships.person_id", | ||
78 | - :order => "total DESC" | ||
79 | - | ||
80 | - named_scope :more_active, | ||
81 | - :select => "#{Profile.qualified_column_names}, count(action_tracker.id) as total", | ||
82 | - :joins => "LEFT OUTER JOIN action_tracker ON profiles.id = action_tracker.user_id", | ||
83 | - :group => Profile.qualified_column_names, | ||
84 | - :order => 'total DESC', | ||
85 | - :conditions => ['action_tracker.created_at >= ? OR action_tracker.id IS NULL', ActionTracker::Record::RECENT_DELAY.days.ago] | 74 | + named_scope :more_popular, :order => 'friends_count DESC' |
86 | 75 | ||
87 | named_scope :abusers, :joins => :abuse_complaints, :conditions => ['tasks.status = 3'], :select => 'DISTINCT profiles.*' | 76 | named_scope :abusers, :joins => :abuse_complaints, :conditions => ['tasks.status = 3'], :select => 'DISTINCT profiles.*' |
88 | named_scope :non_abusers, :joins => "LEFT JOIN tasks ON profiles.id = tasks.requestor_id AND tasks.type='AbuseComplaint'", :conditions => ["tasks.status != 3 OR tasks.id is NULL"], :select => "DISTINCT profiles.*" | 77 | named_scope :non_abusers, :joins => "LEFT JOIN tasks ON profiles.id = tasks.requestor_id AND tasks.type='AbuseComplaint'", :conditions => ["tasks.status != 3 OR tasks.id is NULL"], :select => "DISTINCT profiles.*" |
app/models/profile.rb
@@ -92,10 +92,6 @@ class Profile < ActiveRecord::Base | @@ -92,10 +92,6 @@ class Profile < ActiveRecord::Base | ||
92 | members.order(:name) | 92 | members.order(:name) |
93 | end | 93 | end |
94 | 94 | ||
95 | - def members_count | ||
96 | - members.count | ||
97 | - end | ||
98 | - | ||
99 | class << self | 95 | class << self |
100 | def count_with_distinct(*args) | 96 | def count_with_distinct(*args) |
101 | options = args.last || {} | 97 | options = args.last || {} |
@@ -118,10 +114,11 @@ class Profile < ActiveRecord::Base | @@ -118,10 +114,11 @@ class Profile < ActiveRecord::Base | ||
118 | 114 | ||
119 | named_scope :visible, :conditions => { :visible => true } | 115 | named_scope :visible, :conditions => { :visible => true } |
120 | named_scope :public, :conditions => { :visible => true, :public_profile => true } | 116 | named_scope :public, :conditions => { :visible => true, :public_profile => true } |
121 | - # Subclasses must override these methods | 117 | + |
118 | + # Subclasses must override this method | ||
122 | named_scope :more_popular | 119 | named_scope :more_popular |
123 | - named_scope :more_active | ||
124 | 120 | ||
121 | + named_scope :more_active, :order => 'activities_count DESC' | ||
125 | named_scope :more_recent, :order => "created_at DESC" | 122 | named_scope :more_recent, :order => "created_at DESC" |
126 | 123 | ||
127 | acts_as_trackable :dependent => :destroy | 124 | acts_as_trackable :dependent => :destroy |
@@ -616,10 +613,10 @@ private :generate_url, :url_options | @@ -616,10 +613,10 @@ private :generate_url, :url_options | ||
616 | # Adds a person as member of this Profile. | 613 | # Adds a person as member of this Profile. |
617 | def add_member(person) | 614 | def add_member(person) |
618 | if self.has_members? | 615 | if self.has_members? |
619 | - if self.closed? && members_count > 0 | 616 | + if self.closed? && members.count > 0 |
620 | AddMember.create!(:person => person, :organization => self) unless self.already_request_membership?(person) | 617 | AddMember.create!(:person => person, :organization => self) unless self.already_request_membership?(person) |
621 | else | 618 | else |
622 | - self.affiliate(person, Profile::Roles.admin(environment.id)) if members_count == 0 | 619 | + self.affiliate(person, Profile::Roles.admin(environment.id)) if members.count == 0 |
623 | self.affiliate(person, Profile::Roles.member(environment.id)) | 620 | self.affiliate(person, Profile::Roles.member(environment.id)) |
624 | end | 621 | end |
625 | else | 622 | else |
app/models/scrap.rb
@@ -14,7 +14,7 @@ class Scrap < ActiveRecord::Base | @@ -14,7 +14,7 @@ class Scrap < ActiveRecord::Base | ||
14 | 14 | ||
15 | named_scope :not_replies, :conditions => {:scrap_id => nil} | 15 | named_scope :not_replies, :conditions => {:scrap_id => nil} |
16 | 16 | ||
17 | - track_actions :leave_scrap, :after_create, :keep_params => ['sender.name', 'content', 'receiver.name', 'receiver.url'], :if => Proc.new{|s| s.sender != s.receiver && s.sender != s.top_root.receiver}, :custom_target => :action_tracker_target | 17 | + track_actions :leave_scrap, :after_create, :keep_params => ['sender.name', 'content', 'receiver.name', 'receiver.url'], :if => Proc.new{|s| s.sender != s.receiver && s.sender != s.top_root.receiver}, :custom_target => :action_tracker_target |
18 | 18 | ||
19 | track_actions :leave_scrap_to_self, :after_create, :keep_params => ['sender.name', 'content'], :if => Proc.new{|s| s.sender == s.receiver} | 19 | track_actions :leave_scrap_to_self, :after_create, :keep_params => ['sender.name', 'content'], :if => Proc.new{|s| s.sender == s.receiver} |
20 | 20 | ||
@@ -59,7 +59,7 @@ class Scrap < ActiveRecord::Base | @@ -59,7 +59,7 @@ class Scrap < ActiveRecord::Base | ||
59 | sender, receiver = scrap.sender, scrap.receiver | 59 | sender, receiver = scrap.sender, scrap.receiver |
60 | recipients receiver.email | 60 | recipients receiver.email |
61 | 61 | ||
62 | - from "#{sender.environment.name} <#{sender.environment.contact_email}>" | 62 | + from "#{sender.environment.name} <#{sender.environment.noreply_email}>" |
63 | subject _("[%s] You received a scrap!") % [sender.environment.name] | 63 | subject _("[%s] You received a scrap!") % [sender.environment.name] |
64 | body :recipient => receiver.name, | 64 | body :recipient => receiver.name, |
65 | :sender => sender.name, | 65 | :sender => sender.name, |
app/models/task_mailer.rb
@@ -60,7 +60,7 @@ class TaskMailer < ActionMailer::Base | @@ -60,7 +60,7 @@ class TaskMailer < ActionMailer::Base | ||
60 | end | 60 | end |
61 | 61 | ||
62 | def self.generate_from(task) | 62 | def self.generate_from(task) |
63 | - "#{task.environment.name} <#{task.environment.contact_email}>" | 63 | + "#{task.environment.name} <#{task.environment.noreply_email}>" |
64 | end | 64 | end |
65 | 65 | ||
66 | def generate_environment_url(task, url = {}) | 66 | def generate_environment_url(task, url = {}) |
app/models/theme.rb
@@ -42,17 +42,25 @@ class Theme | @@ -42,17 +42,25 @@ class Theme | ||
42 | end | 42 | end |
43 | 43 | ||
44 | def approved_themes(owner) | 44 | def approved_themes(owner) |
45 | - Dir.glob(File.join(system_themes_dir, '*')).select do |item| | ||
46 | - if File.exists?( File.join(item, 'theme.yml') ) | ||
47 | - config = YAML.load_file(File.join(item, 'theme.yml')) | ||
48 | - (config['owner_type'] == owner.class.base_class.name) && | ||
49 | - (config['owner_id'] == owner.id) || config['public'] | 45 | + Dir.glob(File.join(system_themes_dir, '*')).map do |item| |
46 | + next unless File.exists? File.join(item, 'theme.yml') | ||
47 | + id = File.basename item | ||
48 | + config = YAML.load_file File.join(item, 'theme.yml') | ||
49 | + | ||
50 | + approved = config['public'] | ||
51 | + unless approved | ||
52 | + begin | ||
53 | + approved = owner.kind_of?(config['owner_type'].constantize) | ||
54 | + rescue | ||
55 | + end | ||
56 | + approved &&= config['owner_id'] == owner.id if config['owner_id'].present? | ||
50 | end | 57 | end |
51 | - end.map do |desc| | ||
52 | - new(File.basename(desc)) | 58 | + |
59 | + [id, config] if approved | ||
60 | + end.compact.map do |id, config| | ||
61 | + new id, config | ||
53 | end | 62 | end |
54 | end | 63 | end |
55 | - | ||
56 | end | 64 | end |
57 | 65 | ||
58 | class DuplicatedIdentifier < Exception; end | 66 | class DuplicatedIdentifier < Exception; end |
app/models/uploaded_file.rb
@@ -12,15 +12,12 @@ class UploadedFile < Article | @@ -12,15 +12,12 @@ class UploadedFile < Article | ||
12 | 12 | ||
13 | include ShortFilename | 13 | include ShortFilename |
14 | 14 | ||
15 | - settings_items :title, :type => 'string' | ||
16 | - xss_terminate :only => [ :title ] | ||
17 | - | ||
18 | - def title_with_default | ||
19 | - title_without_default || short_filename(name, 60) | 15 | + def title |
16 | + if self.name.present? then self.name else self.filename end | ||
17 | + end | ||
18 | + def title= value | ||
19 | + self.name = value | ||
20 | end | 20 | end |
21 | - alias_method_chain :title, :default | ||
22 | - | ||
23 | - validates_size_of :title, :maximum => 60, :if => (lambda { |file| !file.title.blank? }) | ||
24 | 21 | ||
25 | sanitize_filename | 22 | sanitize_filename |
26 | 23 | ||
@@ -32,10 +29,6 @@ class UploadedFile < Article | @@ -32,10 +29,6 @@ class UploadedFile < Article | ||
32 | self.image? ? self.full_filename(:display).gsub(File.join(RAILS_ROOT, 'public'), '') : nil | 29 | self.image? ? self.full_filename(:display).gsub(File.join(RAILS_ROOT, 'public'), '') : nil |
33 | end | 30 | end |
34 | 31 | ||
35 | - def display_title | ||
36 | - title.blank? ? name : title | ||
37 | - end | ||
38 | - | ||
39 | def first_paragraph | 32 | def first_paragraph |
40 | '' | 33 | '' |
41 | end | 34 | end |
@@ -109,7 +102,7 @@ class UploadedFile < Article | @@ -109,7 +102,7 @@ class UploadedFile < Article | ||
109 | alias :orig_set_filename :filename= | 102 | alias :orig_set_filename :filename= |
110 | def filename=(value) | 103 | def filename=(value) |
111 | orig_set_filename(value) | 104 | orig_set_filename(value) |
112 | - self.name = self.filename | 105 | + self.name ||= self.filename |
113 | end | 106 | end |
114 | 107 | ||
115 | def download_headers | 108 | def download_headers |
app/models/user.rb
@@ -54,7 +54,7 @@ class User < ActiveRecord::Base | @@ -54,7 +54,7 @@ class User < ActiveRecord::Base | ||
54 | def activation_email_notify(user) | 54 | def activation_email_notify(user) |
55 | user_email = "#{user.login}@#{user.email_domain}" | 55 | user_email = "#{user.login}@#{user.email_domain}" |
56 | recipients user_email | 56 | recipients user_email |
57 | - from "#{user.environment.name} <#{user.environment.contact_email}>" | 57 | + from "#{user.environment.name} <#{user.environment.noreply_email}>" |
58 | subject _("[%{environment}] Welcome to %{environment} mail!") % { :environment => user.environment.name } | 58 | subject _("[%{environment}] Welcome to %{environment} mail!") % { :environment => user.environment.name } |
59 | body :name => user.name, | 59 | body :name => user.name, |
60 | :email => user_email, | 60 | :email => user_email, |
@@ -66,7 +66,7 @@ class User < ActiveRecord::Base | @@ -66,7 +66,7 @@ class User < ActiveRecord::Base | ||
66 | def activation_code(user) | 66 | def activation_code(user) |
67 | recipients user.email | 67 | recipients user.email |
68 | 68 | ||
69 | - from "#{user.environment.name} <#{user.environment.contact_email}>" | 69 | + from "#{user.environment.name} <#{user.environment.noreply_email}>" |
70 | subject _("[%s] Activate your account") % [user.environment.name] | 70 | subject _("[%s] Activate your account") % [user.environment.name] |
71 | body :recipient => user.name, | 71 | body :recipient => user.name, |
72 | :activation_code => user.activation_code, | 72 | :activation_code => user.activation_code, |
@@ -82,7 +82,7 @@ class User < ActiveRecord::Base | @@ -82,7 +82,7 @@ class User < ActiveRecord::Base | ||
82 | content_type 'text/html' | 82 | content_type 'text/html' |
83 | recipients user.email | 83 | recipients user.email |
84 | 84 | ||
85 | - from "#{user.environment.name} <#{user.environment.contact_email}>" | 85 | + from "#{user.environment.name} <#{user.environment.noreply_email}>" |
86 | subject email_subject.blank? ? _("Welcome to environment %s") % [user.environment.name] : email_subject | 86 | subject email_subject.blank? ? _("Welcome to environment %s") % [user.environment.name] : email_subject |
87 | body email_body | 87 | body email_body |
88 | end | 88 | end |
app/views/admin_panel/_site_info.rhtml
1 | <%= required labelled_form_field(_('Site name'), text_field(:environment, :name)) %> | 1 | <%= required labelled_form_field(_('Site name'), text_field(:environment, :name)) %> |
2 | <%= labelled_form_field(_('Contact email'), text_field(:environment, :contact_email)) %> | 2 | <%= labelled_form_field(_('Contact email'), text_field(:environment, :contact_email)) %> |
3 | +<%= labelled_form_field(_('No reply email'), text_field(:environment, :noreply_email)) %> | ||
3 | <% themes_options = Theme.system_themes.map {|theme| [theme.name, theme.id] }.sort %> | 4 | <% themes_options = Theme.system_themes.map {|theme| [theme.name, theme.id] }.sort %> |
4 | <%= labelled_form_field(_('Theme'), select(:environment, :theme, options_for_select(themes_options, environment.theme))) %> | 5 | <%= labelled_form_field(_('Theme'), select(:environment, :theme, options_for_select(themes_options, environment.theme))) %> |
5 | <%= required f.text_field(:reports_lower_bound, :size => 3) %> | 6 | <%= required f.text_field(:reports_lower_bound, :size => 3) %> |
app/views/blocks/profile_image.rhtml
1 | <div class="vcard"> | 1 | <div class="vcard"> |
2 | 2 | ||
3 | -<p><%= block.title %></p> | 3 | +<% if block.title.present? %> |
4 | + <p><%= block.title %></p> | ||
5 | +<% end %> | ||
4 | 6 | ||
5 | <div class="profile-big-image"> | 7 | <div class="profile-big-image"> |
6 | <div class="profile-big-image-inner1"> | 8 | <div class="profile-big-image-inner1"> |
app/views/themes/_select_template.rhtml
@@ -12,7 +12,7 @@ | @@ -12,7 +12,7 @@ | ||
12 | "/designs/templates/#{template.id}/thumbnail.png", | 12 | "/designs/templates/#{template.id}/thumbnail.png", |
13 | :alt => _('The "%s" template')) + | 13 | :alt => _('The "%s" template')) + |
14 | '<div class="opt-info">'.html_safe + | 14 | '<div class="opt-info">'.html_safe + |
15 | - content_tag('strong', template.name, :class => 'name') + | 15 | + content_tag('strong', template.name, :title => template.title, :class => 'name') + |
16 | ' <br/> '.html_safe | 16 | ' <br/> '.html_safe |
17 | 17 | ||
18 | if @current_template == template.id # selected | 18 | if @current_template == template.id # selected |
config/initializers/delayed_job_config.rb
1 | Delayed::Worker.backend = :active_record | 1 | Delayed::Worker.backend = :active_record |
2 | Delayed::Worker.max_attempts = 2 | 2 | Delayed::Worker.max_attempts = 2 |
3 | -Delayed::Worker.max_run_time = 10.minutes | 3 | + |
4 | +# TODO This is consuming ton of space on development with a postgres connection | ||
5 | +# error on the jobs. This must be verified before going into production. | ||
6 | +# Logging jobs backtraces | ||
7 | +#class Delayed::Worker | ||
8 | +# def handle_failed_job_with_loggin(job, error) | ||
9 | +# handle_failed_job_without_loggin(job,error) | ||
10 | +# Delayed::Worker.logger.error(error.message) | ||
11 | +# Delayed::Worker.logger.error(error.backtrace.join("\n")) | ||
12 | +# end | ||
13 | +# alias_method_chain :handle_failed_job, :loggin | ||
14 | +#end |
db/migrate/20140221142304_move_title_virtual_field_to_name_in_uploaded_file.rb
0 → 100644
@@ -0,0 +1,12 @@ | @@ -0,0 +1,12 @@ | ||
1 | +class MoveTitleVirtualFieldToNameInUploadedFile < ActiveRecord::Migration | ||
2 | + def self.up | ||
3 | + UploadedFile.find_each do |uploaded_file| | ||
4 | + uploaded_file.name = uploaded_file.setting.delete :title | ||
5 | + uploaded_file.send :update_without_callbacks | ||
6 | + end | ||
7 | + end | ||
8 | + | ||
9 | + def self.down | ||
10 | + say "this migration can't be reverted" | ||
11 | + end | ||
12 | +end |
db/migrate/20140303173209_move_contact_email_to_noreply_email_at_environment.rb
0 → 100644
@@ -0,0 +1,16 @@ | @@ -0,0 +1,16 @@ | ||
1 | +class MoveContactEmailToNoreplyEmailAtEnvironment < ActiveRecord::Migration | ||
2 | + def self.up | ||
3 | + add_column :environments, :noreply_email, :string | ||
4 | + Environment.reset_column_information | ||
5 | + | ||
6 | + Environment.find_each do |environment| | ||
7 | + environment.noreply_email = environment.contact_email | ||
8 | + environment.contact_email = nil | ||
9 | + environment.save! | ||
10 | + end | ||
11 | + end | ||
12 | + | ||
13 | + def self.down | ||
14 | + say "this migration can't be reverted" | ||
15 | + end | ||
16 | +end |
db/migrate/20140312132212_add_indexes_for_article_search.rb
0 → 100644
@@ -0,0 +1,13 @@ | @@ -0,0 +1,13 @@ | ||
1 | +class AddIndexesForArticleSearch < ActiveRecord::Migration | ||
2 | + def self.up | ||
3 | + add_index :articles, :created_at | ||
4 | + add_index :articles, :hits | ||
5 | + add_index :articles, :comments_count | ||
6 | + end | ||
7 | + | ||
8 | + def self.down | ||
9 | + remove_index :articles, :created_at | ||
10 | + remove_index :articles, :hits | ||
11 | + remove_index :articles, :comments_count | ||
12 | + end | ||
13 | +end |
db/migrate/20140312134218_add_indexes_for_profile_search.rb
0 → 100644
db/migrate/20140312141805_create_cache_counts_for_profiles.rb
0 → 100644
@@ -0,0 +1,19 @@ | @@ -0,0 +1,19 @@ | ||
1 | +class CreateCacheCountsForProfiles < ActiveRecord::Migration | ||
2 | + def self.up | ||
3 | + add_column :profiles, :friends_count, :integer, :null => false, :default => 0 | ||
4 | + add_column :profiles, :members_count, :integer, :null => false, :default => 0 | ||
5 | + add_column :profiles, :activities_count, :integer, :null => false, :default => 0 | ||
6 | + add_index :profiles, :friends_count | ||
7 | + add_index :profiles, :members_count | ||
8 | + add_index :profiles, :activities_count | ||
9 | + end | ||
10 | + | ||
11 | + def self.down | ||
12 | + remove_column :profiles, :friends_count | ||
13 | + remove_column :profiles, :members_count | ||
14 | + remove_column :profiles, :activities_count | ||
15 | + remove_index :profiles, :friends_count | ||
16 | + remove_index :profiles, :members_count | ||
17 | + remove_index :profiles, :activities_count | ||
18 | + end | ||
19 | +end |
db/migrate/20140312144156_define_initial_value_for_profiles_friends_count.rb
0 → 100644
@@ -0,0 +1,12 @@ | @@ -0,0 +1,12 @@ | ||
1 | +class DefineInitialValueForProfilesFriendsCount < ActiveRecord::Migration | ||
2 | + def self.up | ||
3 | + friends_counts = execute("SELECT profiles.id, count(profiles.id) FROM profiles INNER JOIN friendships ON ( profiles.id = friendships.friend_id AND profiles.type = E'Person') GROUP BY profiles.id;") | ||
4 | + friends_counts.each do |count| | ||
5 | + execute("UPDATE profiles SET friends_count=#{count['count'].to_i} WHERE profiles.id=#{count['id']};") | ||
6 | + end | ||
7 | + end | ||
8 | + | ||
9 | + def self.down | ||
10 | + execute("UPDATE profiles SET friends_count=0;") | ||
11 | + end | ||
12 | +end |
db/migrate/20140312151857_define_initial_value_for_profiles_activities_count.rb
0 → 100644
@@ -0,0 +1,14 @@ | @@ -0,0 +1,14 @@ | ||
1 | +class DefineInitialValueForProfilesActivitiesCount < ActiveRecord::Migration | ||
2 | + def self.up | ||
3 | + person_activities_counts = execute("SELECT profiles.id, count(action_tracker.id) as count FROM profiles LEFT OUTER JOIN action_tracker ON profiles.id = action_tracker.user_id WHERE (action_tracker.created_at >= '#{30.days.ago.to_s(:db)}') AND ( (profiles.type = 'Person' ) ) GROUP BY profiles.id;") | ||
4 | + organization_activities_counts = execute("SELECT profiles.id, count(action_tracker.id) as count FROM profiles LEFT OUTER JOIN action_tracker ON profiles.id = action_tracker.target_id WHERE (action_tracker.created_at >= '#{30.days.ago.to_s(:db)}') AND ( (profiles.type = 'Community' OR profiles.type = 'Enterprise' OR profiles.type = 'Organization' ) ) GROUP BY profiles.id;") | ||
5 | + activities_counts = person_activities_counts.entries + organization_activities_counts.entries | ||
6 | + activities_counts.each do |count| | ||
7 | + execute("UPDATE profiles SET activities_count=#{count['count'].to_i} WHERE profiles.id=#{count['id']};") | ||
8 | + end | ||
9 | + end | ||
10 | + | ||
11 | + def self.down | ||
12 | + execute("UPDATE profiles SET activities_count=0;") | ||
13 | + end | ||
14 | +end |
db/migrate/20140313213142_define_initial_value_for_profiles_members_count.rb
0 → 100644
@@ -0,0 +1,12 @@ | @@ -0,0 +1,12 @@ | ||
1 | +class DefineInitialValueForProfilesMembersCount < ActiveRecord::Migration | ||
2 | + def self.up | ||
3 | + members_counts = execute("SELECT profiles.id, count(profiles.id) FROM profiles LEFT OUTER JOIN role_assignments ON profiles.id = role_assignments.resource_id WHERE (profiles.type = 'Organization' OR profiles.type = 'Community' OR profiles.type = 'Enterprise') GROUP BY profiles.id;") | ||
4 | + members_counts.each do |count| | ||
5 | + execute("UPDATE profiles SET members_count=#{count['count'].to_i} WHERE profiles.id=#{count['id']};") | ||
6 | + end | ||
7 | + end | ||
8 | + | ||
9 | + def self.down | ||
10 | + execute("UPDATE profiles SET members_count=0;") | ||
11 | + end | ||
12 | +end |
db/migrate/20140314200103_add_indexes_for_products_search.rb
0 → 100644
db/schema.rb
@@ -9,7 +9,7 @@ | @@ -9,7 +9,7 @@ | ||
9 | # | 9 | # |
10 | # It's strongly recommended to check this file into your version control system. | 10 | # It's strongly recommended to check this file into your version control system. |
11 | 11 | ||
12 | -ActiveRecord::Schema.define(:version => 20140312184749) do | 12 | +ActiveRecord::Schema.define(:version => 20140314200103) do |
13 | 13 | ||
14 | create_table "abuse_reports", :force => true do |t| | 14 | create_table "abuse_reports", :force => true do |t| |
15 | t.integer "reporter_id" | 15 | t.integer "reporter_id" |
@@ -140,6 +140,9 @@ ActiveRecord::Schema.define(:version => 20140312184749) do | @@ -140,6 +140,9 @@ ActiveRecord::Schema.define(:version => 20140312184749) do | ||
140 | t.integer "position" | 140 | t.integer "position" |
141 | end | 141 | end |
142 | 142 | ||
143 | + add_index "articles", ["comments_count"], :name => "index_articles_on_comments_count" | ||
144 | + add_index "articles", ["created_at"], :name => "index_articles_on_created_at" | ||
145 | + add_index "articles", ["hits"], :name => "index_articles_on_hits" | ||
143 | add_index "articles", ["name"], :name => "index_articles_on_name" | 146 | add_index "articles", ["name"], :name => "index_articles_on_name" |
144 | add_index "articles", ["parent_id"], :name => "index_articles_on_parent_id" | 147 | add_index "articles", ["parent_id"], :name => "index_articles_on_parent_id" |
145 | add_index "articles", ["profile_id"], :name => "index_articles_on_profile_id" | 148 | add_index "articles", ["profile_id"], :name => "index_articles_on_profile_id" |
@@ -283,6 +286,7 @@ ActiveRecord::Schema.define(:version => 20140312184749) do | @@ -283,6 +286,7 @@ ActiveRecord::Schema.define(:version => 20140312184749) do | ||
283 | t.string "languages" | 286 | t.string "languages" |
284 | t.string "default_language" | 287 | t.string "default_language" |
285 | t.string "redirection_after_signup", :default => "keep_on_same_page" | 288 | t.string "redirection_after_signup", :default => "keep_on_same_page" |
289 | + t.string "noreply_email" | ||
286 | end | 290 | end |
287 | 291 | ||
288 | create_table "external_feeds", :force => true do |t| | 292 | create_table "external_feeds", :force => true do |t| |
@@ -433,6 +437,8 @@ ActiveRecord::Schema.define(:version => 20140312184749) do | @@ -433,6 +437,8 @@ ActiveRecord::Schema.define(:version => 20140312184749) do | ||
433 | t.boolean "archived", :default => false | 437 | t.boolean "archived", :default => false |
434 | end | 438 | end |
435 | 439 | ||
440 | + add_index "products", ["created_at"], :name => "index_products_on_created_at" | ||
441 | + add_index "products", ["enterprise_id"], :name => "index_products_on_enterprise_id" | ||
436 | add_index "products", ["product_category_id"], :name => "index_products_on_product_category_id" | 442 | add_index "products", ["product_category_id"], :name => "index_products_on_product_category_id" |
437 | add_index "products", ["profile_id"], :name => "index_products_on_profile_id" | 443 | add_index "products", ["profile_id"], :name => "index_products_on_profile_id" |
438 | 444 | ||
@@ -471,10 +477,17 @@ ActiveRecord::Schema.define(:version => 20140312184749) do | @@ -471,10 +477,17 @@ ActiveRecord::Schema.define(:version => 20140312184749) do | ||
471 | t.string "redirection_after_login" | 477 | t.string "redirection_after_login" |
472 | t.string "personal_website" | 478 | t.string "personal_website" |
473 | t.string "jabber_id" | 479 | t.string "jabber_id" |
480 | + t.integer "friends_count", :default => 0, :null => false | ||
481 | + t.integer "members_count", :default => 0, :null => false | ||
482 | + t.integer "activities_count", :default => 0, :null => false | ||
474 | end | 483 | end |
475 | 484 | ||
485 | + add_index "profiles", ["activities_count"], :name => "index_profiles_on_activities_count" | ||
486 | + add_index "profiles", ["created_at"], :name => "index_profiles_on_created_at" | ||
476 | add_index "profiles", ["environment_id"], :name => "index_profiles_on_environment_id" | 487 | add_index "profiles", ["environment_id"], :name => "index_profiles_on_environment_id" |
488 | + add_index "profiles", ["friends_count"], :name => "index_profiles_on_friends_count" | ||
477 | add_index "profiles", ["identifier"], :name => "index_profiles_on_identifier" | 489 | add_index "profiles", ["identifier"], :name => "index_profiles_on_identifier" |
490 | + add_index "profiles", ["members_count"], :name => "index_profiles_on_members_count" | ||
478 | add_index "profiles", ["region_id"], :name => "index_profiles_on_region_id" | 491 | add_index "profiles", ["region_id"], :name => "index_profiles_on_region_id" |
479 | 492 | ||
480 | create_table "qualifier_certifiers", :force => true do |t| | 493 | create_table "qualifier_certifiers", :force => true do |t| |
debian/changelog
@@ -0,0 +1,11 @@ | @@ -0,0 +1,11 @@ | ||
1 | +class ActivitiesCounterCacheJob | ||
2 | + def perform | ||
3 | + person_activities_counts = ActiveRecord::Base.connection.execute("SELECT profiles.id, count(action_tracker.id) as count FROM profiles LEFT OUTER JOIN action_tracker ON profiles.id = action_tracker.user_id WHERE (action_tracker.created_at >= '#{ActionTracker::Record::RECENT_DELAY.days.ago.to_s(:db)}') AND ( (profiles.type = 'Person' ) ) GROUP BY profiles.id;") | ||
4 | + organization_activities_counts = ActiveRecord::Base.connection.execute("SELECT profiles.id, count(action_tracker.id) as count FROM profiles LEFT OUTER JOIN action_tracker ON profiles.id = action_tracker.target_id WHERE (action_tracker.created_at >= '#{ActionTracker::Record::RECENT_DELAY.days.ago.to_s(:db)}') AND ( (profiles.type = 'Community' OR profiles.type = 'Enterprise' OR profiles.type = 'Organization' ) ) GROUP BY profiles.id;") | ||
5 | + activities_counts = person_activities_counts.entries + organization_activities_counts.entries | ||
6 | + activities_counts.each do |count| | ||
7 | + ActiveRecord::Base.connection.execute("UPDATE profiles SET activities_count=#{count['count'].to_i} WHERE profiles.id=#{count['id']};") | ||
8 | + end | ||
9 | + Delayed::Job.enqueue(ActivitiesCounterCacheJob.new, -3, 1.day.from_now) | ||
10 | + end | ||
11 | +end |
lib/feed_updater.rb
@@ -24,8 +24,8 @@ class FeedUpdater | @@ -24,8 +24,8 @@ class FeedUpdater | ||
24 | environment = Environment.default | 24 | environment = Environment.default |
25 | 25 | ||
26 | recipients NOOSFERO_CONF['exception_recipients'] | 26 | recipients NOOSFERO_CONF['exception_recipients'] |
27 | - from environment.contact_email | ||
28 | - reply_to environment.contact_email | 27 | + from environment.noreply_email |
28 | + reply_to environment.noreply_email | ||
29 | subject "[#{environment.name}] Feed-updater: #{error.message}" | 29 | subject "[#{environment.name}] Feed-updater: #{error.message}" |
30 | body render(:text => " | 30 | body render(:text => " |
31 | Container: | 31 | Container: |
lib/file_presenter.rb
@@ -13,6 +13,10 @@ class FilePresenter | @@ -13,6 +13,10 @@ class FilePresenter | ||
13 | klass.accepts?(f) ? klass.new(f) : f | 13 | klass.accepts?(f) ? klass.new(f) : f |
14 | end | 14 | end |
15 | 15 | ||
16 | + def self.base_class | ||
17 | + Article | ||
18 | + end | ||
19 | + | ||
16 | def initialize(f) | 20 | def initialize(f) |
17 | @file = f | 21 | @file = f |
18 | end | 22 | end |
@@ -31,6 +35,10 @@ class FilePresenter | @@ -31,6 +35,10 @@ class FilePresenter | ||
31 | self | 35 | self |
32 | end | 36 | end |
33 | 37 | ||
38 | + def kind_of?(klass) | ||
39 | + @file.kind_of?(klass) | ||
40 | + end | ||
41 | + | ||
34 | # This method must be overridden in subclasses. | 42 | # This method must be overridden in subclasses. |
35 | # | 43 | # |
36 | # If the class accepts the file, return a number that represents the | 44 | # If the class accepts the file, return a number that represents the |
@@ -43,7 +51,12 @@ class FilePresenter | @@ -43,7 +51,12 @@ class FilePresenter | ||
43 | end | 51 | end |
44 | 52 | ||
45 | def short_description | 53 | def short_description |
46 | - _("File (%s)") % content_type.sub(/^application\//, '').sub(/^x-/, '').sub(/^image\//, '') | 54 | + file_type = if content_type.present? |
55 | + content_type.sub(/^application\//, '').sub(/^x-/, '').sub(/^image\//, '') | ||
56 | + else | ||
57 | + _('Unknown') | ||
58 | + end | ||
59 | + _("File (%s)") % file_type | ||
47 | end | 60 | end |
48 | 61 | ||
49 | # Define the css classes to style the page fragment with the file related | 62 | # Define the css classes to style the page fragment with the file related |
lib/noosfero.rb
@@ -3,7 +3,7 @@ require 'fast_gettext' | @@ -3,7 +3,7 @@ require 'fast_gettext' | ||
3 | 3 | ||
4 | module Noosfero | 4 | module Noosfero |
5 | PROJECT = 'noosfero' | 5 | PROJECT = 'noosfero' |
6 | - VERSION = '0.46.1' | 6 | + VERSION = '0.46.2' |
7 | 7 | ||
8 | def self.pattern_for_controllers_in_directory(dir) | 8 | def self.pattern_for_controllers_in_directory(dir) |
9 | disjunction = controllers_in_directory(dir).join('|') | 9 | disjunction = controllers_in_directory(dir).join('|') |
@@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
1 | +Rails.configuration.to_prepare do | ||
2 | + ActionTracker::Record.module_eval do | ||
3 | + extend CacheCounterHelper | ||
4 | + | ||
5 | + after_create do |record| | ||
6 | + update_cache_counter(:activities_count, record.user, 1) | ||
7 | + if record.target.kind_of?(Organization) | ||
8 | + update_cache_counter(:activities_count, record.target, 1) | ||
9 | + end | ||
10 | + end | ||
11 | + | ||
12 | + after_destroy do |record| | ||
13 | + if record.created_at >= ActionTracker::Record::RECENT_DELAY.days.ago | ||
14 | + update_cache_counter(:activities_count, record.user, -1) | ||
15 | + if record.target.kind_of?(Organization) | ||
16 | + update_cache_counter(:activities_count, record.target, -1) | ||
17 | + end | ||
18 | + end | ||
19 | + end | ||
20 | + end | ||
21 | +end |
@@ -0,0 +1,29 @@ | @@ -0,0 +1,29 @@ | ||
1 | +Rails.configuration.to_prepare do | ||
2 | + RoleAssignment.module_eval do | ||
3 | + extend CacheCounterHelper | ||
4 | + | ||
5 | + after_create do |role_assignment| | ||
6 | + accessor = role_assignment.accessor | ||
7 | + resource = role_assignment.resource | ||
8 | + if resource.kind_of?(Organization) | ||
9 | + #FIXME This will only work as long as the role_assignment associations | ||
10 | + #happen only between profiles, due to the polymorphic column type. | ||
11 | + if resource.role_assignments.where(:accessor_id => accessor.id).count == 1 | ||
12 | + update_cache_counter(:members_count, resource, 1) | ||
13 | + end | ||
14 | + end | ||
15 | + end | ||
16 | + | ||
17 | + after_destroy do |role_assignment| | ||
18 | + accessor = role_assignment.accessor | ||
19 | + resource = role_assignment.resource | ||
20 | + if resource.kind_of?(Organization) | ||
21 | + #FIXME This will only work as long as the role_assignment associations | ||
22 | + #happen only between profiles, due to the polymorphic column type. | ||
23 | + if resource.role_assignments.where(:accessor_id => accessor.id).count == 0 | ||
24 | + update_cache_counter(:members_count, resource, -1) | ||
25 | + end | ||
26 | + end | ||
27 | + end | ||
28 | + end | ||
29 | +end |
plugins/send_email/controllers/send_email_plugin_base_controller.rb
@@ -3,7 +3,7 @@ module SendEmailPluginBaseController | @@ -3,7 +3,7 @@ module SendEmailPluginBaseController | ||
3 | if request.post? | 3 | if request.post? |
4 | @context_url = profile ? profile.url : {:host => environment.default_hostname, :controller => 'home'} | 4 | @context_url = profile ? profile.url : {:host => environment.default_hostname, :controller => 'home'} |
5 | @mail = SendEmailPlugin::Mail.new( | 5 | @mail = SendEmailPlugin::Mail.new( |
6 | - :from => environment.contact_email, | 6 | + :from => environment.noreply_email, |
7 | :to => params[:to], | 7 | :to => params[:to], |
8 | :message => params[:message], | 8 | :message => params[:message], |
9 | :environment => environment, | 9 | :environment => environment, |
plugins/shopping_cart/views/shopping_cart_plugin_myprofile/edit.html.erb
1 | <h1> <%= _('Basket options') %> </h1> | 1 | <h1> <%= _('Basket options') %> </h1> |
2 | 2 | ||
3 | <% form_for(:settings, @settings, :url => {:action => 'edit'}, :html => {:method => 'post'}) do |f| %> | 3 | <% form_for(:settings, @settings, :url => {:action => 'edit'}, :html => {:method => 'post'}) do |f| %> |
4 | - <%= labelled_form_field(_('Enabled?'), f.check_box(:enabled)) %> | ||
5 | - <%= labelled_form_field(_('Delivery?'), f.check_box(:delivery)) %> | 4 | + <%= labelled_form_field(_('Enable shopping basket'), f.check_box(:enabled)) %> |
5 | + <%= labelled_form_field(_('Enable delivery fields on orders'), f.check_box(:delivery)) %> | ||
6 | <% display_delivery_settings = @settings.delivery ? 'auto' : 'none' %> | 6 | <% display_delivery_settings = @settings.delivery ? 'auto' : 'none' %> |
7 | <fieldset id='delivery_settings' style="display: <%= display_delivery_settings %>"><legend><%=_('Delivery')%></legend> | 7 | <fieldset id='delivery_settings' style="display: <%= display_delivery_settings %>"><legend><%=_('Delivery')%></legend> |
8 | <table> | 8 | <table> |
@@ -34,7 +34,7 @@ | @@ -34,7 +34,7 @@ | ||
34 | </table> | 34 | </table> |
35 | 35 | ||
36 | <%= labelled_form_field(_("Order's minimum price for free delivery:"), f.text_field(:free_delivery_price)) %> | 36 | <%= labelled_form_field(_("Order's minimum price for free delivery:"), f.text_field(:free_delivery_price)) %> |
37 | - <%= content_tag('small', _('Empty stands for no minimum price for free delivery.')) %> | 37 | + <%= content_tag('small', _('Leave empty to always charge the delivery.')) %> |
38 | </fieldset> | 38 | </fieldset> |
39 | <br style='clear: both'/> | 39 | <br style='clear: both'/> |
40 | <br style='clear: both'/> | 40 | <br style='clear: both'/> |
plugins/spaminator/lib/spaminator_plugin/mailer.rb
@@ -2,7 +2,7 @@ class SpaminatorPlugin::Mailer < Noosfero::Plugin::MailerBase | @@ -2,7 +2,7 @@ class SpaminatorPlugin::Mailer < Noosfero::Plugin::MailerBase | ||
2 | 2 | ||
3 | def inactive_person_notification(person) | 3 | def inactive_person_notification(person) |
4 | recipients person.email | 4 | recipients person.email |
5 | - from "#{person.environment.name} <#{person.environment.contact_email}>" | 5 | + from "#{person.environment.name} <#{person.environment.noreply_email}>" |
6 | subject _("[%s] You must reactivate your account.") % person.environment.name | 6 | subject _("[%s] You must reactivate your account.") % person.environment.name |
7 | content_type 'text/html' | 7 | content_type 'text/html' |
8 | body :person => person, | 8 | body :person => person, |
plugins/spaminator/test/unit/spaminator_plugin/mailer_test.rb
@@ -14,7 +14,7 @@ class SpaminatorPlugin::MailerTest < ActiveSupport::TestCase | @@ -14,7 +14,7 @@ class SpaminatorPlugin::MailerTest < ActiveSupport::TestCase | ||
14 | attr_accessor :environment, :settings | 14 | attr_accessor :environment, :settings |
15 | 15 | ||
16 | should 'be able to send a inactive person notification message' do | 16 | should 'be able to send a inactive person notification message' do |
17 | - environment.contact_email = 'no-reply@noosfero.org' | 17 | + environment.noreply_email = 'no-reply@noosfero.org' |
18 | environment.save | 18 | environment.save |
19 | 19 | ||
20 | person = create_user('spammer').person | 20 | person = create_user('spammer').person |
plugins/tolerance_time/lib/tolerance_time_plugin/publication.rb
@@ -5,8 +5,7 @@ class ToleranceTimePlugin::Publication < Noosfero::Plugin::ActiveRecord | @@ -5,8 +5,7 @@ class ToleranceTimePlugin::Publication < Noosfero::Plugin::ActiveRecord | ||
5 | 5 | ||
6 | class << self | 6 | class << self |
7 | def find_by_target(target) | 7 | def find_by_target(target) |
8 | - kind = target.kind_of?(Article) ? 'Article' : 'Comment' | ||
9 | - find_by_target_id_and_target_type(target.id, kind) | 8 | + find_by_target_id_and_target_type(target.id, target.class.base_class.name) |
10 | end | 9 | end |
11 | end | 10 | end |
12 | 11 |
po/pt/noosfero.po
@@ -2875,6 +2875,30 @@ msgstr "Artigo de texto com linguagem de marcação Textile" | @@ -2875,6 +2875,30 @@ msgstr "Artigo de texto com linguagem de marcação Textile" | ||
2875 | msgid "Accessible alternative for visually impaired users." | 2875 | msgid "Accessible alternative for visually impaired users." |
2876 | msgstr "Alternativa acessível para usuários com deficiência visual." | 2876 | msgstr "Alternativa acessível para usuários com deficiência visual." |
2877 | 2877 | ||
2878 | +#: app/models/layout_template.rb | ||
2879 | +msgid "Left Bar" | ||
2880 | +msgstr "Uma barra à esquerda" | ||
2881 | + | ||
2882 | +#: app/models/layout_template.rb | ||
2883 | +msgid "2 Left Bars" | ||
2884 | +msgstr "Duas barras à esquerda" | ||
2885 | + | ||
2886 | +#: app/models/layout_template.rb | ||
2887 | +msgid "Left and Bottom Bar" | ||
2888 | +msgstr "Uma barra à esquerda e outra ao final" | ||
2889 | + | ||
2890 | +#: app/models/layout_template.rb | ||
2891 | +msgid "Right Bar" | ||
2892 | +msgstr "Uma barra à direita" | ||
2893 | + | ||
2894 | +#: app/models/layout_template.rb | ||
2895 | +msgid "Default" | ||
2896 | +msgstr "Padrão" | ||
2897 | + | ||
2898 | +#: app/models/layout_template.rb | ||
2899 | +msgid "No Sidebars" | ||
2900 | +msgstr "Nenhuma barra lateral" | ||
2901 | + | ||
2878 | #: app/models/login_block.rb:4 | 2902 | #: app/models/login_block.rb:4 |
2879 | msgid "Login/logout" | 2903 | msgid "Login/logout" |
2880 | msgstr "Login/Sair" | 2904 | msgstr "Login/Sair" |
@@ -7219,8 +7243,8 @@ msgstr "Funcionalidade" | @@ -7219,8 +7243,8 @@ msgstr "Funcionalidade" | ||
7219 | 7243 | ||
7220 | #: app/views/features/index.rhtml:16 | 7244 | #: app/views/features/index.rhtml:16 |
7221 | #: plugins/shopping_cart/views/shopping_cart_plugin_myprofile/edit.html.erb:4 | 7245 | #: plugins/shopping_cart/views/shopping_cart_plugin_myprofile/edit.html.erb:4 |
7222 | -msgid "Enabled?" | ||
7223 | -msgstr "Habilitada?" | 7246 | +msgid "Enable shopping basket" |
7247 | +msgstr "Habilitar cesto de compras" | ||
7224 | 7248 | ||
7225 | #: app/views/features/index.rhtml:27 | 7249 | #: app/views/features/index.rhtml:27 |
7226 | msgid "Configure features" | 7250 | msgid "Configure features" |
@@ -12462,8 +12486,8 @@ msgid "Basket options" | @@ -12462,8 +12486,8 @@ msgid "Basket options" | ||
12462 | msgstr "Opções do cesto" | 12486 | msgstr "Opções do cesto" |
12463 | 12487 | ||
12464 | #: plugins/shopping_cart/views/shopping_cart_plugin_myprofile/edit.html.erb:5 | 12488 | #: plugins/shopping_cart/views/shopping_cart_plugin_myprofile/edit.html.erb:5 |
12465 | -msgid "Delivery?" | ||
12466 | -msgstr "Entrega?" | 12489 | +msgid "Enable delivery fields on orders" |
12490 | +msgstr "Ativar campos de entrega para pedidos" | ||
12467 | 12491 | ||
12468 | #: plugins/shopping_cart/views/shopping_cart_plugin_myprofile/edit.html.erb:10 | 12492 | #: plugins/shopping_cart/views/shopping_cart_plugin_myprofile/edit.html.erb:10 |
12469 | msgid "Option" | 12493 | msgid "Option" |
@@ -12480,12 +12504,12 @@ msgid "ADD NEW OPTION" | @@ -12480,12 +12504,12 @@ msgid "ADD NEW OPTION" | ||
12480 | msgstr "ADCIONAR NOVA OPÇÂO" | 12504 | msgstr "ADCIONAR NOVA OPÇÂO" |
12481 | 12505 | ||
12482 | #: plugins/shopping_cart/views/shopping_cart_plugin_myprofile/edit.html.erb:36 | 12506 | #: plugins/shopping_cart/views/shopping_cart_plugin_myprofile/edit.html.erb:36 |
12483 | -msgid "Free delivery price:" | ||
12484 | -msgstr "Preço de entrega grátis:" | 12507 | +msgid "Order's minimum price for free delivery:" |
12508 | +msgstr "Preço mínimo do pedido para entrega grátis:" | ||
12485 | 12509 | ||
12486 | #: plugins/shopping_cart/views/shopping_cart_plugin_myprofile/edit.html.erb:37 | 12510 | #: plugins/shopping_cart/views/shopping_cart_plugin_myprofile/edit.html.erb:37 |
12487 | -msgid "Empty stands for no free delivery price." | ||
12488 | -msgstr "Vazio significa sem preço de frete grátis." | 12511 | +msgid "Leave empty to always charge the delivery." |
12512 | +msgstr "Deixe vazio para sempre cobrar a entrega." | ||
12489 | 12513 | ||
12490 | #: plugins/shopping_cart/views/shopping_cart_plugin_myprofile/reports.html.erb:1 | 12514 | #: plugins/shopping_cart/views/shopping_cart_plugin_myprofile/reports.html.erb:1 |
12491 | msgid "Purchase Reports" | 12515 | msgid "Purchase Reports" |
public/designs/templates/leftbottom/config.yml
1 | -name: "Left and Bottom bar" | 1 | +name: "Left and Bottom Bar" |
2 | title: "Style 2 columns and a box at bottom of content" | 2 | title: "Style 2 columns and a box at bottom of content" |
3 | description: "A theme with 2 columns and a box below the content" | 3 | description: "A theme with 2 columns and a box below the content" |
4 | number_of_boxes: 3 | 4 | number_of_boxes: 3 |
public/designs/templates/nosidebars/config.yml
test/functional/content_viewer_controller_test.rb
@@ -741,16 +741,6 @@ class ContentViewerControllerTest < ActionController::TestCase | @@ -741,16 +741,6 @@ class ContentViewerControllerTest < ActionController::TestCase | ||
741 | assert_tag :tag => 'li', :attributes => {:title => 'my img title', :class => 'image-gallery-item'}, :child => {:tag => 'span', :content => 'my img title'} | 741 | assert_tag :tag => 'li', :attributes => {:title => 'my img title', :class => 'image-gallery-item'}, :child => {:tag => 'span', :content => 'my img title'} |
742 | end | 742 | end |
743 | 743 | ||
744 | - should 'not allow html on title of the images' do | ||
745 | - login_as(profile.identifier) | ||
746 | - folder = fast_create(Gallery, :profile_id => profile.id) | ||
747 | - file = UploadedFile.create!(:title => '<b>my img title</b>', :profile => profile, :parent => folder, :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')) | ||
748 | - | ||
749 | - get :view_page, :profile => profile.identifier, :page => folder.explode_path | ||
750 | - | ||
751 | - assert_tag :tag => 'li', :attributes => {:title => 'my img title', :class => 'image-gallery-item'}, :child => {:tag => 'span', :content => 'my img title'} | ||
752 | - end | ||
753 | - | ||
754 | should 'allow publisher owner view private articles' do | 744 | should 'allow publisher owner view private articles' do |
755 | c = Community.create!(:name => 'test_com') | 745 | c = Community.create!(:name => 'test_com') |
756 | u = create_user_with_permission('test_user', 'publish_content', c) | 746 | u = create_user_with_permission('test_user', 'publish_content', c) |
test/functional/invite_controller_test.rb
@@ -230,7 +230,8 @@ class InviteControllerTest < ActionController::TestCase | @@ -230,7 +230,8 @@ class InviteControllerTest < ActionController::TestCase | ||
230 | 230 | ||
231 | contact_list = ContactList.create | 231 | contact_list = ContactList.create |
232 | post :select_friends, :profile => profile.identifier, :manual_import_addresses => "#{friend.name} <#{friend.email}>", :import_from => "manual", :mail_template => "click: <url>", :contact_list => contact_list.id | 232 | post :select_friends, :profile => profile.identifier, :manual_import_addresses => "#{friend.name} <#{friend.email}>", :import_from => "manual", :mail_template => "click: <url>", :contact_list => contact_list.id |
233 | - assert_equal 'pt', Delayed::Job.first.payload_object.locale | 233 | + job = Delayed::Job.where("handler LIKE '%InvitationJob%'").first |
234 | + assert_equal 'pt', job.payload_object.locale | ||
234 | end | 235 | end |
235 | 236 | ||
236 | private | 237 | private |
test/functional/profile_controller_test.rb
@@ -766,23 +766,28 @@ class ProfileControllerTest < ActionController::TestCase | @@ -766,23 +766,28 @@ class ProfileControllerTest < ActionController::TestCase | ||
766 | end | 766 | end |
767 | 767 | ||
768 | should 'see all the activities in the current profile network' do | 768 | should 'see all the activities in the current profile network' do |
769 | - p1= Person.first | 769 | + p1= fast_create(Person) |
770 | p2= fast_create(Person) | 770 | p2= fast_create(Person) |
771 | assert !p1.is_a_friend?(p2) | 771 | assert !p1.is_a_friend?(p2) |
772 | + | ||
772 | p3= fast_create(Person) | 773 | p3= fast_create(Person) |
773 | p3.add_friend(p1) | 774 | p3.add_friend(p1) |
774 | assert p3.is_a_friend?(p1) | 775 | assert p3.is_a_friend?(p1) |
775 | - ActionTracker::Record.destroy_all | 776 | + |
777 | + ActionTracker::Record.delete_all | ||
778 | + | ||
779 | + UserStampSweeper.any_instance.stubs(:current_user).returns(p1) | ||
776 | Scrap.create!(defaults_for_scrap(:sender => p1, :receiver => p1)) | 780 | Scrap.create!(defaults_for_scrap(:sender => p1, :receiver => p1)) |
777 | a1 = ActionTracker::Record.last | 781 | a1 = ActionTracker::Record.last |
782 | + | ||
778 | UserStampSweeper.any_instance.stubs(:current_user).returns(p2) | 783 | UserStampSweeper.any_instance.stubs(:current_user).returns(p2) |
779 | Scrap.create!(defaults_for_scrap(:sender => p2, :receiver => p3)) | 784 | Scrap.create!(defaults_for_scrap(:sender => p2, :receiver => p3)) |
780 | a2 = ActionTracker::Record.last | 785 | a2 = ActionTracker::Record.last |
786 | + | ||
781 | UserStampSweeper.any_instance.stubs(:current_user).returns(p3) | 787 | UserStampSweeper.any_instance.stubs(:current_user).returns(p3) |
782 | Scrap.create!(defaults_for_scrap(:sender => p3, :receiver => p1)) | 788 | Scrap.create!(defaults_for_scrap(:sender => p3, :receiver => p1)) |
783 | a3 = ActionTracker::Record.last | 789 | a3 = ActionTracker::Record.last |
784 | 790 | ||
785 | - | ||
786 | @controller.stubs(:logged_in?).returns(true) | 791 | @controller.stubs(:logged_in?).returns(true) |
787 | user = mock() | 792 | user = mock() |
788 | user.stubs(:person).returns(p3) | 793 | user.stubs(:person).returns(p3) |
@@ -792,24 +797,29 @@ class ProfileControllerTest < ActionController::TestCase | @@ -792,24 +797,29 @@ class ProfileControllerTest < ActionController::TestCase | ||
792 | 797 | ||
793 | process_delayed_job_queue | 798 | process_delayed_job_queue |
794 | get :index, :profile => p1.identifier | 799 | get :index, :profile => p1.identifier |
795 | - assert_not_nil assigns(:network_activities) | ||
796 | - assert_equal [], [a1,a3] - assigns(:network_activities) | ||
797 | - assert_equal assigns(:network_activities) - [a1, a3], [] | 800 | + |
801 | + assert_equivalent [a1,a3].map(&:id), assigns(:network_activities).map(&:id) | ||
798 | end | 802 | end |
799 | 803 | ||
800 | should 'the network activity be visible only to profile followers' do | 804 | should 'the network activity be visible only to profile followers' do |
801 | - p1= Person.first | 805 | + p1= fast_create(Person) |
802 | p2= fast_create(Person) | 806 | p2= fast_create(Person) |
803 | assert !p1.is_a_friend?(p2) | 807 | assert !p1.is_a_friend?(p2) |
808 | + | ||
804 | p3= fast_create(Person) | 809 | p3= fast_create(Person) |
805 | p3.add_friend(p1) | 810 | p3.add_friend(p1) |
806 | assert p3.is_a_friend?(p1) | 811 | assert p3.is_a_friend?(p1) |
807 | - ActionTracker::Record.destroy_all | 812 | + |
813 | + ActionTracker::Record.delete_all | ||
814 | + | ||
815 | + UserStampSweeper.any_instance.stubs(:current_user).returns(p1) | ||
808 | Scrap.create!(defaults_for_scrap(:sender => p1, :receiver => p1)) | 816 | Scrap.create!(defaults_for_scrap(:sender => p1, :receiver => p1)) |
809 | a1 = ActionTracker::Record.last | 817 | a1 = ActionTracker::Record.last |
818 | + | ||
810 | UserStampSweeper.any_instance.stubs(:current_user).returns(p2) | 819 | UserStampSweeper.any_instance.stubs(:current_user).returns(p2) |
811 | Scrap.create!(defaults_for_scrap(:sender => p2, :receiver => p3)) | 820 | Scrap.create!(defaults_for_scrap(:sender => p2, :receiver => p3)) |
812 | a2 = ActionTracker::Record.last | 821 | a2 = ActionTracker::Record.last |
822 | + | ||
813 | UserStampSweeper.any_instance.stubs(:current_user).returns(p3) | 823 | UserStampSweeper.any_instance.stubs(:current_user).returns(p3) |
814 | Scrap.create!(defaults_for_scrap(:sender => p3, :receiver => p1)) | 824 | Scrap.create!(defaults_for_scrap(:sender => p3, :receiver => p1)) |
815 | a3 = ActionTracker::Record.last | 825 | a3 = ActionTracker::Record.last |
@@ -819,8 +829,9 @@ class ProfileControllerTest < ActionController::TestCase | @@ -819,8 +829,9 @@ class ProfileControllerTest < ActionController::TestCase | ||
819 | user.stubs(:person).returns(p2) | 829 | user.stubs(:person).returns(p2) |
820 | user.stubs(:login).returns('some') | 830 | user.stubs(:login).returns('some') |
821 | @controller.stubs(:current_user).returns(user) | 831 | @controller.stubs(:current_user).returns(user) |
832 | + | ||
822 | get :index, :profile => p1.identifier | 833 | get :index, :profile => p1.identifier |
823 | - assert_equal [], assigns(:network_activities) | 834 | + assert assigns(:network_activities).blank? |
824 | 835 | ||
825 | user = mock() | 836 | user = mock() |
826 | user.stubs(:person).returns(p3) | 837 | user.stubs(:person).returns(p3) |
@@ -828,9 +839,9 @@ class ProfileControllerTest < ActionController::TestCase | @@ -828,9 +839,9 @@ class ProfileControllerTest < ActionController::TestCase | ||
828 | @controller.stubs(:current_user).returns(user) | 839 | @controller.stubs(:current_user).returns(user) |
829 | Person.any_instance.stubs(:follows?).returns(true) | 840 | Person.any_instance.stubs(:follows?).returns(true) |
830 | process_delayed_job_queue | 841 | process_delayed_job_queue |
842 | + | ||
831 | get :index, :profile => p3.identifier | 843 | get :index, :profile => p3.identifier |
832 | - assert_equal [], [a1,a3] - assigns(:network_activities) | ||
833 | - assert_equal assigns(:network_activities) - [a1, a3], [] | 844 | + assert_equivalent [a1,a3], assigns(:network_activities) |
834 | end | 845 | end |
835 | 846 | ||
836 | should 'the network activity be paginated' do | 847 | should 'the network activity be paginated' do |
test/functional/search_controller_test.rb
@@ -549,9 +549,9 @@ class SearchControllerTest < ActionController::TestCase | @@ -549,9 +549,9 @@ class SearchControllerTest < ActionController::TestCase | ||
549 | c2 = create(Community, :name => 'Testing community 2') | 549 | c2 = create(Community, :name => 'Testing community 2') |
550 | c3 = create(Community, :name => 'Testing community 3') | 550 | c3 = create(Community, :name => 'Testing community 3') |
551 | ActionTracker::Record.delete_all | 551 | ActionTracker::Record.delete_all |
552 | - fast_create(ActionTracker::Record, :target_id => c1, :user_type => 'Profile', :user_id => person, :created_at => Time.now) | ||
553 | - fast_create(ActionTracker::Record, :target_id => c2, :user_type => 'Profile', :user_id => person, :created_at => Time.now) | ||
554 | - fast_create(ActionTracker::Record, :target_id => c2, :user_type => 'Profile', :user_id => person, :created_at => Time.now) | 552 | + ActionTracker::Record.create!(:target => c1, :user => person, :created_at => Time.now, :verb => 'leave_scrap') |
553 | + ActionTracker::Record.create!(:target => c2, :user => person, :created_at => Time.now, :verb => 'leave_scrap') | ||
554 | + ActionTracker::Record.create!(:target => c2, :user => person, :created_at => Time.now, :verb => 'leave_scrap') | ||
555 | get :communities, :filter => 'more_active' | 555 | get :communities, :filter => 'more_active' |
556 | assert_equal [c2,c1,c3] , assigns(:searches)[:communities][:results] | 556 | assert_equal [c2,c1,c3] , assigns(:searches)[:communities][:results] |
557 | end | 557 | end |
test/test_helper.rb
@@ -183,7 +183,7 @@ class ActiveSupport::TestCase | @@ -183,7 +183,7 @@ class ActiveSupport::TestCase | ||
183 | if reference.first == value | 183 | if reference.first == value |
184 | reference.shift | 184 | reference.shift |
185 | else | 185 | else |
186 | - assert false, "'#{value}' was found before it should be on: #{original.inspect}" | 186 | + assert false, "'#{value.inspect}' was found before it should be on: #{original.inspect}" |
187 | end | 187 | end |
188 | end | 188 | end |
189 | end | 189 | end |
@@ -0,0 +1,64 @@ | @@ -0,0 +1,64 @@ | ||
1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
2 | + | ||
3 | +class ActionTrackerExtTest < ActiveSupport::TestCase | ||
4 | + should 'increase person activities_count on new activity' do | ||
5 | + person = fast_create(Person) | ||
6 | + assert_difference person, :activities_count, 1 do | ||
7 | + ActionTracker::Record.create! :verb => :leave_scrap, :user => person, :target => fast_create(Profile) | ||
8 | + person.reload | ||
9 | + end | ||
10 | + end | ||
11 | + | ||
12 | + should 'decrease person activities_count on activity removal' do | ||
13 | + person = fast_create(Person) | ||
14 | + record = ActionTracker::Record.create! :verb => :leave_scrap, :user => person, :target => fast_create(Profile) | ||
15 | + person.reload | ||
16 | + assert_difference person, :activities_count, -1 do | ||
17 | + record.destroy | ||
18 | + person.reload | ||
19 | + end | ||
20 | + end | ||
21 | + | ||
22 | + should 'not decrease person activities_count on activity removal after the recent delay' do | ||
23 | + person = fast_create(Person) | ||
24 | + record = ActionTracker::Record.create! :verb => :leave_scrap, :user => person, :target => fast_create(Profile) | ||
25 | + record.created_at = record.created_at - ActionTracker::Record::RECENT_DELAY.days - 1.day | ||
26 | + record.save! | ||
27 | + person.reload | ||
28 | + assert_no_difference person, :activities_count do | ||
29 | + record.destroy | ||
30 | + person.reload | ||
31 | + end | ||
32 | + end | ||
33 | + | ||
34 | + should 'increase organization activities_count on new activity' do | ||
35 | + person = fast_create(Person) | ||
36 | + organization = fast_create(Organization) | ||
37 | + assert_difference organization, :activities_count, 1 do | ||
38 | + ActionTracker::Record.create! :verb => :leave_scrap, :user => person, :target => organization | ||
39 | + organization.reload | ||
40 | + end | ||
41 | + end | ||
42 | + | ||
43 | + should 'decrease organization activities_count on activity removal' do | ||
44 | + person = fast_create(Person) | ||
45 | + organization = fast_create(Organization) | ||
46 | + record = ActionTracker::Record.create! :verb => :leave_scrap, :user => person, :target => organization | ||
47 | + organization.reload | ||
48 | + assert_difference organization, :activities_count, -1 do | ||
49 | + record.destroy | ||
50 | + organization.reload | ||
51 | + end | ||
52 | + end | ||
53 | + | ||
54 | + should 'not decrease organization activities_count on activity removal after the recent delay' do | ||
55 | + person = fast_create(Person) | ||
56 | + organization = fast_create(Organization) | ||
57 | + record = ActionTracker::Record.create! :verb => :leave_scrap, :user => person, :target => organization, :created_at => (ActionTracker::Record::RECENT_DELAY + 1).days.ago | ||
58 | + organization.reload | ||
59 | + assert_no_difference organization, :activities_count do | ||
60 | + record.destroy | ||
61 | + organization.reload | ||
62 | + end | ||
63 | + end | ||
64 | +end |
@@ -0,0 +1,36 @@ | @@ -0,0 +1,36 @@ | ||
1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
2 | + | ||
3 | +class ActivitiesCounterCacheJobTest < ActiveSupport::TestCase | ||
4 | + | ||
5 | + should 'correctly update the person activities counter cache' do | ||
6 | + person = create_user('person').person | ||
7 | + ActionTracker::Record.create!(:user => person, :verb => 'create_article') | ||
8 | + ActionTracker::Record.create!(:user => person, :verb => 'create_article') | ||
9 | + person.reload | ||
10 | + assert_equal 2, person.activities_count | ||
11 | + | ||
12 | + person.activities_count = 0 | ||
13 | + person.save! | ||
14 | + job = ActivitiesCounterCacheJob.new | ||
15 | + job.perform | ||
16 | + person.reload | ||
17 | + assert_equal 2, person.activities_count | ||
18 | + end | ||
19 | + | ||
20 | + should 'correctly update the organization activities counter cache' do | ||
21 | + person = create_user('person').person | ||
22 | + organization = Organization.create!(:name => 'Organization1', :identifier => 'organization1') | ||
23 | + ActionTracker::Record.create!(:user => person, :verb => 'create_article', :target => organization) | ||
24 | + ActionTracker::Record.create!(:user => person, :verb => 'create_article', :target => organization) | ||
25 | + organization.reload | ||
26 | + assert_equal 2, organization.activities_count | ||
27 | + | ||
28 | + organization.activities_count = 0 | ||
29 | + organization.save! | ||
30 | + job = ActivitiesCounterCacheJob.new | ||
31 | + job.perform | ||
32 | + organization.reload | ||
33 | + assert_equal 2, organization.activities_count | ||
34 | + end | ||
35 | + | ||
36 | +end |
test/unit/article_test.rb
@@ -1630,10 +1630,10 @@ class ArticleTest < ActiveSupport::TestCase | @@ -1630,10 +1630,10 @@ class ArticleTest < ActiveSupport::TestCase | ||
1630 | 1630 | ||
1631 | should 'not allow all community members to edit by default' do | 1631 | should 'not allow all community members to edit by default' do |
1632 | community = fast_create(Community) | 1632 | community = fast_create(Community) |
1633 | - admin = create_user('community-admin').person | ||
1634 | - member = create_user.person | ||
1635 | - | 1633 | + admin = fast_create(Person) |
1634 | + member = fast_create(Person) | ||
1636 | community.add_admin(admin) | 1635 | community.add_admin(admin) |
1636 | + community.reload | ||
1637 | community.add_member(member) | 1637 | community.add_member(member) |
1638 | a = Article.new(:profile => community) | 1638 | a = Article.new(:profile => community) |
1639 | 1639 |
test/unit/community_test.rb
@@ -213,8 +213,8 @@ class CommunityTest < ActiveSupport::TestCase | @@ -213,8 +213,8 @@ class CommunityTest < ActiveSupport::TestCase | ||
213 | community = fast_create(Community) | 213 | community = fast_create(Community) |
214 | community.closed = true | 214 | community.closed = true |
215 | community.save | 215 | community.save |
216 | - | ||
217 | community.add_member(fast_create(Person)) | 216 | community.add_member(fast_create(Person)) |
217 | + community.reload | ||
218 | 218 | ||
219 | assert_difference AddMember, :count do | 219 | assert_difference AddMember, :count do |
220 | community.add_member(person) | 220 | community.add_member(person) |
test/unit/contact_sender_test.rb
@@ -16,7 +16,7 @@ class ContactSenderTest < ActiveSupport::TestCase | @@ -16,7 +16,7 @@ class ContactSenderTest < ActiveSupport::TestCase | ||
16 | ent.contact_email = 'contact@invalid.com' | 16 | ent.contact_email = 'contact@invalid.com' |
17 | c = build(Contact, :dest => ent) | 17 | c = build(Contact, :dest => ent) |
18 | response = Contact::Sender.deliver_mail(c) | 18 | response = Contact::Sender.deliver_mail(c) |
19 | - assert_equal Environment.default.contact_email, response.from.to_s | 19 | + assert_equal Environment.default.noreply_email.to_s, response.from.to_s |
20 | assert_equal "[#{ent.name}] #{c.subject}", response.subject | 20 | assert_equal "[#{ent.name}] #{c.subject}", response.subject |
21 | end | 21 | end |
22 | 22 | ||
@@ -27,7 +27,7 @@ class ContactSenderTest < ActiveSupport::TestCase | @@ -27,7 +27,7 @@ class ContactSenderTest < ActiveSupport::TestCase | ||
27 | response = Contact::Sender.deliver_mail(c) | 27 | response = Contact::Sender.deliver_mail(c) |
28 | assert_includes response.to, c.dest.contact_email | 28 | assert_includes response.to, c.dest.contact_email |
29 | end | 29 | end |
30 | - | 30 | + |
31 | should 'deliver mail to admins of enterprise' do | 31 | should 'deliver mail to admins of enterprise' do |
32 | admin = create_user('admin_test').person | 32 | admin = create_user('admin_test').person |
33 | ent = Enterprise.create!(:name => 'my enterprise', :identifier => 'myent', :environment => Environment.default) | 33 | ent = Enterprise.create!(:name => 'my enterprise', :identifier => 'myent', :environment => Environment.default) |
test/unit/contact_test.rb
@@ -44,11 +44,14 @@ class ContactTest < ActiveSupport::TestCase | @@ -44,11 +44,14 @@ class ContactTest < ActiveSupport::TestCase | ||
44 | assert !c.deliver | 44 | assert !c.deliver |
45 | end | 45 | end |
46 | 46 | ||
47 | - should 'use sender name and environment contact_email on from' do | 47 | + should 'use sender name and environment noreply_email on from' do |
48 | ent = fast_create(Enterprise, :name => 'my enterprise', :identifier => 'myent') | 48 | ent = fast_create(Enterprise, :name => 'my enterprise', :identifier => 'myent') |
49 | + env = ent.environment | ||
50 | + env.noreply_email = 'noreply@sample.org' | ||
51 | + env.save! | ||
49 | c = Contact.new(:name => 'john', :email => 'john@invalid.com', :subject => 'hi', :message => 'hi, all', :dest => ent) | 52 | c = Contact.new(:name => 'john', :email => 'john@invalid.com', :subject => 'hi', :message => 'hi, all', :dest => ent) |
50 | email = c.deliver | 53 | email = c.deliver |
51 | - assert_equal "#{c.name} <#{ent.environment.contact_email}>", email['from'].to_s | 54 | + assert_equal "#{c.name} <#{ent.environment.noreply_email}>", email['from'].to_s |
52 | end | 55 | end |
53 | 56 | ||
54 | should 'add dest name on subject' do | 57 | should 'add dest name on subject' do |
test/unit/enterprise_test.rb
@@ -99,6 +99,7 @@ class EnterpriseTest < ActiveSupport::TestCase | @@ -99,6 +99,7 @@ class EnterpriseTest < ActiveSupport::TestCase | ||
99 | enterprise = fast_create(Enterprise) | 99 | enterprise = fast_create(Enterprise) |
100 | member = fast_create(Person) | 100 | member = fast_create(Person) |
101 | enterprise.add_member(member) | 101 | enterprise.add_member(member) |
102 | + enterprise.reload | ||
102 | 103 | ||
103 | person = fast_create(Person) | 104 | person = fast_create(Person) |
104 | enterprise.add_member(person) | 105 | enterprise.add_member(person) |
test/unit/environment_mailing_test.rb
@@ -46,7 +46,7 @@ class EnvironmentMailingTest < ActiveSupport::TestCase | @@ -46,7 +46,7 @@ class EnvironmentMailingTest < ActiveSupport::TestCase | ||
46 | 46 | ||
47 | should 'display name and email on generate_from' do | 47 | should 'display name and email on generate_from' do |
48 | mailing = EnvironmentMailing.new(:source => environment, :person => person_1) | 48 | mailing = EnvironmentMailing.new(:source => environment, :person => person_1) |
49 | - assert_equal "#{environment.name} <#{environment.contact_email}>", mailing.generate_from | 49 | + assert_equal "#{environment.name} <#{environment.noreply_email}>", mailing.generate_from |
50 | end | 50 | end |
51 | 51 | ||
52 | should 'deliver mailing to each recipient after create' do | 52 | should 'deliver mailing to each recipient after create' do |
test/unit/file_presenter_test.rb
@@ -58,4 +58,20 @@ class FilePresenterTest < ActiveSupport::TestCase | @@ -58,4 +58,20 @@ class FilePresenterTest < ActiveSupport::TestCase | ||
58 | end | 58 | end |
59 | end | 59 | end |
60 | 60 | ||
61 | + should 'pass kind_of? to the encapsulated file' do | ||
62 | + f = FilePresenter.for(UploadedFile.new) | ||
63 | + assert f.kind_of?(UploadedFile) | ||
64 | + end | ||
65 | + | ||
66 | + should 'not crash with uploaded_file short description without content_type' do | ||
67 | + f = FilePresenter.for(UploadedFile.new) | ||
68 | + assert_nothing_raised do | ||
69 | + f.short_description | ||
70 | + end | ||
71 | + end | ||
72 | + | ||
73 | + should 'show unknown type when file doesn\'t have a content_type' do | ||
74 | + f = FilePresenter.for(UploadedFile.new) | ||
75 | + assert_match /Unknown/, f.short_description | ||
76 | + end | ||
61 | end | 77 | end |
test/unit/mailing_test.rb
@@ -74,7 +74,7 @@ class MailingTest < ActiveSupport::TestCase | @@ -74,7 +74,7 @@ class MailingTest < ActiveSupport::TestCase | ||
74 | should 'display name and email on generate_from' do | 74 | should 'display name and email on generate_from' do |
75 | person = Person['user_one'] | 75 | person = Person['user_one'] |
76 | mailing = Mailing.new(:source => environment, :person => person) | 76 | mailing = Mailing.new(:source => environment, :person => person) |
77 | - assert_equal "#{environment.name} <#{environment.contact_email}>", mailing.generate_from | 77 | + assert_equal "#{environment.name} <#{environment.noreply_email}>", mailing.generate_from |
78 | end | 78 | end |
79 | 79 | ||
80 | should 'generate subject' do | 80 | should 'generate subject' do |
test/unit/organization_mailing_test.rb
@@ -42,7 +42,7 @@ class OrganizationMailingTest < ActiveSupport::TestCase | @@ -42,7 +42,7 @@ class OrganizationMailingTest < ActiveSupport::TestCase | ||
42 | 42 | ||
43 | should 'display name and email on generate_from' do | 43 | should 'display name and email on generate_from' do |
44 | mailing = OrganizationMailing.new(:source => community, :person => person) | 44 | mailing = OrganizationMailing.new(:source => community, :person => person) |
45 | - assert_equal "#{person.name} <#{community.environment.contact_email}>", mailing.generate_from | 45 | + assert_equal "#{person.name} <#{community.environment.noreply_email}>", mailing.generate_from |
46 | end | 46 | end |
47 | 47 | ||
48 | should 'generate subject' do | 48 | should 'generate subject' do |
@@ -62,18 +62,21 @@ class OrganizationMailingTest < ActiveSupport::TestCase | @@ -62,18 +62,21 @@ class OrganizationMailingTest < ActiveSupport::TestCase | ||
62 | 62 | ||
63 | should 'deliver mailing to each member after create' do | 63 | should 'deliver mailing to each member after create' do |
64 | mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) | 64 | mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) |
65 | + community.reload | ||
65 | process_delayed_job_queue | 66 | process_delayed_job_queue |
66 | assert_equal 2, ActionMailer::Base.deliveries.count | 67 | assert_equal 2, ActionMailer::Base.deliveries.count |
67 | end | 68 | end |
68 | 69 | ||
69 | should 'deliver mailing when there are many mailings created' do | 70 | should 'deliver mailing when there are many mailings created' do |
70 | 50.times { OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) } | 71 | 50.times { OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) } |
72 | + community.reload | ||
71 | process_delayed_job_queue | 73 | process_delayed_job_queue |
72 | assert_equal 50*community.members_count, ActionMailer::Base.deliveries.count | 74 | assert_equal 50*community.members_count, ActionMailer::Base.deliveries.count |
73 | end | 75 | end |
74 | 76 | ||
75 | should 'create mailing sent to each recipient after delivering mailing' do | 77 | should 'create mailing sent to each recipient after delivering mailing' do |
76 | mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) | 78 | mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) |
79 | + community.reload | ||
77 | assert_difference MailingSent, :count, 2 do | 80 | assert_difference MailingSent, :count, 2 do |
78 | process_delayed_job_queue | 81 | process_delayed_job_queue |
79 | end | 82 | end |
test/unit/organization_test.rb
@@ -302,18 +302,17 @@ class OrganizationTest < ActiveSupport::TestCase | @@ -302,18 +302,17 @@ class OrganizationTest < ActiveSupport::TestCase | ||
302 | end | 302 | end |
303 | 303 | ||
304 | should 'find more popular organizations' do | 304 | should 'find more popular organizations' do |
305 | - Organization.delete_all | ||
306 | o1 = fast_create(Organization) | 305 | o1 = fast_create(Organization) |
307 | o2 = fast_create(Organization) | 306 | o2 = fast_create(Organization) |
308 | 307 | ||
309 | p1 = fast_create(Person) | 308 | p1 = fast_create(Person) |
310 | p2 = fast_create(Person) | 309 | p2 = fast_create(Person) |
311 | o1.add_member(p1) | 310 | o1.add_member(p1) |
312 | - assert_equal [o1,o2] , Organization.more_popular | 311 | + assert_order [o1,o2] , Organization.more_popular |
313 | 312 | ||
314 | o2.add_member(p1) | 313 | o2.add_member(p1) |
315 | o2.add_member(p2) | 314 | o2.add_member(p2) |
316 | - assert_equal [o2,o1] , Organization.more_popular | 315 | + assert_order [o2,o1] , Organization.more_popular |
317 | end | 316 | end |
318 | 317 | ||
319 | should 'list organizations that have no members in more popular list' do | 318 | should 'list organizations that have no members in more popular list' do |
@@ -331,6 +330,7 @@ class OrganizationTest < ActiveSupport::TestCase | @@ -331,6 +330,7 @@ class OrganizationTest < ActiveSupport::TestCase | ||
331 | person = fast_create(Person) | 330 | person = fast_create(Person) |
332 | organization = fast_create(Organization) | 331 | organization = fast_create(Organization) |
333 | organization.add_member(person) | 332 | organization.add_member(person) |
333 | + organization.reload | ||
334 | 334 | ||
335 | assert_equal "one member", organization.more_popular_label | 335 | assert_equal "one member", organization.more_popular_label |
336 | end | 336 | end |
@@ -342,47 +342,30 @@ class OrganizationTest < ActiveSupport::TestCase | @@ -342,47 +342,30 @@ class OrganizationTest < ActiveSupport::TestCase | ||
342 | 342 | ||
343 | organization.add_member(person1) | 343 | organization.add_member(person1) |
344 | organization.add_member(person2) | 344 | organization.add_member(person2) |
345 | + organization.reload | ||
345 | assert_equal "2 members", organization.more_popular_label | 346 | assert_equal "2 members", organization.more_popular_label |
346 | 347 | ||
347 | person3 = fast_create(Person) | 348 | person3 = fast_create(Person) |
348 | organization.add_member(person3) | 349 | organization.add_member(person3) |
350 | + organization.reload | ||
349 | assert_equal "3 members", organization.more_popular_label | 351 | assert_equal "3 members", organization.more_popular_label |
350 | end | 352 | end |
351 | 353 | ||
352 | should 'find more active organizations' do | 354 | should 'find more active organizations' do |
353 | person = fast_create(Person) | 355 | person = fast_create(Person) |
354 | - Organization.destroy_all | ||
355 | p1 = fast_create(Organization) | 356 | p1 = fast_create(Organization) |
356 | p2 = fast_create(Organization) | 357 | p2 = fast_create(Organization) |
357 | p3 = fast_create(Organization) | 358 | p3 = fast_create(Organization) |
358 | 359 | ||
359 | ActionTracker::Record.destroy_all | 360 | ActionTracker::Record.destroy_all |
360 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => person, :created_at => Time.now, :target_id => p1.id) | ||
361 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => person, :created_at => Time.now, :target_id => p2.id) | ||
362 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => person, :created_at => Time.now, :target_id => p2.id) | ||
363 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => person, :created_at => Time.now, :target_id => p3.id) | ||
364 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => person, :created_at => Time.now, :target_id => p3.id) | ||
365 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => person, :created_at => Time.now, :target_id => p3.id) | 361 | + ActionTracker::Record.create!(:user => person, :target => p1, :verb => 'leave_scrap') |
362 | + ActionTracker::Record.create!(:user => person, :target => p2, :verb => 'leave_scrap') | ||
363 | + ActionTracker::Record.create!(:user => person, :target => p2, :verb => 'leave_scrap') | ||
364 | + ActionTracker::Record.create!(:user => person, :target => p3, :verb => 'leave_scrap') | ||
365 | + ActionTracker::Record.create!(:user => person, :target => p3, :verb => 'leave_scrap') | ||
366 | + ActionTracker::Record.create!(:user => person, :target => p3, :verb => 'leave_scrap') | ||
366 | 367 | ||
367 | - assert_equal [p3,p2,p1] , Organization.more_active | ||
368 | - end | ||
369 | - | ||
370 | - should 'more active profile take in consideration only actions created only in the recent delay interval' do | ||
371 | - ActionTracker::Record.destroy_all | ||
372 | - recent_delay = ActionTracker::Record::RECENT_DELAY.days.ago | ||
373 | - | ||
374 | - person = fast_create(Person) | ||
375 | - Organization.destroy_all | ||
376 | - p1 = fast_create(Organization) | ||
377 | - p2 = fast_create(Organization) | ||
378 | - | ||
379 | - ActionTracker::Record.destroy_all | ||
380 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => person, :created_at => recent_delay, :target_id => p1.id) | ||
381 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => person, :created_at => recent_delay, :target_id => p1.id) | ||
382 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => person, :created_at => recent_delay, :target_id => p2.id) | ||
383 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => person, :created_at => recent_delay - 1.day, :target_id => p2.id) | ||
384 | - | ||
385 | - assert_equal [p1,p2] , Organization.more_active | 368 | + assert_order [p3,p2,p1] , Organization.more_active |
386 | end | 369 | end |
387 | 370 | ||
388 | should 'list profiles that have no actions in more active list' do | 371 | should 'list profiles that have no actions in more active list' do |
@@ -422,4 +405,24 @@ class OrganizationTest < ActiveSupport::TestCase | @@ -422,4 +405,24 @@ class OrganizationTest < ActiveSupport::TestCase | ||
422 | assert !organization.visible | 405 | assert !organization.visible |
423 | end | 406 | end |
424 | 407 | ||
408 | + should 'increase members_count on new membership' do | ||
409 | + member = fast_create(Person) | ||
410 | + organization = fast_create(Organization) | ||
411 | + assert_difference organization, :members_count, 1 do | ||
412 | + organization.add_member(member) | ||
413 | + organization.reload | ||
414 | + end | ||
415 | + end | ||
416 | + | ||
417 | + should 'decrease members_count on membership removal' do | ||
418 | + member = fast_create(Person) | ||
419 | + organization = fast_create(Organization) | ||
420 | + organization.add_member(member) | ||
421 | + organization.reload | ||
422 | + assert_difference organization, :members_count, -1 do | ||
423 | + organization.remove_member(member) | ||
424 | + organization.reload | ||
425 | + end | ||
426 | + end | ||
427 | + | ||
425 | end | 428 | end |
test/unit/person_test.rb
@@ -404,15 +404,14 @@ class PersonTest < ActiveSupport::TestCase | @@ -404,15 +404,14 @@ class PersonTest < ActiveSupport::TestCase | ||
404 | 404 | ||
405 | should 'not allow simple member to view group pending tasks' do | 405 | should 'not allow simple member to view group pending tasks' do |
406 | community = fast_create(Community) | 406 | community = fast_create(Community) |
407 | + admin = fast_create(Person) | ||
408 | + community.add_member(admin) | ||
407 | member = fast_create(Person) | 409 | member = fast_create(Person) |
410 | + community.reload | ||
408 | community.add_member(member) | 411 | community.add_member(member) |
409 | - | ||
410 | community.tasks << Task.new | 412 | community.tasks << Task.new |
411 | 413 | ||
412 | - person = fast_create(Person) | ||
413 | - community.add_member(person) | ||
414 | - | ||
415 | - assert_not_includes Person.with_pending_tasks, person | 414 | + assert_not_includes Person.with_pending_tasks, member |
416 | end | 415 | end |
417 | 416 | ||
418 | should 'person has organization pending tasks' do | 417 | should 'person has organization pending tasks' do |
@@ -642,16 +641,18 @@ class PersonTest < ActiveSupport::TestCase | @@ -642,16 +641,18 @@ class PersonTest < ActiveSupport::TestCase | ||
642 | end | 641 | end |
643 | 642 | ||
644 | should 'find more popular people' do | 643 | should 'find more popular people' do |
644 | + extend CacheCounterHelper | ||
645 | + | ||
645 | Person.delete_all | 646 | Person.delete_all |
646 | p1 = fast_create(Person) | 647 | p1 = fast_create(Person) |
647 | p2 = fast_create(Person) | 648 | p2 = fast_create(Person) |
648 | p3 = fast_create(Person) | 649 | p3 = fast_create(Person) |
649 | 650 | ||
650 | - p1.add_friend(p2) | ||
651 | - p2.add_friend(p1) | ||
652 | - p2.add_friend(p3) | ||
653 | - assert_equal p2, Person.more_popular[0] | ||
654 | - assert_equal p1, Person.more_popular[1] | 651 | + update_cache_counter(:friends_count, p1, 1) |
652 | + update_cache_counter(:friends_count, p2, 2) | ||
653 | + update_cache_counter(:friends_count, p3, 3) | ||
654 | + | ||
655 | + assert_order [p3, p2, p1], Person.more_popular | ||
655 | end | 656 | end |
656 | 657 | ||
657 | should 'list people that have no friends in more popular list' do | 658 | should 'list people that have no friends in more popular list' do |
@@ -891,6 +892,7 @@ class PersonTest < ActiveSupport::TestCase | @@ -891,6 +892,7 @@ class PersonTest < ActiveSupport::TestCase | ||
891 | p1 = fast_create(Person) | 892 | p1 = fast_create(Person) |
892 | p2 = fast_create(Person) | 893 | p2 = fast_create(Person) |
893 | p3 = fast_create(Person) | 894 | p3 = fast_create(Person) |
895 | + p4 = fast_create(Person) | ||
894 | 896 | ||
895 | community.add_member(p1) | 897 | community.add_member(p1) |
896 | assert p1.is_member_of?(community) | 898 | assert p1.is_member_of?(community) |
@@ -901,14 +903,15 @@ class PersonTest < ActiveSupport::TestCase | @@ -901,14 +903,15 @@ class PersonTest < ActiveSupport::TestCase | ||
901 | 903 | ||
902 | action_tracker = fast_create(ActionTracker::Record, :verb => 'create_article') | 904 | action_tracker = fast_create(ActionTracker::Record, :verb => 'create_article') |
903 | action_tracker.target = community | 905 | action_tracker.target = community |
906 | + action_tracker.user = p4 | ||
904 | action_tracker.save! | 907 | action_tracker.save! |
905 | ActionTrackerNotification.delete_all | 908 | ActionTrackerNotification.delete_all |
906 | - assert_difference(ActionTrackerNotification, :count, 3) do | 909 | + assert_difference(ActionTrackerNotification, :count, 4) do |
907 | Person.notify_activity(action_tracker) | 910 | Person.notify_activity(action_tracker) |
908 | process_delayed_job_queue | 911 | process_delayed_job_queue |
909 | end | 912 | end |
910 | ActionTrackerNotification.all.map{|a|a.profile}.map do |profile| | 913 | ActionTrackerNotification.all.map{|a|a.profile}.map do |profile| |
911 | - assert [community,p1,p3].include?(profile) | 914 | + assert [community,p1,p3,p4].include?(profile) |
912 | end | 915 | end |
913 | end | 916 | end |
914 | 917 | ||
@@ -1011,9 +1014,9 @@ class PersonTest < ActiveSupport::TestCase | @@ -1011,9 +1014,9 @@ class PersonTest < ActiveSupport::TestCase | ||
1011 | 1014 | ||
1012 | should 'the community specific notification created when a member joins community could not be propagated to members' do | 1015 | should 'the community specific notification created when a member joins community could not be propagated to members' do |
1013 | ActionTracker::Record.delete_all | 1016 | ActionTracker::Record.delete_all |
1014 | - p1 = create_user('test_user').person | ||
1015 | - p2 = create_user('test_user').person | ||
1016 | - p3 = create_user('test_user').person | 1017 | + p1 = create_user('p1').person |
1018 | + p2 = create_user('p2').person | ||
1019 | + p3 = create_user('p3').person | ||
1017 | c = fast_create(Community, :name => "Foo") | 1020 | c = fast_create(Community, :name => "Foo") |
1018 | c.add_member(p1) | 1021 | c.add_member(p1) |
1019 | process_delayed_job_queue | 1022 | process_delayed_job_queue |
@@ -1133,30 +1136,14 @@ class PersonTest < ActiveSupport::TestCase | @@ -1133,30 +1136,14 @@ class PersonTest < ActiveSupport::TestCase | ||
1133 | p3 = fast_create(Person) | 1136 | p3 = fast_create(Person) |
1134 | 1137 | ||
1135 | ActionTracker::Record.destroy_all | 1138 | ActionTracker::Record.destroy_all |
1136 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => p1, :created_at => Time.now) | ||
1137 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => p2, :created_at => Time.now) | ||
1138 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => p2, :created_at => Time.now) | ||
1139 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => p3, :created_at => Time.now) | ||
1140 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => p3, :created_at => Time.now) | ||
1141 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => p3, :created_at => Time.now) | 1139 | + ActionTracker::Record.create!(:user => p1, :verb => 'leave_scrap') |
1140 | + ActionTracker::Record.create!(:user => p2, :verb => 'leave_scrap') | ||
1141 | + ActionTracker::Record.create!(:user => p2, :verb => 'leave_scrap') | ||
1142 | + ActionTracker::Record.create!(:user => p3, :verb => 'leave_scrap') | ||
1143 | + ActionTracker::Record.create!(:user => p3, :verb => 'leave_scrap') | ||
1144 | + ActionTracker::Record.create!(:user => p3, :verb => 'leave_scrap') | ||
1142 | 1145 | ||
1143 | - assert_equal [p3,p2,p1] , Person.more_active | ||
1144 | - end | ||
1145 | - | ||
1146 | - should 'more active profile take in consideration only actions created only in the recent delay interval' do | ||
1147 | - Person.delete_all | ||
1148 | - ActionTracker::Record.destroy_all | ||
1149 | - recent_delay = ActionTracker::Record::RECENT_DELAY.days.ago | ||
1150 | - | ||
1151 | - p1 = fast_create(Person) | ||
1152 | - p2 = fast_create(Person) | ||
1153 | - | ||
1154 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => p1, :created_at => recent_delay) | ||
1155 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => p1, :created_at => recent_delay) | ||
1156 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => p2, :created_at => recent_delay) | ||
1157 | - fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => p2, :created_at => recent_delay - 1.day) | ||
1158 | - | ||
1159 | - assert_equal [p1,p2], Person.more_active | 1146 | + assert_order [p3,p2,p1] , Person.more_active |
1160 | end | 1147 | end |
1161 | 1148 | ||
1162 | should 'list profiles that have no actions in more active list' do | 1149 | should 'list profiles that have no actions in more active list' do |
@@ -1363,7 +1350,7 @@ class PersonTest < ActiveSupport::TestCase | @@ -1363,7 +1350,7 @@ class PersonTest < ActiveSupport::TestCase | ||
1363 | u = create_user('user'+i.to_s) | 1350 | u = create_user('user'+i.to_s) |
1364 | u.deactivate | 1351 | u.deactivate |
1365 | } | 1352 | } |
1366 | - assert_equal activated, Person.activated | 1353 | + assert_equivalent activated, Person.activated |
1367 | end | 1354 | end |
1368 | 1355 | ||
1369 | should 'deactivated named_scope return persons who are deactivated users' do | 1356 | should 'deactivated named_scope return persons who are deactivated users' do |
@@ -1379,7 +1366,7 @@ class PersonTest < ActiveSupport::TestCase | @@ -1379,7 +1366,7 @@ class PersonTest < ActiveSupport::TestCase | ||
1379 | u = create_user('user'+i.to_s) | 1366 | u = create_user('user'+i.to_s) |
1380 | u.activate | 1367 | u.activate |
1381 | } | 1368 | } |
1382 | - assert_equal deactivated, Person.deactivated | 1369 | + assert_equivalent deactivated, Person.deactivated |
1383 | end | 1370 | end |
1384 | 1371 | ||
1385 | should 'be able to retrieve memberships by role person has' do | 1372 | should 'be able to retrieve memberships by role person has' do |
@@ -1446,4 +1433,30 @@ class PersonTest < ActiveSupport::TestCase | @@ -1446,4 +1433,30 @@ class PersonTest < ActiveSupport::TestCase | ||
1446 | assert 3, original_person.memberships.count | 1433 | assert 3, original_person.memberships.count |
1447 | end | 1434 | end |
1448 | 1435 | ||
1436 | + should 'increase friends_count on new friendship' do | ||
1437 | + person = create_user('person').person | ||
1438 | + friend = create_user('friend').person | ||
1439 | + assert_difference person, :friends_count, 1 do | ||
1440 | + assert_difference friend, :friends_count, 1 do | ||
1441 | + person.add_friend(friend) | ||
1442 | + friend.reload | ||
1443 | + end | ||
1444 | + person.reload | ||
1445 | + end | ||
1446 | + end | ||
1447 | + | ||
1448 | + should 'decrease friends_count on friendship removal' do | ||
1449 | + person = create_user('person').person | ||
1450 | + friend = create_user('friend').person | ||
1451 | + person.add_friend(friend) | ||
1452 | + friend.reload | ||
1453 | + person.reload | ||
1454 | + assert_difference person, :friends_count, -1 do | ||
1455 | + assert_difference friend, :friends_count, -1 do | ||
1456 | + person.remove_friend(friend) | ||
1457 | + friend.reload | ||
1458 | + end | ||
1459 | + person.reload | ||
1460 | + end | ||
1461 | + end | ||
1449 | end | 1462 | end |
test/unit/profile_test.rb
@@ -1688,6 +1688,7 @@ class ProfileTest < ActiveSupport::TestCase | @@ -1688,6 +1688,7 @@ class ProfileTest < ActiveSupport::TestCase | ||
1688 | person = fast_create(Person) | 1688 | person = fast_create(Person) |
1689 | community = fast_create(Community) | 1689 | community = fast_create(Community) |
1690 | community.add_member(person) | 1690 | community.add_member(person) |
1691 | + community.reload | ||
1691 | 1692 | ||
1692 | assert_equal 1, community.members_count | 1693 | assert_equal 1, community.members_count |
1693 | end | 1694 | end |
@@ -1823,11 +1824,12 @@ class ProfileTest < ActiveSupport::TestCase | @@ -1823,11 +1824,12 @@ class ProfileTest < ActiveSupport::TestCase | ||
1823 | original_community.add_member(original_member) | 1824 | original_community.add_member(original_member) |
1824 | community1.add_member(plugin1_member) | 1825 | community1.add_member(plugin1_member) |
1825 | community2.add_member(plugin2_member) | 1826 | community2.add_member(plugin2_member) |
1827 | + original_community.reload | ||
1826 | 1828 | ||
1827 | assert_includes original_community.members, original_member | 1829 | assert_includes original_community.members, original_member |
1828 | assert_includes original_community.members, plugin1_member | 1830 | assert_includes original_community.members, plugin1_member |
1829 | assert_includes original_community.members, plugin2_member | 1831 | assert_includes original_community.members, plugin2_member |
1830 | - assert 3, original_community.members.count | 1832 | + assert 3, original_community.members_count |
1831 | end | 1833 | end |
1832 | 1834 | ||
1833 | private | 1835 | private |
@@ -0,0 +1,29 @@ | @@ -0,0 +1,29 @@ | ||
1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
2 | + | ||
3 | +class RoleAssignmentExtTest < ActiveSupport::TestCase | ||
4 | + should 'increase organization members_count only on the first role_assignment' do | ||
5 | + role1 = Role.create!(:name => 'role1') | ||
6 | + role2 = Role.create!(:name => 'role2') | ||
7 | + member = create_user('person').person | ||
8 | + organization = Organization.create!(:name => 'Organization', :identifier => 'organization') | ||
9 | + assert_difference organization, :members_count, 1 do | ||
10 | + RoleAssignment.create!(:accessor => member, :resource => organization, :role => role1) | ||
11 | + RoleAssignment.create!(:accessor => member, :resource => organization, :role => role2) | ||
12 | + organization.reload | ||
13 | + end | ||
14 | + end | ||
15 | + | ||
16 | + should 'decrease organization members_count only on the last role_assignment' do | ||
17 | + role1 = Role.create!(:name => 'role1') | ||
18 | + role2 = Role.create!(:name => 'role2') | ||
19 | + member = create_user('person').person | ||
20 | + organization = Organization.create!(:name => 'Organization', :identifier => 'organization') | ||
21 | + RoleAssignment.create!(:accessor => member, :resource => organization, :role => role1) | ||
22 | + RoleAssignment.create!(:accessor => member, :resource => organization, :role => role2) | ||
23 | + organization.reload | ||
24 | + assert_difference organization, :members_count, -1 do | ||
25 | + organization.role_assignments.destroy_all | ||
26 | + organization.reload | ||
27 | + end | ||
28 | + end | ||
29 | +end |
test/unit/task_mailer_test.rb
@@ -24,7 +24,7 @@ class TaskMailerTest < ActiveSupport::TestCase | @@ -24,7 +24,7 @@ class TaskMailerTest < ActiveSupport::TestCase | ||
24 | requestor.expects(:name).returns('my name') | 24 | requestor.expects(:name).returns('my name') |
25 | 25 | ||
26 | environment = mock() | 26 | environment = mock() |
27 | - environment.expects(:contact_email).returns('sender@example.com') | 27 | + environment.expects(:noreply_email).returns('sender@example.com') |
28 | environment.expects(:default_hostname).returns('example.com') | 28 | environment.expects(:default_hostname).returns('example.com') |
29 | environment.expects(:name).returns('example').at_least_once | 29 | environment.expects(:name).returns('example').at_least_once |
30 | 30 | ||
@@ -47,7 +47,7 @@ class TaskMailerTest < ActiveSupport::TestCase | @@ -47,7 +47,7 @@ class TaskMailerTest < ActiveSupport::TestCase | ||
47 | requestor.expects(:name).returns('my name') | 47 | requestor.expects(:name).returns('my name') |
48 | 48 | ||
49 | environment = mock() | 49 | environment = mock() |
50 | - environment.expects(:contact_email).returns('sender@example.com') | 50 | + environment.expects(:noreply_email).returns('sender@example.com') |
51 | environment.expects(:default_hostname).returns('example.com') | 51 | environment.expects(:default_hostname).returns('example.com') |
52 | environment.expects(:name).returns('example').at_least_once | 52 | environment.expects(:name).returns('example').at_least_once |
53 | 53 | ||
@@ -71,7 +71,7 @@ class TaskMailerTest < ActiveSupport::TestCase | @@ -71,7 +71,7 @@ class TaskMailerTest < ActiveSupport::TestCase | ||
71 | requestor.expects(:name).returns('my name') | 71 | requestor.expects(:name).returns('my name') |
72 | 72 | ||
73 | environment = mock() | 73 | environment = mock() |
74 | - environment.expects(:contact_email).returns('sender@example.com') | 74 | + environment.expects(:noreply_email).returns('sender@example.com') |
75 | environment.expects(:default_hostname).returns('example.com') | 75 | environment.expects(:default_hostname).returns('example.com') |
76 | environment.expects(:name).returns('example').at_least_once | 76 | environment.expects(:name).returns('example').at_least_once |
77 | 77 | ||
@@ -105,7 +105,7 @@ class TaskMailerTest < ActiveSupport::TestCase | @@ -105,7 +105,7 @@ class TaskMailerTest < ActiveSupport::TestCase | ||
105 | requestor.stubs(:public_profile_url).returns('requestor_path') | 105 | requestor.stubs(:public_profile_url).returns('requestor_path') |
106 | 106 | ||
107 | environment = mock() | 107 | environment = mock() |
108 | - environment.expects(:contact_email).returns('sender@example.com') | 108 | + environment.expects(:noreply_email).returns('sender@example.com') |
109 | environment.expects(:default_hostname).returns('example.com') | 109 | environment.expects(:default_hostname).returns('example.com') |
110 | environment.expects(:name).returns('example').at_least_once | 110 | environment.expects(:name).returns('example').at_least_once |
111 | 111 | ||
@@ -124,11 +124,11 @@ class TaskMailerTest < ActiveSupport::TestCase | @@ -124,11 +124,11 @@ class TaskMailerTest < ActiveSupport::TestCase | ||
124 | assert !ActionMailer::Base.deliveries.empty? | 124 | assert !ActionMailer::Base.deliveries.empty? |
125 | end | 125 | end |
126 | 126 | ||
127 | - should 'use environment name and contact email' do | 127 | + should 'use environment name and no-reply email' do |
128 | task = mock | 128 | task = mock |
129 | environment = mock | 129 | environment = mock |
130 | environment.expects(:name).returns('My name') | 130 | environment.expects(:name).returns('My name') |
131 | - environment.expects(:contact_email).returns('email@example.com') | 131 | + environment.expects(:noreply_email).returns('email@example.com') |
132 | 132 | ||
133 | task.expects(:environment).returns(environment).at_least_once | 133 | task.expects(:environment).returns(environment).at_least_once |
134 | 134 |
test/unit/theme_test.rb
@@ -191,4 +191,22 @@ class ThemeTest < ActiveSupport::TestCase | @@ -191,4 +191,22 @@ class ThemeTest < ActiveSupport::TestCase | ||
191 | assert ! Theme.new('test').public | 191 | assert ! Theme.new('test').public |
192 | end | 192 | end |
193 | 193 | ||
194 | + should 'not crash with nil or invalid owner_type' do | ||
195 | + profile = fast_create(Profile) | ||
196 | + Theme.stubs(:system_themes_dir).returns(TMP_THEMES_DIR) | ||
197 | + | ||
198 | + t1 = Theme.new('t1').save | ||
199 | + t1.send(:write_config) | ||
200 | + t2 = Theme.new('t2', {:owner_type => nil}).save | ||
201 | + t2.send(:write_config) | ||
202 | + t3 = Theme.new('t3', {:owner_type => 'InvalidClass'}).save | ||
203 | + t3.send(:write_config) | ||
204 | + | ||
205 | + assert_nothing_raised do | ||
206 | + themes = Theme.approved_themes(profile) | ||
207 | + assert_not_includes themes, t1 | ||
208 | + assert_not_includes themes, t2 | ||
209 | + assert_not_includes themes, t3 | ||
210 | + end | ||
211 | + end | ||
194 | end | 212 | end |
test/unit/uploaded_file_test.rb
@@ -31,6 +31,13 @@ class UploadedFileTest < ActiveSupport::TestCase | @@ -31,6 +31,13 @@ class UploadedFileTest < ActiveSupport::TestCase | ||
31 | assert_equal 'test.txt', file.name | 31 | assert_equal 'test.txt', file.name |
32 | end | 32 | end |
33 | 33 | ||
34 | + should 'not set filename on name if name is already set' do | ||
35 | + file = UploadedFile.new | ||
36 | + file.name = "Some name" | ||
37 | + file.filename = 'test.txt' | ||
38 | + assert_equal 'Some name', file.name | ||
39 | + end | ||
40 | + | ||
34 | should 'provide file content as data' do | 41 | should 'provide file content as data' do |
35 | file = UploadedFile.new | 42 | file = UploadedFile.new |
36 | file.expects(:full_filename).returns('myfilename') | 43 | file.expects(:full_filename).returns('myfilename') |
@@ -119,24 +126,13 @@ class UploadedFileTest < ActiveSupport::TestCase | @@ -119,24 +126,13 @@ class UploadedFileTest < ActiveSupport::TestCase | ||
119 | assert_equal 'my title', UploadedFile.new(:title => 'my title').title | 126 | assert_equal 'my title', UploadedFile.new(:title => 'my title').title |
120 | end | 127 | end |
121 | 128 | ||
122 | - should 'limit title to 140 characters' do | ||
123 | - upload = UploadedFile.new | ||
124 | - | ||
125 | - upload.title = '+' * 61; upload.valid? | ||
126 | - assert upload.errors[:title] | ||
127 | - | ||
128 | - upload.title = '+' * 60; upload.valid? | ||
129 | - assert !upload.errors[:title] | ||
130 | - | ||
131 | - end | ||
132 | - | ||
133 | should 'always provide a display title' do | 129 | should 'always provide a display title' do |
134 | upload = UploadedFile.new(:uploaded_data => fixture_file_upload('/files/test.txt', 'text/plain')) | 130 | upload = UploadedFile.new(:uploaded_data => fixture_file_upload('/files/test.txt', 'text/plain')) |
135 | - assert_equal 'test.txt', upload.display_title | 131 | + assert_equal 'test.txt', upload.title |
136 | upload.title = 'My text file' | 132 | upload.title = 'My text file' |
137 | - assert_equal 'My text file', upload.display_title | 133 | + assert_equal 'My text file', upload.title |
138 | upload.title = '' | 134 | upload.title = '' |
139 | - assert_equal 'test.txt', upload.display_title | 135 | + assert_equal 'test.txt', upload.title |
140 | end | 136 | end |
141 | 137 | ||
142 | should 'use name as title by default' do | 138 | should 'use name as title by default' do |
@@ -326,13 +322,15 @@ class UploadedFileTest < ActiveSupport::TestCase | @@ -326,13 +322,15 @@ class UploadedFileTest < ActiveSupport::TestCase | ||
326 | end | 322 | end |
327 | 323 | ||
328 | should 'group trackers activity of image\'s upload' do | 324 | should 'group trackers activity of image\'s upload' do |
325 | + ActionTracker::Record.delete_all | ||
329 | gallery = fast_create(Gallery, :profile_id => profile.id) | 326 | gallery = fast_create(Gallery, :profile_id => profile.id) |
330 | - | 327 | + count = ActionTracker::Record.find_all_by_verb('upload_image').count |
331 | image1 = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :parent => gallery, :profile => profile) | 328 | image1 = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :parent => gallery, :profile => profile) |
332 | - assert_equal 1, ActionTracker::Record.find_all_by_verb('upload_image').count | 329 | + count += 1 |
330 | + assert_equal count, ActionTracker::Record.find_all_by_verb('upload_image').count | ||
333 | 331 | ||
334 | image2 = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/other-pic.jpg', 'image/jpg'), :parent => gallery, :profile => profile) | 332 | image2 = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/other-pic.jpg', 'image/jpg'), :parent => gallery, :profile => profile) |
335 | - assert_equal 1, ActionTracker::Record.find_all_by_verb('upload_image').count | 333 | + assert_equal count, ActionTracker::Record.find_all_by_verb('upload_image').count |
336 | end | 334 | end |
337 | 335 | ||
338 | { | 336 | { |
vendor/plugins/action_tracker/lib/action_tracker_model.rb
vendor/plugins/monkey_patches/rescue_delayed_job_crashes/init.rb
@@ -5,8 +5,8 @@ Delayed::Worker.module_eval do | @@ -5,8 +5,8 @@ Delayed::Worker.module_eval do | ||
5 | environment = Environment.default | 5 | environment = Environment.default |
6 | 6 | ||
7 | recipients NOOSFERO_CONF['exception_recipients'] | 7 | recipients NOOSFERO_CONF['exception_recipients'] |
8 | - from environment.contact_email | ||
9 | - reply_to environment.contact_email | 8 | + from environment.noreply_email |
9 | + reply_to environment.noreply_email | ||
10 | subject "[#{environment.name}] DelayedJob ##{job.id}: #{error.message}" | 10 | subject "[#{environment.name}] DelayedJob ##{job.id}: #{error.message}" |
11 | body render(:text => " | 11 | body render(:text => " |
12 | Job: | 12 | Job: |