Skip to content

Commit 9310541

Browse files
committed
Simplify getting emails etc
1 parent 2544b39 commit 9310541

5 files changed

Lines changed: 52 additions & 84 deletions

File tree

lib/whimsy/asf/mail.rb

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,44 +3,44 @@
33
module ASF
44
# Convenience functions related to emails or mailing lists.
55
class Mail
6-
# return a Hash containing complete list of all known emails, and the
7-
# ASF::Person that is associated with that email.
8-
def self.list
9-
begin
10-
return @list.to_h if @list
11-
rescue NoMethodError, WeakRef::RefError
12-
end
13-
14-
list = {}
15-
16-
# load info from LDAP
17-
people = ASF::Person.preload(['mail', 'asf-altEmail'])
18-
people.each do |person|
19-
(person.mail + person.alt_email).each do |mail|
20-
list[mail.downcase] = person
21-
end
22-
end
236

24-
# load all member emails in one pass
25-
ASF::Member.each do |id, text|
26-
Member.emails(text).each do |mail|
27-
list[mail.downcase] ||= Person.find(id)
28-
end
7+
# return a list of people ids, their public-name, whether they are an ASF member, and email addresses
8+
def self.people_mails
9+
member_statuses = ASF::Member.member_statuses # cache the statuses. TODO: should be done in ASF.Member
10+
people = ASF::Person.preload(['cn', 'mail','asf-altEmail'])
11+
result = people.sort_by(&:id).map do |person|
12+
id = person.id
13+
mails = person.mail + person.alt_email + ["#{id}@apache.org"]
14+
entry = {
15+
id: id,
16+
name: person.public_name,
17+
mail: mails.map{|m| m.downcase}.uniq,
18+
}
19+
entry[:member] = true if member_statuses[id]
20+
entry
2921
end
22+
result
23+
end
3024

31-
# load all ICLA emails in one pass
32-
ASF::ICLA.each do |icla|
33-
person = Person.find(icla.id)
34-
icla.emails.each do |email|
35-
list[email.downcase] ||= person
36-
end
37-
next if icla.noId?
38-
39-
list["#{icla.id.downcase}@apache.org"] ||= person
25+
# return a list of people ids, their public-name, whether they are an ASF member, and email addresses
26+
# Also return GH settings
27+
# @param extra_mails additional emails derived from members and iclas
28+
def self.people_mails_github(extra_mails)
29+
member_statuses = ASF::Member.member_statuses # cache the statuses. TODO: should be done in ASF.Member
30+
people = ASF::Person.preload(['cn', 'mail','asf-altEmail','githubUsername', 'asf-githubStringID'])
31+
result = people.sort_by(&:id).map do |person|
32+
id = person.id
33+
mails = person.mail + person.alt_email + extra_mails.fetch(id, []) + ["#{id}@apache.org"]
34+
{
35+
id: id,
36+
name: person.public_name,
37+
mail: mails.map{|m| m.downcase}.uniq,
38+
githubUsername: person.attrs['githubUsername'] || [],
39+
asf_githubStringID: person.attrs['asf-githubStringID']&.first || '',
40+
asf_member_status: member_statuses[person.id],
41+
}
4042
end
41-
42-
@list = WeakRef.new(list)
43-
list
43+
result
4444
end
4545

4646
# list of mailing lists that aren't actively seeking new subscribers

www/roster/main.rb

Lines changed: 15 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -133,20 +133,7 @@ def appmtime
133133
index = nil if not index_time or Time.now-index_time >= 300
134134

135135
if not index
136-
# bulk loading the mail information makes things go faster
137-
mail = Hash[ASF::Mail.list.group_by(&:last).
138-
map {|person, list| [person, list.map(&:first)]}]
139-
140-
ASF::Person.preload(['id','name','mail','githubUsername','asf-githubStringID'])
141-
member_statuses = ASF::Member.member_statuses
142-
# build a list of people, their public-names, and email addresses
143-
index = ASF::Person.list.sort_by(&:id).map {|person|
144-
result = {id: person.id, name: person.public_name, mail: mail[person],
145-
githubUsername: person.attrs['githubUsername'] || [],
146-
asf_githubStringID: person.attrs['asf-githubStringID']&.first || ''}
147-
result[:asf_member_status] = member_statuses[person.id]
148-
result
149-
}.to_json
136+
index = ASF::Mail.people_mails_github({}).to_json
150137

