1
# -*- coding: iso-8859-1 -*-
3
MoinMoin - email notification plugin from event system
5
This code sends email notifications about page changes.
6
TODO: refactor it to handle separate events for page changes, creations, etc
8
@copyright: 2007 by Karol Nowak <grywacz@gmail.com>
9
@license: GNU GPL, see COPYING for details.
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
19
import MoinMoin.events as ev
20
import MoinMoin.events.notification as notification
23
def prep_page_changed_mail(request, page, comment, email_lang, revisions, trivial):
24
""" Prepare information required for email notification about page change
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
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)
38
if len(revisions) >= 2:
39
querystr = {'action': 'diff',
40
'rev2': str(revisions[0]),
41
'rev1': str(revisions[1])}
45
pagelink = "%(link)s\n\n" % {'link': notification.page_link(request, page, querystr)}
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),
54
return {'subject': subject, 'text': change['text'] + pagelink + change['diff']}
57
def send_notification(request, from_address, emails, data):
58
""" Send notification email
60
@param emails: list of email addresses
61
@return: sendmail result
65
return sendmail.sendmail(request, emails, data['subject'], data['text'], mail_from=from_address)
68
def handle_page_change(event):
69
""" Send email to all subscribers of given page.
71
@param event: event to notify about
73
@return: message, indicating success or errors.
76
comment = event.comment
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
86
# get a list of old revisions, and append a diff
87
revisions = page.getRevList()
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)
97
if send_notification(request, mail_from, emails, data):
98
recipients.update(names)
101
return notification.Success(recipients)
104
def handle_user_created(event):
105
"""Sends an email to super users that have subscribed to this event type"""
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
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)
124
def handle_file_attached(event):
125
"""Sends an email to super users that have subscribed to this event type"""
128
from_address = event.request.cfg.mail_from
129
request = event.request
130
page = Page(request, event.pagename)
132
subscribers = page.getSubscribers(request, return_users=1)
133
notification.filter_subscriber_list(event, subscribers, False)
136
for lang in subscribers:
137
recipients.extend(subscribers[lang])
139
attachlink = request.getBaseURL() + getAttachUrl(event.pagename, event.filename, request)
140
pagelink = request.getQualifiedURL(page.url(request, {}))
142
for lang in subscribers:
144
_ = lambda text: request.getText(text, lang=lang)
146
links = _("Attachment link: %(attach)s\n" \
147
"Page link: %(page)s\n") % {'attach': attachlink, 'page': pagelink}
149
data = notification.attachment_added(request, _, event.pagename, event.filename, event.size)
150
data['text'] = data['text'] + links
152
emails = [usr.email for usr in subscribers[lang]]
154
if send_notification(request, from_address, emails, data):
155
names.update(recipients)
157
return notification.Success(names)
161
"""An event handler"""
163
if not event.request.cfg.mail_enabled:
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)