common/mail.py
branch3.5
changeset 3052 73b1d3746193
parent 2879 ae26a80c0635
child 3110 757d36162235
equal deleted inserted replaced
3051:2e28226e7de4 3052:73b1d3746193
   139     """
   139     """
   140     # XXX refactor this class to work with len(rset) > 1
   140     # XXX refactor this class to work with len(rset) > 1
   141 
   141 
   142     msgid_timestamp = True
   142     msgid_timestamp = True
   143 
   143 
   144     def user_login(self):
   144     # this is usually the method to call
   145         try:
   145     def render_and_send(self, **kwargs):
   146             # if req is actually a session (we are on the server side), and we
   146         """generate and send an email message for this view"""
   147             # have to prevent nested internal session
   147         delayed = kwargs.pop('delay_to_commit', None)
   148             return self.req.actual_session().user.login
   148         for recipients, msg in self.render_emails(**kwargs):
   149         except AttributeError:
   149             if delayed is None:
   150             return self.req.user.login
   150                 self.send(recipients, msg)
   151 
   151             elif delayed:
   152     def recipients(self):
   152                 self.send_on_commit(recipients, msg)
   153         finder = self.vreg['components'].select('recipients_finder', self.req,
   153             else:
   154                                                 rset=self.rset,
   154                 self.send_now(recipients, msg)
   155                                                 row=self.row or 0,
       
   156                                                 col=self.col or 0)
       
   157         return finder.recipients()
       
   158 
       
   159     def subject(self):
       
   160         entity = self.entity(self.row or 0, self.col or 0)
       
   161         subject = self.req._(self.message)
       
   162         etype = entity.dc_type()
       
   163         eid = entity.eid
       
   164         login = self.user_login()
       
   165         return self.req._('%(subject)s %(etype)s #%(eid)s (%(login)s)') % locals()
       
   166 
       
   167     def context(self, **kwargs):
       
   168         entity = self.entity(self.row or 0, self.col or 0)
       
   169         for key, val in kwargs.iteritems():
       
   170             if val and isinstance(val, unicode) and val.strip():
       
   171                kwargs[key] = self.req._(val)
       
   172         kwargs.update({'user': self.user_login(),
       
   173                        'eid': entity.eid,
       
   174                        'etype': entity.dc_type(),
       
   175                        'url': entity.absolute_url(),
       
   176                        'title': entity.dc_long_title(),})
       
   177         return kwargs
       
   178 
   155 
   179     def cell_call(self, row, col=0, **kwargs):
   156     def cell_call(self, row, col=0, **kwargs):
   180         self.w(self.req._(self.content) % self.context(**kwargs))
   157         self.w(self.req._(self.content) % self.context(**kwargs))
   181 
   158 
   182     def construct_message_id(self, eid):
       
   183         return construct_message_id(self.config.appid, eid, self.msgid_timestamp)
       
   184 
       
   185     def render_emails(self, **kwargs):
   159     def render_emails(self, **kwargs):
   186         """generate and send an email message for this view"""
   160         """generate and send emails for this view (one per recipient)"""
   187         self._kwargs = kwargs
   161         self._kwargs = kwargs
   188         recipients = self.recipients()
   162         recipients = self.recipients()
   189         if not recipients:
   163         if not recipients:
   190             self.info('skipping %s notification, no recipients', self.id)
   164             self.info('skipping %s notification, no recipients', self.id)
   191             return
   165             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:
   166         if self.rset is not None:
   199             entity = self.entity(self.row or 0, self.col or 0)
   167             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
   168             # if the view is using timestamp in message ids, no way to reference
   201             # previous email
   169             # previous email
   202             if not self.msgid_timestamp:
   170             if not self.msgid_timestamp:
   223                               config=self.config, msgid=msgid, references=refs)
   191                               config=self.config, msgid=msgid, references=refs)
   224             yield [emailaddr], msg
   192             yield [emailaddr], msg
   225         # restore language
   193         # restore language
   226         self.req.set_language(origlang)
   194         self.req.set_language(origlang)
   227 
   195 
   228     def render_and_send(self, **kwargs):
   196     # recipients / email sending ###############################################
   229         """generate and send an email message for this view"""
   197 
   230         delayed = kwargs.pop('delay_to_commit', None)
   198     def recipients(self):
   231         for recipients, msg in self.render_emails(**kwargs):
   199         """return a list of 2-uple (email, language) to who this email should be
   232             if delayed is None:
   200         sent
   233                 self.send(recipients, msg)
   201         """
   234             elif delayed:
   202         finder = self.vreg['components'].select('recipients_finder', self.req,
   235                 self.send_on_commit(recipients, msg)
   203                                                 rset=self.rset,
   236             else:
   204                                                 row=self.row or 0,
   237                 self.send_now(recipients, msg)
   205                                                 col=self.col or 0)
       
   206         return finder.recipients()
   238 
   207 
   239     def send_now(self, recipients, msg):
   208     def send_now(self, recipients, msg):
   240         self.config.sendmails([(msg, recipients)])
   209         self.config.sendmails([(msg, recipients)])
   241 
   210 
   242     def send_on_commit(self, recipients, msg):
   211     def send_on_commit(self, recipients, msg):
   243         raise NotImplementedError
   212         raise NotImplementedError
   244 
   213 
   245     send = send_now
   214     send = send_now
       
   215 
       
   216     # email generation helpers #################################################
       
   217 
       
   218     def construct_message_id(self, eid):
       
   219         return construct_message_id(self.config.appid, eid, self.msgid_timestamp)
       
   220 
       
   221     def format_field(self, attr, value):
       
   222         return ':%(attr)s: %(value)s' % {'attr': attr, 'value': value}
       
   223 
       
   224     def format_section(self, attr, value):
       
   225         return '%(attr)s\n%(ul)s\n%(value)s\n' % {
       
   226             'attr': attr, 'ul': '-'*len(attr), 'value': value}
       
   227 
       
   228     def subject(self):
       
   229         entity = self.entity(self.row or 0, self.col or 0)
       
   230         subject = self.req._(self.message)
       
   231         etype = entity.dc_type()
       
   232         eid = entity.eid
       
   233         login = self.user_login()
       
   234         return self.req._('%(subject)s %(etype)s #%(eid)s (%(login)s)') % locals()
       
   235 
       
   236     def context(self, **kwargs):
       
   237         entity = self.entity(self.row or 0, self.col or 0)
       
   238         for key, val in kwargs.iteritems():
       
   239             if val and isinstance(val, unicode) and val.strip():
       
   240                kwargs[key] = self.req._(val)
       
   241         kwargs.update({'user': self.user_login(),
       
   242                        'eid': entity.eid,
       
   243                        'etype': entity.dc_type(),
       
   244                        'url': entity.absolute_url(),
       
   245                        'title': entity.dc_long_title(),})
       
   246         return kwargs
       
   247 
       
   248     def user_login(self):
       
   249         try:
       
   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