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""" |