state = property(lambda s: s.data.state, set_state)
- @property
+ @lazy_property
def author(self):
- return self.data.author
+ return self.backend.users.find_maintainer(self.data.author) or self.data.author
- @property
+ @lazy_property
def committer(self):
- return self.data.committer
+ return self.backend.users.find_maintainer(self.data.committer) or self.data.committer
@property
def subject(self):
return values
+ @lazy_property
+ def contributors(self):
+ contributors = [
+ self.data.author,
+ self.data.committer,
+ ]
+
+ for tag in ("Acked-by", "Cc", "Reported-by", "Reviewed-by", "Signed-off-by", "Suggested-by", "Tested-by"):
+ contributors += self.get_tag(tag)
+
+ # Get all user accounts that we know
+ users = self.backend.users.find_maintainers(contributors)
+
+ # Add all email addresses where a user could not be found
+ for contributor in contributors[:]:
+ for user in users:
+ if user.has_email_address(contributor):
+ try:
+ contributors.remove(contributor)
+ except:
+ pass
+
+ return sorted(contributors + users)
+
@property
def date(self):
return self.data.date
LEFT JOIN users_emails ON users.id = users_emails.user_id \
WHERE users_emails.email = %s", email)
+ def find_maintainers(self, maintainers):
+ email_addresses = []
+
+ # Make a unique list of all email addresses
+ for maintainer in maintainers:
+ name, email_address = email.utils.parseaddr(maintainer)
+
+ if not email_address in email_addresses:
+ email_addresses.append(email_address)
+
+ users = self._get_users("SELECT DISTINCT users.* FROM users \
+ LEFT JOIN users_emails ON users.id = users_emails.user_id \
+ WHERE users_emails.activated IS TRUE \
+ AND users_emails.email = ANY(%s)", email_addresses)
+
+ return sorted(users)
+
def find_maintainer(self, s):
name, email_address = email.utils.parseaddr(s)
WHERE user_id = %s AND email = %s AND activated IS TRUE",
self.id, email)
+ def has_email_address(self, email_address):
+ try:
+ mail, email_address = email.utils.parseaddr(email_address)
+ except:
+ pass
+
+ return email_address in self.emails
+
def activate_email(self, code):
# Search email by activation code
email = self.backend.users._get_user_email("SELECT * FROM users_emails \