common/mail.py
branchstable
changeset 3112 873202e181bb
parent 2879 ae26a80c0635
child 3113 169bbf0b8dec
equal deleted inserted replaced
3109:e7e1bb06b716 3112:873202e181bb
    19 except ImportError:
    19 except ImportError:
    20     def gethostname(): # gae
    20     def gethostname(): # gae
    21         return 'XXX'
    21         return 'XXX'
    22 
    22 
    23 from cubicweb.view import EntityView
    23 from cubicweb.view import EntityView
       
    24 from cubicweb.entity import Entity
    24 
    25 
    25 def header(ustring):
    26 def header(ustring):
    26     return Header(ustring.encode('UTF-8'), 'UTF-8')
    27     return Header(ustring.encode('UTF-8'), 'UTF-8')
    27 
    28 
    28 def addrheader(uaddr, uname=None):
    29 def addrheader(uaddr, uname=None):
   181 
   182 
   182     def construct_message_id(self, eid):
   183     def construct_message_id(self, eid):
   183         return construct_message_id(self.config.appid, eid, self.msgid_timestamp)
   184         return construct_message_id(self.config.appid, eid, self.msgid_timestamp)
   184 
   185 
   185     def render_emails(self, **kwargs):
   186     def render_emails(self, **kwargs):
   186         """generate and send an email message for this view"""
   187         """generate and send emails for this view (one per recipient)"""
   187         self._kwargs = kwargs
   188         self._kwargs = kwargs
   188         recipients = self.recipients()
   189         recipients = self.recipients()
   189         if not recipients:
   190         if not recipients:
   190             self.info('skipping %s notification, no recipients', self.id)
   191             self.info('skipping %s notification, no recipients', self.id)
   191             return
   192             return
   192         if not isinstance(recipients[0], tuple):
       
   193             from warnings import warn
       
   194             warn('recipients should now return a list of 2-uple (email, language)',
       
   195                  DeprecationWarning, stacklevel=1)
       
   196             lang = self.vreg.property_value('ui.language')
       
   197             recipients = zip(recipients, repeat(lang))
       
   198         if self.rset is not None:
   193         if self.rset is not None:
   199             entity = self.entity(self.row or 0, self.col or 0)
   194             entity = self.entity(self.row or 0, self.col or 0)
   200             # if the view is using timestamp in message ids, no way to reference
   195             # if the view is using timestamp in message ids, no way to reference
   201             # previous email
   196             # previous email
   202             if not self.msgid_timestamp:
   197             if not self.msgid_timestamp:
   206                 refs = ()
   201                 refs = ()
   207             msgid = self.construct_message_id(entity.eid)
   202             msgid = self.construct_message_id(entity.eid)
   208         else:
   203         else:
   209             refs = ()
   204             refs = ()
   210             msgid = None
   205             msgid = None
   211         userdata = self.req.user_data()
   206         req = self.req
   212         origlang = self.req.lang
   207         self.user_data = req.user_data()
   213         for emailaddr, lang in recipients:
   208         origlang = req.lang
   214             self.req.set_language(lang)
   209         for something in recipients:
       
   210             if isinstance(something, Entity):
       
   211                 # hi-jack self.req to get a session for the returned user
       
   212                 self.req = self.req.hijack_user(something)
       
   213                 emailaddr = something.get_email()
       
   214             else:
       
   215                 emailaddr, lang = something
       
   216                 self.req.set_language(lang)
   215             # since the same view (eg self) may be called multiple time and we
   217             # since the same view (eg self) may be called multiple time and we
   216             # need a fresh stream at each iteration, reset it explicitly
   218             # need a fresh stream at each iteration, reset it explicitly
   217             self.w = None
   219             self.w = None
   218             # XXX call render before subject to set .row/.col attributes on the
   220             # XXX call render before subject to set .row/.col attributes on the
   219             #     view
   221             #     view
   220             content = self.render(row=0, col=0, **kwargs)
   222             try:
   221             subject = self.subject()
   223                 content = self.render(row=0, col=0, **kwargs)
   222             msg = format_mail(userdata, [emailaddr], content, subject,
   224                 subject = self.subject()
       
   225             except SkipEmail:
       
   226                 continue
       
   227             msg = format_mail(self.user_data, [emailaddr], content, subject,
   223                               config=self.config, msgid=msgid, references=refs)
   228                               config=self.config, msgid=msgid, references=refs)
   224             yield [emailaddr], msg
   229             yield [emailaddr], msg
   225         # restore language
   230         # restore language
   226         self.req.set_language(origlang)
   231         req.set_language(origlang)
   227 
   232 
   228     def render_and_send(self, **kwargs):
   233     def render_and_send(self, **kwargs):
   229         """generate and send an email message for this view"""
   234         """generate and send an email message for this view"""
   230         delayed = kwargs.pop('delay_to_commit', None)
   235         delayed = kwargs.pop('delay_to_commit', None)
   231         for recipients, msg in self.render_emails(**kwargs):
   236         for recipients, msg in self.render_emails(**kwargs):