common/mail.py
branch3.5
changeset 3110 757d36162235
parent 3052 73b1d3746193
child 3120 57ceabc6dfbc
equal deleted inserted replaced
3103:1d09765ee720 3110:757d36162235
    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):
   174                 refs = ()
   175                 refs = ()
   175             msgid = self.construct_message_id(entity.eid)
   176             msgid = self.construct_message_id(entity.eid)
   176         else:
   177         else:
   177             refs = ()
   178             refs = ()
   178             msgid = None
   179             msgid = None
   179         userdata = self.req.user_data()
   180         req = self.req
   180         origlang = self.req.lang
   181         self.user_data = req.user_data()
   181         for emailaddr, lang in recipients:
   182         origlang = req.lang
   182             self.req.set_language(lang)
   183         for something in recipients:
       
   184             if isinstance(something, Entity):
       
   185                 # hi-jack self.req to get a session for the returned user
       
   186                 self.req = self.req.hijack_user(something)
       
   187                 emailaddr = something.get_email()
       
   188             else:
       
   189                 emailaddr, lang = something
       
   190                 self.req.set_language(lang)
   183             # since the same view (eg self) may be called multiple time and we
   191             # since the same view (eg self) may be called multiple time and we
   184             # need a fresh stream at each iteration, reset it explicitly
   192             # need a fresh stream at each iteration, reset it explicitly
   185             self.w = None
   193             self.w = None
   186             # XXX call render before subject to set .row/.col attributes on the
   194             # XXX call render before subject to set .row/.col attributes on the
   187             #     view
   195             #     view
   188             content = self.render(row=0, col=0, **kwargs)
   196             try:
   189             subject = self.subject()
   197                 content = self.render(row=0, col=0, **kwargs)
   190             msg = format_mail(userdata, [emailaddr], content, subject,
   198                 subject = self.subject()
       
   199             except SkipEmail:
       
   200                 continue
       
   201             msg = format_mail(self.user_data, [emailaddr], content, subject,
   191                               config=self.config, msgid=msgid, references=refs)
   202                               config=self.config, msgid=msgid, references=refs)
   192             yield [emailaddr], msg
   203             yield [emailaddr], msg
   193         # restore language
   204         # restore language
   194         self.req.set_language(origlang)
   205         req.set_language(origlang)
   195 
   206 
   196     # recipients / email sending ###############################################
   207     # recipients / email sending ###############################################
   197 
   208 
   198     def recipients(self):
   209     def recipients(self):
   199         """return a list of 2-uple (email, language) to who this email should be
   210         """return a list of either 2-uple (email, language) or user entity to
   200         sent
   211         who this email should be sent
   201         """
   212         """
   202         finder = self.vreg['components'].select('recipients_finder', self.req,
   213         finder = self.vreg['components'].select('recipients_finder', self.req,
   203                                                 rset=self.rset,
   214                                                 rset=self.rset,
   204                                                 row=self.row or 0,
   215                                                 row=self.row or 0,
   205                                                 col=self.col or 0)
   216                                                 col=self.col or 0)
   228     def subject(self):
   239     def subject(self):
   229         entity = self.entity(self.row or 0, self.col or 0)
   240         entity = self.entity(self.row or 0, self.col or 0)
   230         subject = self.req._(self.message)
   241         subject = self.req._(self.message)
   231         etype = entity.dc_type()
   242         etype = entity.dc_type()
   232         eid = entity.eid
   243         eid = entity.eid
   233         login = self.user_login()
   244         login = self.user_data['login']
   234         return self.req._('%(subject)s %(etype)s #%(eid)s (%(login)s)') % locals()
   245         return self.req._('%(subject)s %(etype)s #%(eid)s (%(login)s)') % locals()
   235 
   246 
   236     def context(self, **kwargs):
   247     def context(self, **kwargs):
   237         entity = self.entity(self.row or 0, self.col or 0)
   248         entity = self.entity(self.row or 0, self.col or 0)
   238         for key, val in kwargs.iteritems():
   249         for key, val in kwargs.iteritems():
   239             if val and isinstance(val, unicode) and val.strip():
   250             if val and isinstance(val, unicode) and val.strip():
   240                kwargs[key] = self.req._(val)
   251                kwargs[key] = self.req._(val)
   241         kwargs.update({'user': self.user_login(),
   252         kwargs.update({'user': self.user_data['login'],
   242                        'eid': entity.eid,
   253                        'eid': entity.eid,
   243                        'etype': entity.dc_type(),
   254                        'etype': entity.dc_type(),
   244                        'url': entity.absolute_url(),
   255                        'url': entity.absolute_url(),
   245                        'title': entity.dc_long_title(),})
   256                        'title': entity.dc_long_title(),})
   246         return kwargs
   257         return kwargs
   247 
   258 
   248     def user_login(self):
   259 class SkipEmail(Exception):
   249         try:
   260     """raise this if you decide to skip an email during its generation"""
   250             # if req is actually a session (we are on the server side), and we
       
   251             # have to prevent nested internal session
       
   252             return self.req.actual_session().user.login
       
   253         except AttributeError:
       
   254             return self.req.user.login