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 |