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 |
249 try: |
260 class SkipEmail(Exception): |
250 # if req is actually a session (we are on the server side), and we |
261 """raise this if you decide to skip an email during its generation""" |
251 # have to prevent nested internal session |
|
252 return self.req.actual_session().user.login |
|
253 except AttributeError: |
|
254 return self.req.user.login |
|