''' custom events and event subsribers ''' from pyramid.events import subscriber from pyramid.renderers import render from pyramid_mailer import get_mailer from pyramid_mailer.message import Message # custom events class UserNotification(object): ''' base class for user notification emails :param pyramid.request.Request request: current request object :param ordr.models.account.Users account: send notification to this user :param dict data: additional data to pass to the mail template :param str send_to: optional email address overriding user's email address ''' #: subject of the notification subject = None #: template to render template = None def __init__(self, request, account, data=None, send_to=None): self.request = request self.account = account self.data = data self.send_to = send_to or account.email class ActivationNotification(UserNotification): ''' user notification for account activation ''' subject = '[ordr] Your account was activated' template = 'ordr:templates/emails/activation.jinja2' class ChangeEmailNotification(UserNotification): ''' user notification for verifying a change of the mail address ''' subject = '[ordr] Verify New Email Address' template = 'ordr:templates/emails/email_change.jinja2' class OrderStatusNotification(UserNotification): ''' user notification for order status change ''' subject = '[ordr] Order Status Change' template = 'ordr:templates/emails/order.jinja2' class PasswordResetNotification(UserNotification): ''' user notification for password reset link ''' subject = '[ordr] Password Reset' template = 'ordr:templates/emails/password_reset.jinja2' class RegistrationNotification(UserNotification): ''' user notification for account activation ''' subject = '[ordr] Please verify your email address' template = 'ordr:templates/emails/registration.jinja2' # subsribers for events @subscriber(UserNotification) def notify_user(event): ''' notify a user about an event ''' body = render( event.template, {'user': event.account, 'data': event.data}, event.request ) message = Message( subject=event.subject, sender=event.request.registry.settings['mail.default_sender'], recipients=[event.send_to], html=body ) mailer = get_mailer(event.request.registry) mailer.send(message)