# HG changeset patch # User Julien Cristau # Date 1387277446 -3600 # Node ID 7e35d62c67a918ec873337e4c610eb23945b7ef2 # Parent 14159c600dad3ac245ae618f9d966a0ed3da7c3f [notification] use an InternalManager object for notifications if we have an (email, lang) tuple The non-uniform handling of CWUser vs (email, lang) tuple has caused too many bugs; this change mostly unifies the two code paths. Closes #3381521 diff -r 14159c600dad -r 7e35d62c67a9 sobjects/notification.py --- a/sobjects/notification.py Tue Dec 17 11:50:31 2013 +0100 +++ b/sobjects/notification.py Tue Dec 17 11:50:46 2013 +0100 @@ -30,7 +30,7 @@ from cubicweb.view import Component, EntityView from cubicweb.server.hook import SendMailOp from cubicweb.mail import construct_message_id, format_mail -from cubicweb.server.session import Session +from cubicweb.server.session import Session, InternalManager class RecipientsFinder(Component): @@ -115,20 +115,20 @@ msgid = None req = self._cw self.user_data = req.user_data() - origlang = req.lang for something in recipients: - if isinstance(something, Entity): - # hi-jack self._cw to get a session for the returned user - self._cw = Session(something, self._cw.repo) - self._cw.set_cnxset() + if isinstance(something, tuple): + emailaddr, lang = something + user = InternalManager(lang=lang) + else: emailaddr = something.cw_adapt_to('IEmailable').get_email() - else: - emailaddr, lang = something - self._cw.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 + user = something + # hi-jack self._cw to get a session for the returned user + self._cw = Session(user, self._cw.repo) try: + self._cw.set_cnxset() + # 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 try: @@ -145,25 +145,16 @@ msg = format_mail(self.user_data, [emailaddr], content, subject, config=self._cw.vreg.config, msgid=msgid, references=refs) yield [emailaddr], msg - except: - if isinstance(something, Entity): - self._cw.rollback() - raise - else: - if isinstance(something, Entity): - self._cw.commit() finally: - if isinstance(something, Entity): - self._cw.close() - self._cw = req - # restore language - req.set_language(origlang) + self._cw.commit() + self._cw.close() + self._cw = req # recipients / email sending ############################################### def recipients(self): """return a list of either 2-uple (email, language) or user entity to - who this email should be sent + whom this email should be sent """ finder = self._cw.vreg['components'].select( 'recipients_finder', self._cw, rset=self.cw_rset,