def notify_users_when_wanted( event = None ):
""" notifies users if *event* matches a filter of a user and the
user wants to be notified for the matching filter """
from grical.events.models import Event, Filter
if isinstance(event, Event):
pass
elif isinstance(event, int) or isinstance(event, long):
event = Event.objects.get(pk = event)
else:
event = Event.objects.get(pk = int(event))
# TODO: the next code iterate throw all users but this is not workable
# for a big number of users: implement a special data structure which
# saves filters and can look up fast filters matching an event
# TODO: show a diff of the changes
users = User.objects.all()
for user in users:
user_filters = Filter.objects.filter( user = user ).filter(
email = True)
for fil in user_filters:
if not fil.matches_event( event ):
continue
context = {
'username': user.username,
'event': event,
'filter': fil,
'site_name': Site.objects.get_current().name,
'site_domain': Site.objects.get_current().domain, }
# TODO: create the subject from a text template
subject = _(u'filter match: ') + event.title
# TODO: use a preferred language setting for users to send
# emails to them in this language
message = render_to_string( 'mail/event_notice.txt', context )
from_email = settings.DEFAULT_FROM_EMAIL
if subject and message and from_email and user.email:
try:
if ( not settings.DEBUG ) or user.username in \
settings.USERNAMES_TO_MAIL_WHEN_DEBUGGING:
send_mail( subject, message, from_email,
[user.email,], fail_silently = False )
except (BadHeaderError, SMTPConnectError), err:
logger.error(u'SMTP error while trying to send '
'notificationsemail - %s'%err)
except:
logger.error(u'Unexpected error while trying to send '
'notifications - %s'%traceback.format_exc())
else:
# FIXME: do something meaningfull, e.g. error log
pass
评论列表
文章目录