sobjects/notification.py
changeset 9481 7e35d62c67a9
parent 9387 f31f0c8bda4f
child 9765 5607ef9ab9f5
equal deleted inserted replaced
9480:14159c600dad 9481:7e35d62c67a9
    28 
    28 
    29 from cubicweb.entity import Entity
    29 from cubicweb.entity import Entity
    30 from cubicweb.view import Component, EntityView
    30 from cubicweb.view import Component, EntityView
    31 from cubicweb.server.hook import SendMailOp
    31 from cubicweb.server.hook import SendMailOp
    32 from cubicweb.mail import construct_message_id, format_mail
    32 from cubicweb.mail import construct_message_id, format_mail
    33 from cubicweb.server.session import Session
    33 from cubicweb.server.session import Session, InternalManager
    34 
    34 
    35 
    35 
    36 class RecipientsFinder(Component):
    36 class RecipientsFinder(Component):
    37     """this component is responsible to find recipients of a notification
    37     """this component is responsible to find recipients of a notification
    38 
    38 
   113         else:
   113         else:
   114             refs = ()
   114             refs = ()
   115             msgid = None
   115             msgid = None
   116         req = self._cw
   116         req = self._cw
   117         self.user_data = req.user_data()
   117         self.user_data = req.user_data()
   118         origlang = req.lang
       
   119         for something in recipients:
   118         for something in recipients:
   120             if isinstance(something, Entity):
   119             if isinstance(something, tuple):
   121                 # hi-jack self._cw to get a session for the returned user
   120                 emailaddr, lang = something
   122                 self._cw = Session(something, self._cw.repo)
   121                 user = InternalManager(lang=lang)
       
   122             else:
       
   123                 emailaddr = something.cw_adapt_to('IEmailable').get_email()
       
   124                 user = something
       
   125             # hi-jack self._cw to get a session for the returned user
       
   126             self._cw = Session(user, self._cw.repo)
       
   127             try:
   123                 self._cw.set_cnxset()
   128                 self._cw.set_cnxset()
   124                 emailaddr = something.cw_adapt_to('IEmailable').get_email()
   129                 # since the same view (eg self) may be called multiple time and we
   125             else:
   130                 # need a fresh stream at each iteration, reset it explicitly
   126                 emailaddr, lang = something
   131                 self.w = None
   127                 self._cw.set_language(lang)
       
   128             # since the same view (eg self) may be called multiple time and we
       
   129             # need a fresh stream at each iteration, reset it explicitly
       
   130             self.w = None
       
   131             try:
       
   132                 # XXX call render before subject to set .row/.col attributes on the
   132                 # XXX call render before subject to set .row/.col attributes on the
   133                 #     view
   133                 #     view
   134                 try:
   134                 try:
   135                     content = self.render(row=0, col=0, **kwargs)
   135                     content = self.render(row=0, col=0, **kwargs)
   136                     subject = self.subject()
   136                     subject = self.subject()
   143                     self.exception(str(ex))
   143                     self.exception(str(ex))
   144                     continue
   144                     continue
   145                 msg = format_mail(self.user_data, [emailaddr], content, subject,
   145                 msg = format_mail(self.user_data, [emailaddr], content, subject,
   146                                   config=self._cw.vreg.config, msgid=msgid, references=refs)
   146                                   config=self._cw.vreg.config, msgid=msgid, references=refs)
   147                 yield [emailaddr], msg
   147                 yield [emailaddr], msg
   148             except:
       
   149                 if isinstance(something, Entity):
       
   150                     self._cw.rollback()
       
   151                 raise
       
   152             else:
       
   153                 if isinstance(something, Entity):
       
   154                     self._cw.commit()
       
   155             finally:
   148             finally:
   156                 if isinstance(something, Entity):
   149                 self._cw.commit()
   157                     self._cw.close()
   150                 self._cw.close()
   158                     self._cw = req
   151                 self._cw = req
   159         # restore language
       
   160         req.set_language(origlang)
       
   161 
   152 
   162     # recipients / email sending ###############################################
   153     # recipients / email sending ###############################################
   163 
   154 
   164     def recipients(self):
   155     def recipients(self):
   165         """return a list of either 2-uple (email, language) or user entity to
   156         """return a list of either 2-uple (email, language) or user entity to
   166         who this email should be sent
   157         whom this email should be sent
   167         """
   158         """
   168         finder = self._cw.vreg['components'].select(
   159         finder = self._cw.vreg['components'].select(
   169             'recipients_finder', self._cw, rset=self.cw_rset,
   160             'recipients_finder', self._cw, rset=self.cw_rset,
   170             row=self.cw_row or 0, col=self.cw_col or 0)
   161             row=self.cw_row or 0, col=self.cw_col or 0)
   171         return finder.recipients()
   162         return finder.recipients()