common/mail.py
branchstable
changeset 3315 59220b704562
parent 3120 57ceabc6dfbc
child 3370 62ed9981a770
equal deleted inserted replaced
3298:caef98aa4a98 3315:59220b704562
   140     """
   140     """
   141     # XXX refactor this class to work with len(rset) > 1
   141     # XXX refactor this class to work with len(rset) > 1
   142 
   142 
   143     msgid_timestamp = True
   143     msgid_timestamp = True
   144 
   144 
   145     def recipients(self):
   145     # this is usually the method to call
   146         finder = self.vreg['components'].select('recipients_finder', self.req,
   146     def render_and_send(self, **kwargs):
   147                                                 rset=self.rset,
   147         """generate and send an email message for this view"""
   148                                                 row=self.row or 0,
   148         delayed = kwargs.pop('delay_to_commit', None)
   149                                                 col=self.col or 0)
   149         for recipients, msg in self.render_emails(**kwargs):
   150         return finder.recipients()
   150             if delayed is None:
   151 
   151                 self.send(recipients, msg)
   152     def subject(self):
   152             elif delayed:
   153         entity = self.entity(self.row or 0, self.col or 0)
   153                 self.send_on_commit(recipients, msg)
   154         subject = self.req._(self.message)
   154             else:
   155         etype = entity.dc_type()
   155                 self.send_now(recipients, msg)
   156         eid = entity.eid
       
   157         login = self.user_data['login']
       
   158         return self.req._('%(subject)s %(etype)s #%(eid)s (%(login)s)') % locals()
       
   159 
       
   160     def context(self, **kwargs):
       
   161         entity = self.entity(self.row or 0, self.col or 0)
       
   162         for key, val in kwargs.iteritems():
       
   163             if val and isinstance(val, unicode) and val.strip():
       
   164                kwargs[key] = self.req._(val)
       
   165         kwargs.update({'user': self.user_data['login'],
       
   166                        'eid': entity.eid,
       
   167                        'etype': entity.dc_type(),
       
   168                        'url': entity.absolute_url(),
       
   169                        'title': entity.dc_long_title(),})
       
   170         return kwargs
       
   171 
   156 
   172     def cell_call(self, row, col=0, **kwargs):
   157     def cell_call(self, row, col=0, **kwargs):
   173         self.w(self.req._(self.content) % self.context(**kwargs))
   158         self.w(self.req._(self.content) % self.context(**kwargs))
   174 
       
   175     def construct_message_id(self, eid):
       
   176         return construct_message_id(self.config.appid, eid, self.msgid_timestamp)
       
   177 
   159 
   178     def render_emails(self, **kwargs):
   160     def render_emails(self, **kwargs):
   179         """generate and send emails for this view (one per recipient)"""
   161         """generate and send emails for this view (one per recipient)"""
   180         self._kwargs = kwargs
   162         self._kwargs = kwargs
   181         recipients = self.recipients()
   163         recipients = self.recipients()
   220                               config=self.config, msgid=msgid, references=refs)
   202                               config=self.config, msgid=msgid, references=refs)
   221             yield [emailaddr], msg
   203             yield [emailaddr], msg
   222         # restore language
   204         # restore language
   223         req.set_language(origlang)
   205         req.set_language(origlang)
   224 
   206 
   225     def render_and_send(self, **kwargs):
   207     # recipients / email sending ###############################################
   226         """generate and send an email message for this view"""
   208 
   227         delayed = kwargs.pop('delay_to_commit', None)
   209     def recipients(self):
   228         for recipients, msg in self.render_emails(**kwargs):
   210         """return a list of either 2-uple (email, language) or user entity to
   229             if delayed is None:
   211         who this email should be sent
   230                 self.send(recipients, msg)
   212         """
   231             elif delayed:
   213         finder = self.vreg['components'].select('recipients_finder', self.req,
   232                 self.send_on_commit(recipients, msg)
   214                                                 rset=self.rset,
   233             else:
   215                                                 row=self.row or 0,
   234                 self.send_now(recipients, msg)
   216                                                 col=self.col or 0)
       
   217         return finder.recipients()
   235 
   218 
   236     def send_now(self, recipients, msg):
   219     def send_now(self, recipients, msg):
   237         self.config.sendmails([(msg, recipients)])
   220         self.config.sendmails([(msg, recipients)])
   238 
   221 
   239     def send_on_commit(self, recipients, msg):
   222     def send_on_commit(self, recipients, msg):
   240         raise NotImplementedError
   223         raise NotImplementedError
   241 
   224 
   242     send = send_now
   225     send = send_now
   243 
   226 
       
   227     # email generation helpers #################################################
       
   228 
       
   229     def construct_message_id(self, eid):
       
   230         return construct_message_id(self.config.appid, eid, self.msgid_timestamp)
       
   231 
       
   232     def format_field(self, attr, value):
       
   233         return ':%(attr)s: %(value)s' % {'attr': attr, 'value': value}
       
   234 
       
   235     def format_section(self, attr, value):
       
   236         return '%(attr)s\n%(ul)s\n%(value)s\n' % {
       
   237             'attr': attr, 'ul': '-'*len(attr), 'value': value}
       
   238 
       
   239     def subject(self):
       
   240         entity = self.entity(self.row or 0, self.col or 0)
       
   241         subject = self.req._(self.message)
       
   242         etype = entity.dc_type()
       
   243         eid = entity.eid
       
   244         login = self.user_data['login']
       
   245         return self.req._('%(subject)s %(etype)s #%(eid)s (%(login)s)') % locals()
       
   246 
       
   247     def context(self, **kwargs):
       
   248         entity = self.entity(self.row or 0, self.col or 0)
       
   249         for key, val in kwargs.iteritems():
       
   250             if val and isinstance(val, unicode) and val.strip():
       
   251                kwargs[key] = self.req._(val)
       
   252         kwargs.update({'user': self.user_data['login'],
       
   253                        'eid': entity.eid,
       
   254                        'etype': entity.dc_type(),
       
   255                        'url': entity.absolute_url(),
       
   256                        'title': entity.dc_long_title(),})
       
   257         return kwargs
       
   258 
   244 
   259 
   245 class SkipEmail(Exception):
   260 class SkipEmail(Exception):
   246     """raise this if you decide to skip an email during its generation"""
   261     """raise this if you decide to skip an email during its generation"""