151138
# cache
152139
index_time = Time.now
@@ -183,21 +170,21 @@ def appmtime
183170
index2 = nil if not index2_time or Time.now-index2_time >= 300
184171

185172
if not index2
186-
# bulk loading the mail information makes things go faster
187-
mail = Hash[ASF::Mail.list.group_by(&:last).
188-
map {|person, list| [person, list.map(&:first)]}]
189-
190-
ASF::Person.preload(['id','name','mail','githubUsername', 'asf-githubStringID'])
191-
member_statuses = ASF::Member.member_statuses
192-
# build a list of people, their public-names, and email addresses
193-
tmp = ASF::Person.list.sort_by(&:id).map {|person|
194-
result = {id: person.id, name: person.public_name, mail: mail[person],
195-
githubUsername: person.attrs['githubUsername'] || [],
196-
asf_githubStringID: person.attrs['asf-githubStringID']&.first || ''}
197-
result[:asf_member_status] = member_statuses[person.id]
198-
result
199-
}
173+
extra_mails = Hash.new{|h,k| h[k] = Array.new}
174+
ASF::Member.list_entries([:email]).each do |status, _name, id, _lines, keys|
175+
unless id.nil?
176+
extra_mails[id] = keys[:email]
177+
end
178+
end
179+
180+
# load all ICLA emails in one pass
181+
ASF::ICLA.each do |icla|
182+
extra_mails[icla.id].concat icla.emails
183+
end
200184

185+
tmp = ASF::Mail.people_mails_github(extra_mails)
186+
187+
# Add ICLA details
201188
ASF::ICLA.each {|icla|
202189
if icla.noId?
203190
if @auth[:secretary]

www/roster/models/committee.rb

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -224,15 +224,9 @@ def self.load_emails
224224
@people = nil if not @people_time or Time.now-@people_time >= 300
225225

226226
unless @people
227-
# bulk loading the mail information makes things go faster
228-
mail = ASF::Mail.list.group_by(&:last).transform_values {|list| list.map(&:first)}
229227

230228
# build a list of people, their public-names, and email addresses
231-
@people = ASF::Person.list.map {|person|
232-
result = {id: person.id, name: person.public_name, mail: mail[person]}
233-
result[:member] = true if person.asf_member?
234-
result
235-
}
229+
@people = ASF::Mail.people_mails
236230

237231
# cache
238232
@people_time = Time.now

www/roster/models/nonpmc.rb

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -189,15 +189,9 @@ def self.load_emails
189189
@people = nil if not @people_time or Time.now-@people_time >= 300
190190

191191
unless @people
192-
# bulk loading the mail information makes things go faster
193-
mail = ASF::Mail.list.group_by(&:last).transform_values {|list| list.map(&:first)}
194192

195193
# build a list of people, their public-names, and email addresses
196-
@people = ASF::Person.list.map {|person|
197-
result = {id: person.id, name: person.public_name, mail: mail[person]}
198-
result[:member] = true if person.asf_member?
199-
result
200-
}
194+
@people = ASF::Mail.people_mails
201195

202196
# cache
203197
@people_time = Time.now

www/roster/models/ppmc.rb

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -194,16 +194,9 @@ def self.load_emails
194194
@people = nil if not @people_time or Time.now - @people_time >= 300
195195

196196
unless @people
197-
# bulk loading the mail information makes things go faster
198-
# TODO: it is still expensive
199-
mail = ASF::Mail.list.group_by(&:last).transform_values {|list| list.map(&:first)}
200197

201198
# build a list of people, their public-names, and email addresses
202-
@people = ASF::Person.list.map {|person|
203-
result = {id: person.id, name: person.public_name, mail: mail[person]}
204-
result[:member] = true if person.asf_member?
205-
result
206-
}
199+
@people = ASF::Mail.people_mails
207200

208201
# cache
209202
@people_time = Time.now

0 commit comments

Comments
 (0)