invitation.rb
4.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
class Invitation < Task
settings_items :message, :friend_name, :friend_email
validates_presence_of :requestor_id
validates_presence_of :target_id, :if => Proc.new{|invite| invite.friend_email.blank?}
validates_presence_of :friend_email, :if => Proc.new{|invite| invite.target_id.blank?}
validates_format_of :friend_email, :with => Noosfero::Constants::EMAIL_FORMAT, :if => Proc.new{|invite| invite.target_id.blank?}
validates_presence_of :message, :if => Proc.new{|invite| invite.target_id.blank?}
validate :not_invite_yourself
alias :person :requestor
alias :person= :requestor=
alias :friend :target
alias :friend= :target=
before_create do |task|
if task.message && !task.message.match(/<url>/)
task.message += Invitation.default_message_to_accept_invitation
end
end
after_create do |task|
TaskMailer.invitation_notification(task).deliver unless task.friend
end
def title
_('Invitation')
end
def not_invite_yourself
email = friend ? friend.user.email : friend_email
if person && email && person.user.email == email
self.errors.add(:base, _("You can't invite youself"))
end
end
# Returns <tt>false</tt>. Adding friends by itself does not trigger e-mail
# sending.
def sends_email?
false
end
def self.invite(person, contacts_to_invite, message, profile)
contacts_to_invite.each do |contact_to_invite|
next if contact_to_invite == _("Firstname Lastname <friend@email.com>")
contact_to_invite.strip!
find_by_profile_id = false
if contact_to_invite.match(/^\d*$/)
find_by_profile_id = true
elsif match = contact_to_invite.match(/(.*)<(.*)>/) and match[2].match(Noosfero::Constants::EMAIL_FORMAT)
friend_name = match[1].strip
friend_email = match[2]
elsif match = contact_to_invite.strip.match(Noosfero::Constants::EMAIL_FORMAT)
friend_name = ""
friend_email = match[0]
else
next
end
begin
user = find_by_profile_id ? Person.find_by_id(contact_to_invite).user : User.find_by_email(friend_email)
rescue
user = nil
end
task_args = if user.nil? && !find_by_profile_id
{:person => person, :friend_name => friend_name, :friend_email => friend_email, :message => message}
elsif user.present? && !(user.person.is_a_friend?(person) && profile.person?)
{:person => person, :target => user.person}
end
if profile.person?
InviteFriend.create(task_args) if user.nil? || !user.person.is_a_friend?(person)
elsif profile.community?
InviteMember.create(task_args.merge(:community_id => profile.id)) if user.nil? || !user.person.is_member_of?(profile)
else
raise NotImplementedError, 'Don\'t know how to invite people to a %s' % profile.class.to_s
end
end
end
def self.get_contacts(source, login, password, contact_list_id)
contact_list = ContactList.find(contact_list_id)
case source
when "gmail"
email_service = Contacts::Gmail.new(login, password)
when "yahoo"
email_service = Contacts::Yahoo.new(login, password)
when "hotmail"
email_service = Contacts::Hotmail.new(login, password)
when "manual"
#do nothing
else
raise NotImplementedError, 'Unknown source to get contacts'
end
if email_service
contact_list.list = email_service.contacts.map { |contact| contact + ["#{contact[0]} <#{contact[1]}>"] }
contact_list.fetched = true
contact_list.save
end
contact_list.list
end
def self.join_contacts(manual_import_addresses, webmail_import_addresses)
contacts = []
if manual_import_addresses
contacts += manual_import_addresses.is_a?(Array) ? manual_import_addresses : manual_import_addresses.split
end
if webmail_import_addresses
contacts += webmail_import_addresses.is_a?(Array) ? webmail_import_addresses : webmail_import_addresses.split
end
contacts
end
def expanded_message
msg = message
msg = msg.gsub /<user>/, person.name
msg = msg.gsub /<friend>/, friend_name.blank? ? friend_email : friend_name
msg = msg.gsub /<environment>/, person.environment.name
msg
end
def mail_template
raise 'You should implement mail_template in a subclass'
end
def self.default_message_to_accept_invitation
"\n\n" + _('To accept invitation, please follow this link: <url>')
end
def environment
self.requestor.environment
end
end