web/views/massmailing.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Thu, 28 May 2009 18:27:50 +0200
changeset 1982 27e81d0c7d05
parent 1977 606923dff11b
child 1995 ec95eaa2b711
permissions -rw-r--r--
not needed, this is the default label
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
     1
"""Mass mailing form views
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
     2
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
     3
:organization: Logilab
1977
606923dff11b big bunch of copyright / docstring update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1684
diff changeset
     4
:copyright: 2007-2009 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
     5
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
1977
606923dff11b big bunch of copyright / docstring update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1684
diff changeset
     6
:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
     7
"""
1085
dc406357f208 api update
sylvain.thenault@logilab.fr
parents: 1074
diff changeset
     8
__docformat__ = "restructuredtext en"
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
     9
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    10
import operator
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    11
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    12
from cubicweb.interfaces import IEmailable
635
305da8d6aa2d require_group/match_user_group -> match_user_groups
sylvain.thenault@logilab.fr
parents: 431
diff changeset
    13
from cubicweb.selectors import implements, match_user_groups
984
536e421b082b import updates
sylvain.thenault@logilab.fr
parents: 742
diff changeset
    14
from cubicweb.view import EntityView
1085
dc406357f208 api update
sylvain.thenault@logilab.fr
parents: 1074
diff changeset
    15
from cubicweb.web import stdmsgs
640
8e64f12be69c drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents: 635
diff changeset
    16
from cubicweb.web.action import Action
1684
22486268ff94 fix imports
Graziella Toutoungis <graziella.toutoungis@logilab.fr>
parents: 1467
diff changeset
    17
from cubicweb.web.form import FieldsForm, FormViewMixIn
22486268ff94 fix imports
Graziella Toutoungis <graziella.toutoungis@logilab.fr>
parents: 1467
diff changeset
    18
from cubicweb.web.formrenderers import FormRenderer
1085
dc406357f208 api update
sylvain.thenault@logilab.fr
parents: 1074
diff changeset
    19
from cubicweb.web.formfields import StringField
1304
8975c8e520a9 refactor button handling
sylvain.thenault@logilab.fr
parents: 1149
diff changeset
    20
from cubicweb.web.formwidgets import CheckBox, TextInput, AjaxWidget, ImgButton
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    21
1390
78bab2d35637 define _
sylvain.thenault@logilab.fr
parents: 1318
diff changeset
    22
_ = unicode
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    23
640
8e64f12be69c drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents: 635
diff changeset
    24
class SendEmailAction(Action):
1074
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    25
    id = 'sendemail'
635
305da8d6aa2d require_group/match_user_group -> match_user_groups
sylvain.thenault@logilab.fr
parents: 431
diff changeset
    26
    # XXX should check email is set as well
742
99115e029dca replaced most of __selectors__ assignments with __select__
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 640
diff changeset
    27
    __select__ = implements(IEmailable) & match_user_groups('managers', 'users')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    28
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    29
    title = _('send email')
