diff -r 000000000000 -r b97547f5f1fa web/views/massmailing.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/web/views/massmailing.py Wed Nov 05 15:52:50 2008 +0100
@@ -0,0 +1,129 @@
+"""Mass mailing form views
+
+:organization: Logilab
+:copyright: 2007-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
+"""
+
+import operator
+
+from logilab.mtconverter import html_escape
+
+from cubicweb.interfaces import IEmailable
+from cubicweb.common.view import EntityView
+from cubicweb.common.selectors import interface_selector, in_group_selector
+from cubicweb.web.action import EntityAction
+from cubicweb.web import stdmsgs
+
+
+class SendEmailAction(EntityAction):
+ category = 'mainactions'
+ __selectors__ = (interface_selector, in_group_selector)
+ accepts_interfaces = (IEmailable,) # XXX should check email is set as well
+ require_groups = ('managers', 'users')
+
+ id = 'sendemail'
+ title = _('send email')
+
+ def url(self):
+ params = {'vid': 'massmailing', '__force_display': 1}
+ if self.req.form.has_key('rql'):
+ params['rql'] = self.req.form['rql']
+ return self.build_url(self.req.relative_path(includeparams=False),
+ **params)
+
+
+class MassMailingForm(EntityView):
+ id = 'massmailing'
+ __selectors__ = (interface_selector, in_group_selector)
+ accepts_interfaces = (IEmailable,)
+ require_groups = ('managers', 'users')
+
+
+ form_template = u"""
+
+ """
+
+ def call(self):
+ req = self.req
+ req.add_js('cubicweb.widgets.js')
+ req.add_css('cubicweb.mailform.css')
+ from_addr = '%s <%s>' % (req.user.dc_title(), req.user.get_email())
+ ctx = {
+ 'from_header' : req._('From: '),
+ 'from' : html_escape(from_addr),
+ 'substitutions' : self._build_substitutions_help(),
+ 'recipients_header' : req._('Recipients: '),
+ 'subject' : req._('Subject: '),
+ 'body' : req._('Email body: '),
+ 'variables' : ','.join(self._get_allowed_substitutions()),
+ 'recipients' : self._build_recipients_list(),
+ 'cancel' : req._(stdmsgs.BUTTON_CANCEL),
+ 'cancelimgpath' : req.external_resource('CANCEL_EMAIL_ICON'),
+ 'send' : req._('send email'),
+ 'sendimgpath' : req.external_resource('SEND_EMAIL_ICON'),
+ }
+ self.w(self.form_template % ctx)
+
+
+ def _get_allowed_substitutions(self):
+ coltypes = self.rset.column_types(0)
+ attrs = []
+ for coltype in coltypes:
+ eclass = self.vreg.etype_class(coltype)
+ attrs.append(eclass.allowed_massmail_keys())
+ return sorted(reduce(operator.and_, attrs))
+
+ def _build_recipients_list(self):
+ emails = ((entity.eid, entity.get_email()) for entity in self.rset.entities())
+ checkboxes = (u' %s'
+ % (eid, html_escape(email)) for eid, email in emails if email)
+ boxes = (u'%s
' % cbox for cbox in checkboxes)
+ return u'%s
' % u'\n'.join(boxes)
+
+
+ def _build_substitutions_help(self):
+ insertLink = u'%%(%s)s '
+ substs = (u'%s
' % (insertLink % (subst, subst))
+ for subst in self._get_allowed_substitutions())
+ helpmsg = self.req._('You can use any of the following substitutions in your text')
+ return u'%s %s
' % (
+ helpmsg, u'\n'.join(substs))
+
+