81
83
SEEN_LOGINS = set()
86
def assert_is_valid_email(email):
87
if not email or not re.search('.+?@.+?\..+?', email):
88
msg = "invalid email address '%s'" % (email)
83
92
# Recurse members_details to return a list of (final)users as a tuples:
84
93
# (login, full_name, email, ssh_keys, openid)
85
94
def get_all_users(members_details, team_name):
87
96
for detail in members_details:
90
97
# detail.self_link ==
91
98
# 'https://api.launchpad.net/1.0/~team/+member/${username}'
92
99
login = detail.self_link.split('/')[-1]
99
106
# Avoid re-visiting SEEN_LOGINS
100
107
if login in SEEN_LOGINS:
102
SEEN_LOGINS.add(login)
108
print ("'%s' details already identified - skipping alternate" %
103
112
print '{}-entry: {}/{}'.format('T' if member.is_team else 'U', team_name, login)
105
114
# If is_team recurse down(branch), else add this user details(leaf) to users
106
115
if member.is_team:
108
117
users.extend(get_all_users(member.members_details, "{}/{}".format(team_name, member.name)))
109
except Unauthorized as e:
110
119
print "WARN: skipping team={}/{} (Unauthorized)".format(team_name, member.name)
113
122
openid = get_openid(login)
114
123
full_name = member.display_name.encode('ascii', 'replace')
125
errmsg = ("failed to get valid email address for '%s' (%s) - "
117
128
email = member.preferred_email_address.email
129
assert_is_valid_email(email)
130
except Exception as exc:
131
print (errmsg % (login, str(exc)))
134
# Do catchall just in case an exception is raised that does not
136
print (errmsg % (login, 'no exception info available'))
121
139
ssh_keys = tuple(
122
140
"{} {} {}".format(get_type(key.keytype), key.keytext, key.comment).strip()
123
141
for key in member.sshkeys
125
143
users.append((login, full_name, email, ssh_keys, openid),)
145
# Only remember login if it was actually used.
146
SEEN_LOGINS.add(login)
126
148
# Return a list with user details tuple