You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.8 KiB
112 lines
2.8 KiB
from collections import namedtuple |
|
|
|
from pyramid.events import BeforeRender, subscriber |
|
from pyramid.renderers import render |
|
from pyramid_mailer.message import Message |
|
|
|
SerializableFlashMessage = namedtuple( |
|
"SerializableFlashMessage", ["text", "more"] |
|
) |
|
|
|
|
|
class Ordr3Event: |
|
def __init__(self): |
|
self.request = None |
|
|
|
|
|
class FlashMessage(Ordr3Event): |
|
def __init__(self, channel, text, more): |
|
super().__init__() |
|
self.channel = channel |
|
self.text = text |
|
self.more = more |
|
|
|
@classmethod |
|
def info(cls, text, more=""): |
|
return cls("info", text, more) |
|
|
|
@classmethod |
|
def warning(cls, text, more=""): |
|
return cls("warning", text, more) |
|
|
|
@classmethod |
|
def error(cls, text, more=""): |
|
return cls("error", text, more) |
|
|
|
|
|
class EmailNotification(Ordr3Event): |
|
""" base class for user notifications """ |
|
|
|
subject = None |
|
template = None |
|
|
|
def __init__(self, user, data=None): |
|
super().__init__() |
|
self.user = user |
|
self.data = data |
|
|
|
|
|
class AccountActivationEmail(EmailNotification): |
|
""" user notification for account activation """ |
|
|
|
subject = "[ordr] Your account was activated" |
|
template = "ordr3:templates/emails/activation.jinja2" |
|
|
|
|
|
class OrderStatusChangeEmail(EmailNotification): |
|
""" user notification for order status change """ |
|
|
|
subject = "[ordr] Order Status Change" |
|
template = "ordr3:templates/emails/status_change.jinja2" |
|
|
|
|
|
class PasswordResetEmail(EmailNotification): |
|
""" user notification for password reset link """ |
|
|
|
subject = "[ordr] Password Reset" |
|
template = "ordr3:templates/emails/password_reset.jinja2" |
|
|
|
|
|
@subscriber(FlashMessage) |
|
def handle_flash_message_event(event): |
|
if event.request is None: |
|
return |
|
session = event.request.session |
|
message = SerializableFlashMessage(event.text, event.more) |
|
print(message) |
|
session.flash(message, event.channel, allow_duplicate=False) |
|
|
|
|
|
@subscriber(EmailNotification) |
|
def notify_user(event): |
|
""" notify a user about an event """ |
|
body = render( |
|
event.template, {"user": event.user, "data": event.data}, event.request |
|
) |
|
message = Message( |
|
subject=event.subject, |
|
sender=event.request.registry.settings["mail.default_sender"], |
|
recipients=[event.user.email], |
|
body=body, |
|
) |
|
event.request.mailer.send(message) |
|
|
|
|
|
@subscriber(BeforeRender) |
|
def add_global(event): |
|
request = event["request"] |
|
if not request.is_xhr: |
|
event.rendering_val["new_user_badge"] = request.repo.count_new_users() |
|
|
|
|
|
def emit(request, event): |
|
event.request = request |
|
request.registry.notify(event) |
|
|
|
|
|
def includeme(config): |
|
"""initializing Events sytem for the Pyramid app |
|
|
|
Activate this setup using ``config.include('ordr2.events')``. |
|
""" |
|
config.add_request_method(emit, "emit")
|
|
|