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.

utils.py 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import logging
  2. from django.core.mail import EmailMessage, EmailMultiAlternatives
  3. from django.core.urlresolvers import reverse
  4. from django.conf import settings
  5. from django.contrib.auth.tokens import default_token_generator
  6. from django.utils.http import urlsafe_base64_encode
  7. from django.utils.encoding import force_bytes
  8. from oscar.core.loading import get_model
  9. CommunicationEvent = get_model('order', 'CommunicationEvent')
  10. Email = get_model('customer', 'Email')
  11. class Dispatcher(object):
  12. def __init__(self, logger=None):
  13. if not logger:
  14. logger = logging.getLogger(__name__)
  15. self.logger = logger
  16. # Public API methods
  17. def dispatch_direct_messages(self, recipient, messages):
  18. """
  19. Dispatch one-off messages to explicitly specified recipient(s).
  20. """
  21. if messages['subject'] and messages['body']:
  22. self.send_email_messages(recipient, messages)
  23. def dispatch_order_messages(self, order, messages, event_type=None,
  24. **kwargs):
  25. """
  26. Dispatch order-related messages to the customer
  27. """
  28. if order.is_anonymous:
  29. if 'email_address' in kwargs:
  30. self.send_email_messages(kwargs['email_address'], messages)
  31. elif order.guest_email:
  32. self.send_email_messages(order.guest_email, messages)
  33. else:
  34. return
  35. else:
  36. self.dispatch_user_messages(order.user, messages)
  37. # Create order comms event for audit
  38. if event_type:
  39. CommunicationEvent._default_manager.create(order=order,
  40. event_type=event_type)
  41. def dispatch_user_messages(self, user, messages):
  42. """
  43. Send messages to a site user
  44. """
  45. if messages['subject'] and (messages['body'] or messages['html']):
  46. self.send_user_email_messages(user, messages)
  47. if messages['sms']:
  48. self.send_text_message(user, messages['sms'])
  49. # Internal
  50. def send_user_email_messages(self, user, messages):
  51. """
  52. Sends message to the registered user / customer and collects data in
  53. database
  54. """
  55. if not user.email:
  56. self.logger.warning("Unable to send email messages as user #%d has"
  57. " no email address", user.id)
  58. return
  59. email = self.send_email_messages(user.email, messages)
  60. # Is user is signed in, record the event for audit
  61. if email and user.is_authenticated():
  62. Email._default_manager.create(user=user,
  63. subject=email.subject,
  64. body_text=email.body,
  65. body_html=messages['html'])
  66. def send_email_messages(self, recipient, messages):
  67. """
  68. Plain email sending to the specified recipient
  69. """
  70. if hasattr(settings, 'OSCAR_FROM_EMAIL'):
  71. from_email = settings.OSCAR_FROM_EMAIL
  72. else:
  73. from_email = None
  74. # Determine whether we are sending a HTML version too
  75. if messages['html']:
  76. email = EmailMultiAlternatives(messages['subject'],
  77. messages['body'],
  78. from_email=from_email,
  79. to=[recipient])
  80. email.attach_alternative(messages['html'], "text/html")
  81. else:
  82. email = EmailMessage(messages['subject'],
  83. messages['body'],
  84. from_email=from_email,
  85. to=[recipient])
  86. self.logger.info("Sending email to %s" % recipient)
  87. email.send()
  88. return email
  89. def send_text_message(self, user, event_type):
  90. raise NotImplementedError
  91. def get_password_reset_url(user, token_generator=default_token_generator):
  92. """
  93. Generate a password-reset URL for a given user
  94. """
  95. kwargs = {
  96. 'token': token_generator.make_token(user),
  97. 'uidb64': urlsafe_base64_encode(force_bytes(user.id)),
  98. }
  99. return reverse('password-reset-confirm', kwargs=kwargs)
  100. def normalise_email(email):
  101. """
  102. The local part of an email address is case-sensitive, the domain part
  103. isn't. This function lowercases the host and should be used in all email
  104. handling.
  105. """
  106. clean_email = email.strip()
  107. if '@' in clean_email:
  108. local, host = clean_email.split('@')
  109. return local + '@' + host.lower()
  110. return clean_email