1074
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    30
    category = 'mainactions'
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    31
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    32
    def url(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    33
        params = {'vid': 'massmailing', '__force_display': 1}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    34
        if self.req.form.has_key('rql'):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    35
            params['rql'] = self.req.form['rql']
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    36
        return self.build_url(self.req.relative_path(includeparams=False),
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    37
                              **params)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    38
1466
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
    39
1074
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    40
class MassMailingForm(FieldsForm):
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    41
    id = 'massmailing'
1466
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
    42
1074
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    43
    sender = StringField(widget=TextInput({'disabled': 'disabled'}), label=_('From:'))
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    44
    recipient = StringField(widget=CheckBox(), label=_('Recipients:'))
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    45
    subject = StringField(label=_('Subject:'))
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    46
    mailbody = StringField(widget=AjaxWidget(wdgtype='TemplateTextField',
1467
972517be96dc sendmail form should now work as before
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1466
diff changeset
    47
                                             inputid='mailbody'))
1466
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
    48
    form_buttons = [ImgButton('sendbutton', "javascript: $('#sendmail').submit()",
1304
8975c8e520a9 refactor button handling
sylvain.thenault@logilab.fr
parents: 1149
diff changeset
    49
                              _('send email'), 'SEND_EMAIL_ICON'),
8975c8e520a9 refactor button handling
sylvain.thenault@logilab.fr
parents: 1149
diff changeset
    50
                    ImgButton('cancelbutton', "javascript: history.back()",
1466
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
    51
                              stdmsgs.BUTTON_CANCEL, 'CANCEL_EMAIL_ICON')]
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
    52
1074
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    53
    def form_field_vocabulary(self, field):
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    54
        if field.name == 'recipient':
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    55
            vocab = [(entity.get_email(), entity.eid) for entity in self.rset.entities()]
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    56
            return [(label, value) for label, value in vocab if label]
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    57
        return super(MassMailingForm, self).form_field_vocabulary(field)
1466
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
    58
1074
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    59
    def form_field_value(self, field, values):
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    60
        if field.name == 'recipient':
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    61
            return [entity.eid for entity in self.rset.entities() if entity.get_email()]
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    62
        elif field.name == 'mailbody':
1466
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
    63
            field.widget.attrs['cubicweb:variables'] = ','.join(self.get_allowed_substitutions())
1074
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    64
        return super(MassMailingForm, self).form_field_value(field, values)
1466
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
    65
1074
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    66
    def get_allowed_substitutions(self):
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    67
        attrs = []
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    68
        for coltype in self.rset.column_types(0):
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    69
            eclass = self.vreg.etype_class(coltype)
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    70
            attrs.append(eclass.allowed_massmail_keys())
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    71
        return sorted(reduce(operator.and_, attrs))
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    72
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    73
    def build_substitutions_help(self):
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    74
        insertLink = u'<a href="javascript: insertText(\'%%(%s)s\', \'emailarea\');">%%(%s)s</a>'
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    75
        substs = (u'<div class="substitution">%s</div>' % (insertLink % (subst, subst))
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    76
                  for subst in self.get_allowed_substitutions())
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    77
        helpmsg = self.req._('You can use any of the following substitutions in your text')
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    78
        return u'<div id="substitutions"><span>%s</span>%s</div>' % (
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    79
            helpmsg, u'\n'.join(substs))
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    80
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    81
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    82
class MassMailingFormRenderer(FormRenderer):
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    83
    button_bar_class = u'toolbar'
1466
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
    84
1403
425892e14e67 _render_fields don't need values argument
sylvain.thenault@logilab.fr
parents: 1390
diff changeset
    85
    def _render_fields(self, fields, w, form):
1074
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    86
        w(u'<table class="headersform">')
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    87
        for field in fields:
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    88
            if field.name == 'mailbody':
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    89
                w(u'</table>')
1466
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
    90
                self._render_toolbar(w, form)
1074
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    91
                w(u'<table>')
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    92
                w(u'<tr><td><div>')
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    93
            else:
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    94
                w(u'<tr>')
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    95
                w(u'<td class="hlabel">%s</td>' % self.render_label(form, field))
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    96
                w(u'<td class="hvalue">')
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    97
            w(field.render(form, self))
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    98
            if field.name == 'mailbody':
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
    99
                w(u'</div></td>')
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
   100
                w(u'<td>%s</td>' % form.build_substitutions_help())
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
   101
                w(u'</tr>')
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
   102
            else:
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
   103
                w(u'</td></tr>')
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
   104
        w(u'</table>')
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
   105
1466
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
   106
    def _render_toolbar(self, w, form):
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
   107
        w(u'<div id="toolbar">')
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
   108
        w(u'<ul>')
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
   109
        for button in form.form_buttons:
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
   110
            w(u'<li>%s</li>' % button.render(form))
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
   111
        w(u'</ul>')
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
   112
        w(u'</div>')
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
   113
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
   114
    def render_buttons(self, w, form):
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
   115
        pass
07a2d0c387ca [widgets] fix rendering of the sendmail widget, still to functional though
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1403
diff changeset
   116
1318
50e1a778c5ee new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents: 1304
diff changeset
   117
class MassMailingFormView(FormViewMixIn, EntityView):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   118
    id = 'massmailing'
742
99115e029dca replaced most of __selectors__ assignments with __select__
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 640
diff changeset
   119
    __select__ = implements(IEmailable) & match_user_groups('managers', 'users')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   120
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   121
    def call(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   122
        req = self.req
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   123
        req.add_js('cubicweb.widgets.js')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   124
        req.add_css('cubicweb.mailform.css')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   125
        from_addr = '%s <%s>' % (req.user.dc_title(), req.user.get_email())
1074
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
   126
        form = self.vreg.select_object('forms', 'massmailing', self.req, self.rset,
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
   127
                                       action='sendmail', domid='sendmail')
c07f3accf04a new style massmailing view
sylvain.thenault@logilab.fr
parents: 984
diff changeset
   128
        self.w(form.form_render(sender=from_addr, renderer=MassMailingFormRenderer()))