diff -r e7e1bb06b716 -r 873202e181bb common/mail.py --- a/common/mail.py Tue Sep 08 10:46:47 2009 +0200 +++ b/common/mail.py Tue Sep 08 15:37:46 2009 +0200 @@ -21,6 +21,7 @@ return 'XXX' from cubicweb.view import EntityView +from cubicweb.entity import Entity def header(ustring): return Header(ustring.encode('UTF-8'), 'UTF-8') @@ -183,18 +184,12 @@ return construct_message_id(self.config.appid, eid, self.msgid_timestamp) def render_emails(self, **kwargs): - """generate and send an email message for this view""" + """generate and send emails for this view (one per recipient)""" self._kwargs = kwargs recipients = self.recipients() if not recipients: self.info('skipping %s notification, no recipients', self.id) return - if not isinstance(recipients[0], tuple): - from warnings import warn - warn('recipients should now return a list of 2-uple (email, language)', - DeprecationWarning, stacklevel=1) - lang = self.vreg.property_value('ui.language') - recipients = zip(recipients, repeat(lang)) if self.rset is not None: entity = self.entity(self.row or 0, self.col or 0) # if the view is using timestamp in message ids, no way to reference @@ -208,22 +203,32 @@ else: refs = () msgid = None - userdata = self.req.user_data() - origlang = self.req.lang - for emailaddr, lang in recipients: - self.req.set_language(lang) + req = self.req + self.user_data = req.user_data() + origlang = req.lang + for something in recipients: + if isinstance(something, Entity): + # hi-jack self.req to get a session for the returned user + self.req = self.req.hijack_user(something) + emailaddr = something.get_email() + else: + emailaddr, lang = something + self.req.set_language(lang) # since the same view (eg self) may be called multiple time and we # need a fresh stream at each iteration, reset it explicitly self.w = None # XXX call render before subject to set .row/.col attributes on the # view - content = self.render(row=0, col=0, **kwargs) - subject = self.subject() - msg = format_mail(userdata, [emailaddr], content, subject, + try: + content = self.render(row=0, col=0, **kwargs) + subject = self.subject() + except SkipEmail: + continue + msg = format_mail(self.user_data, [emailaddr], content, subject, config=self.config, msgid=msgid, references=refs) yield [emailaddr], msg # restore language - self.req.set_language(origlang) + req.set_language(origlang) def render_and_send(self, **kwargs): """generate and send an email message for this view"""