+ @property
+ def emails(self):
+ res = self.db.query("SELECT email FROM users_emails \
+ WHERE user_id = %s AND activated IS TRUE ORDER BY email", self.id)
+
+ return (row.email for row in res)
+
+ def get_email_activation_code(self, email):
+ return self.db.query("SELECT activation_code FROM users_emails WHERE user_id = %s AND \
+ email = %s", self.id, email)
+
+ # XXX We need to check if the email is already activated
+ def activate_email(self, code):
+ if self.db.query("SELECT * FROM users_emails WHERE user_id = %s AND \
+ activation_code = %s AND activated = FALSE", self.id, code):
+ # We activate the email and the user to
+ self.db.execute("UPDATE users_emails SET activated = TRUE \
+ WHERE user_id = %s AND activation_code = NULL", self.id)
+ self.activate()
+
+ def has_email_address(self):
+ emails = self.db.query("SELECT * FROM users_emails WHERE user_id = %s", self.id)
+
+ if not emails:
+ return False
+
+ return True
+
+ # Te activated flag is useful for LDAP users
+ def add_email(self, email, activated=False):
+ # Check if the email is in use
+ if self.users.email_is_used(email):
+ raise ValueError("Email %s is already in use" % email)
+
+ activation_code = None
+ if not activated:
+ activation_code = generate_random_string(64)
+
+ if not self.user.has_email_address():
+ # The user has no email address in the moment do we can safely guess that he has new
+ # registered
+ self.db.execute("INSERT INTO users_emails(user_id, email, \
+ 'primary', activation_code, activated) VALUES(%s, %s, TRUE, %s, %s)",
+ self.id, email, activation_code, activated)
+ self.send_activation_mail()
+ return
+
+ # Add just another email address.
+ self.db.execute("INSERT INTO users_emails(user_id, email, 'primary') \
+ VALUES(%s, %s, FALSE, %s)", id, email, activation_code, activated)
+ self.send_email_activation_mail(email)
+ return