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): |