~ubuntu-branches/ubuntu/natty/moin/natty-updates

« back to all changes in this revision

Viewing changes to MoinMoin/events/emailnotify.py

  • Committer: Bazaar Package Importer
  • Author(s): Jonas Smedegaard
  • Date: 2008-06-22 21:17:13 UTC
  • mfrom: (0.9.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20080622211713-fpo2zrq3s5dfecxg
Tags: 1.7.0-3
Simplify /etc/moin/wikilist format: "USER URL" (drop unneeded middle
CONFIG_DIR that was wrongly advertised as DATA_DIR).  Make
moin-mass-migrate handle both formats and warn about deprecation of
the old one.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: iso-8859-1 -*-
 
2
"""
 
3
    MoinMoin - email notification plugin from event system
 
4
 
 
5
    This code sends email notifications about page changes.
 
6
    TODO: refactor it to handle separate events for page changes, creations, etc
 
7
 
 
8
    @copyright: 2007 by Karol Nowak <grywacz@gmail.com>
 
9
    @license: GNU GPL, see COPYING for details.
 
10
"""
 
11
 
 
12
from MoinMoin import user
 
13
from MoinMoin.Page import Page
 
14
from MoinMoin.mail import sendmail
 
15
from MoinMoin.support.python_compatibility import set
 
16
from MoinMoin.user import User, getUserList
 
17
from MoinMoin.action.AttachFile import getAttachUrl
 
18
 
 
19
import MoinMoin.events as ev
 
20
import MoinMoin.events.notification as notification
 
21
 
 
22
 
 
23
def prep_page_changed_mail(request, page, comment, email_lang, revisions, trivial):
 
24
    """ Prepare information required for email notification about page change
 
25
 
 
26
    @param page: the modified page instance
 
27
    @param comment: editor's comment given when saving the page
 
28
    @param email_lang: language of email
 
29
    @param revisions: revisions of this page (newest first!)
 
30
    @param trivial: the change is marked as trivial
 
31
    @return: dict with email title and body
 
32
    @rtype: dict
 
33
 
 
34
    """
 
35
    change = notification.page_change_message("page_changed", request, page, email_lang, comment=comment, revisions=revisions)
 
36
    _ = lambda text: request.getText(text, lang=email_lang)
 
37
 
 
38
    if len(revisions) >= 2:
 
39
        querystr = {'action': 'diff',
 
40
                    'rev2': str(revisions[0]),
 
41
                    'rev1': str(revisions[1])}
 
42
    else:
 
43
        querystr = {}
 
44
 
 
45
    pagelink = "%(link)s\n\n" % {'link': notification.page_link(request, page, querystr)}
 
46
 
 
47
    subject = _('[%(sitename)s] %(trivial)sUpdate of "%(pagename)s" by %(username)s') % {
 
48
            'trivial': (trivial and _("Trivial ")) or "",
 
49
            'sitename': page.cfg.sitename or "Wiki",
 
50
            'pagename': page.page_name,
 
51
            'username': page.uid_override or user.getUserIdentification(request),
 
52
        }
 
53
 
 
54
    return {'subject': subject, 'text': change['text'] + pagelink + change['diff']}
 
55
 
 
56
 
 
57
def send_notification(request, from_address, emails, data):
 
58
    """ Send notification email
 
59
 
 
60
    @param emails: list of email addresses
 
61
    @return: sendmail result
 
62
    @rtype int
 
63
 
 
64
    """
 
65
    return sendmail.sendmail(request, emails, data['subject'], data['text'], mail_from=from_address)
 
66
 
 
67
 
 
68
def handle_page_change(event):
 
69
    """ Send email to all subscribers of given page.
 
70
 
 
71
    @param event: event to notify about
 
72
    @rtype: string
 
73
    @return: message, indicating success or errors.
 
74
 
 
75
    """
 
76
    comment = event.comment
 
77
    page = event.page
 
78
    request = event.request
 
79
    trivial = isinstance(event, ev.TrivialPageChangedEvent)
 
80
    subscribers = page.getSubscribers(request, return_users=1)
 
81
    mail_from = page.cfg.mail_from
 
82
 
 
83
    if subscribers:
 
84
        recipients = set()
 
85
 
 
86
        # get a list of old revisions, and append a diff
 
87
        revisions = page.getRevList()
 
88
 
 
89
        # send email to all subscribers
 
90
        for lang in subscribers:
 
91
            users = [u for u in subscribers[lang]
 
92
                     if event.name in u.email_subscribed_events]
 
93
            emails = [u.email for u in users]
 
94
            names = [u.name for u in users]
 
95
            data = prep_page_changed_mail(request, page, comment, lang, revisions, trivial)
 
96
 
 
97
            if send_notification(request, mail_from, emails, data):
 
98
                recipients.update(names)
 
99
 
 
100
        if recipients:
 
101
            return notification.Success(recipients)
 
102
 
 
103
 
 
104
def handle_user_created(event):
 
105
    """Sends an email to super users that have subscribed to this event type"""
 
106
 
 
107
    request = event.request
 
108
    sitename = request.cfg.sitename
 
109
    from_address = request.cfg.mail_from
 
110
    event_name = event.name
 
111
    email = event.user.email or u"NOT SET"
 
112
    username = event.user.name
 
113
 
 
114
    user_ids = getUserList(request)
 
115
    for usr_id in user_ids:
 
116
        usr = User(request, id=usr_id)
 
117
        # Currently send this only to super users
 
118
        if usr.isSuperUser() and event_name in usr.email_subscribed_events:
 
119
            _ = lambda text: request.getText(text, lang=usr.language or 'en')
 
120
            data = notification.user_created_message(request, _, sitename, username, email)
 
121
            send_notification(request, from_address, [usr.email], data)
 
122
 
 
123
 
 
124
def handle_file_attached(event):
 
125
    """Sends an email to super users that have subscribed to this event type"""
 
126
 
 
127
    names = set()
 
128
    from_address = event.request.cfg.mail_from
 
129
    request = event.request
 
130
    page = Page(request, event.pagename)
 
131
 
 
132
    subscribers = page.getSubscribers(request, return_users=1)
 
133
    notification.filter_subscriber_list(event, subscribers, False)
 
134
    recipients = []
 
135
 
 
136
    for lang in subscribers:
 
137
        recipients.extend(subscribers[lang])
 
138
 
 
139
    attachlink = request.getBaseURL() + getAttachUrl(event.pagename, event.filename, request)
 
140
    pagelink = request.getQualifiedURL(page.url(request, {}))
 
141
 
 
142
    for lang in subscribers:
 
143
        emails = []
 
144
        _ = lambda text: request.getText(text, lang=lang)
 
145
 
 
146
        links = _("Attachment link: %(attach)s\n" \
 
147
                  "Page link: %(page)s\n") % {'attach': attachlink, 'page': pagelink}
 
148
 
 
149
        data = notification.attachment_added(request, _, event.pagename, event.filename, event.size)
 
150
        data['text'] = data['text'] + links
 
151
 
 
152
        emails = [usr.email for usr in subscribers[lang]]
 
153
 
 
154
        if send_notification(request, from_address, emails, data):
 
155
            names.update(recipients)
 
156
 
 
157
    return notification.Success(names)
 
158
 
 
159
 
 
160
def handle(event):
 
161
    """An event handler"""
 
162
 
 
163
    if not event.request.cfg.mail_enabled:
 
164
        return
 
165
 
 
166
    if isinstance(event, (ev.PageChangedEvent, ev.TrivialPageChangedEvent)):
 
167
        return handle_page_change(event)
 
168
    elif isinstance(event, ev.UserCreatedEvent):
 
169
        return handle_user_created(event)
 
170
    elif isinstance(event, ev.FileAttachedEvent):
 
171
        return handle_file_attached(event)