28 |
28 |
29 from cubicweb.entity import Entity |
29 from cubicweb.entity import Entity |
30 from cubicweb.view import Component, EntityView |
30 from cubicweb.view import Component, EntityView |
31 from cubicweb.server.hook import SendMailOp |
31 from cubicweb.server.hook import SendMailOp |
32 from cubicweb.mail import construct_message_id, format_mail |
32 from cubicweb.mail import construct_message_id, format_mail |
33 from cubicweb.server.session import Session |
33 from cubicweb.server.session import Session, InternalManager |
34 |
34 |
35 |
35 |
36 class RecipientsFinder(Component): |
36 class RecipientsFinder(Component): |
37 """this component is responsible to find recipients of a notification |
37 """this component is responsible to find recipients of a notification |
38 |
38 |
113 else: |
113 else: |
114 refs = () |
114 refs = () |
115 msgid = None |
115 msgid = None |
116 req = self._cw |
116 req = self._cw |
117 self.user_data = req.user_data() |
117 self.user_data = req.user_data() |
118 origlang = req.lang |
|
119 for something in recipients: |
118 for something in recipients: |
120 if isinstance(something, Entity): |
119 if isinstance(something, tuple): |
121 # hi-jack self._cw to get a session for the returned user |
120 emailaddr, lang = something |
122 self._cw = Session(something, self._cw.repo) |
121 user = InternalManager(lang=lang) |
|
122 else: |
|
123 emailaddr = something.cw_adapt_to('IEmailable').get_email() |
|
124 user = something |
|
125 # hi-jack self._cw to get a session for the returned user |
|
126 self._cw = Session(user, self._cw.repo) |
|
127 try: |
123 self._cw.set_cnxset() |
128 self._cw.set_cnxset() |
124 emailaddr = something.cw_adapt_to('IEmailable').get_email() |
129 # since the same view (eg self) may be called multiple time and we |
125 else: |
130 # need a fresh stream at each iteration, reset it explicitly |
126 emailaddr, lang = something |
131 self.w = None |
127 self._cw.set_language(lang) |
|
128 # since the same view (eg self) may be called multiple time and we |
|
129 # need a fresh stream at each iteration, reset it explicitly |
|
130 self.w = None |
|
131 try: |
|
132 # XXX call render before subject to set .row/.col attributes on the |
132 # XXX call render before subject to set .row/.col attributes on the |
133 # view |
133 # view |
134 try: |
134 try: |
135 content = self.render(row=0, col=0, **kwargs) |
135 content = self.render(row=0, col=0, **kwargs) |
136 subject = self.subject() |
136 subject = self.subject() |
143 self.exception(str(ex)) |
143 self.exception(str(ex)) |
144 continue |
144 continue |
145 msg = format_mail(self.user_data, [emailaddr], content, subject, |
145 msg = format_mail(self.user_data, [emailaddr], content, subject, |
146 config=self._cw.vreg.config, msgid=msgid, references=refs) |
146 config=self._cw.vreg.config, msgid=msgid, references=refs) |
147 yield [emailaddr], msg |
147 yield [emailaddr], msg |
148 except: |
|
149 if isinstance(something, Entity): |
|
150 self._cw.rollback() |
|
151 raise |
|
152 else: |
|
153 if isinstance(something, Entity): |
|
154 self._cw.commit() |
|
155 finally: |
148 finally: |
156 if isinstance(something, Entity): |
149 self._cw.commit() |
157 self._cw.close() |
150 self._cw.close() |
158 self._cw = req |
151 self._cw = req |
159 # restore language |
|
160 req.set_language(origlang) |
|
161 |
152 |
162 # recipients / email sending ############################################### |
153 # recipients / email sending ############################################### |
163 |
154 |
164 def recipients(self): |
155 def recipients(self): |
165 """return a list of either 2-uple (email, language) or user entity to |
156 """return a list of either 2-uple (email, language) or user entity to |
166 who this email should be sent |
157 whom this email should be sent |
167 """ |
158 """ |
168 finder = self._cw.vreg['components'].select( |
159 finder = self._cw.vreg['components'].select( |
169 'recipients_finder', self._cw, rset=self.cw_rset, |
160 'recipients_finder', self._cw, rset=self.cw_rset, |
170 row=self.cw_row or 0, col=self.cw_col or 0) |
161 row=self.cw_row or 0, col=self.cw_col or 0) |
171 return finder.recipients() |
162 return finder.recipients() |