def run_worker(self, *args, **kwargs): current_time = datetime.utcnow() email_medium = get_medium() to_send = ( Email.objects.filter(scheduled__lte=current_time, sent__isnull=True) .select_related("event") .prefetch_related("recipients") ) # Fetch the contexts of every event so that they may be rendered context_loader.load_contexts_and_renderers([e.event for e in to_send], [email_medium]) default_from_email = get_from_email_address() emails = [] for email in to_send: to_email_addresses = get_subscribed_email_addresses(email) if to_email_addresses: text_message, html_message = email.render(email_medium) message = create_email_message( to_emails=to_email_addresses, from_email=email.from_address or default_from_email, subject=email.subject or extract_email_subject_from_html_content(html_message), text=text_message, html=html_message, ) emails.append(message) connection = mail.get_connection() connection.send_messages(emails) to_send.update(sent=current_time)
def convert_events_to_emails(): """ Converts unseen events to emails and marks them as seen. """ email_medium = get_medium() for event, targets in email_medium.events_targets(seen=False, mark_seen=True): Email.objects.create_email(event=event, recipients=targets)
def get_subscribed_email_addresses(email): """From an email object determine the appropriate email addresses. Excludes the addresses of those who unsubscribed from the email's type. Returns: A list of strings: email addresses. """ email_medium = get_medium() if email.subentity_type is not None: all_entities = list(email.send_to.get_sub_entities().is_any_type( email.subentity_type)) else: all_entities = [email.send_to] send_to = Subscription.objects.filter_not_subscribed(source=email.source, medium=email_medium, entities=all_entities) emails = [e.entity_meta['email'] for e in send_to] return emails
def test_custom(self): custom_medium_name = 'test-email' with self.settings(ENTITY_EMAILER_MEDIUM_NAME=custom_medium_name): call_command('add_email_medium') medium = get_medium() self.assertEqual(medium.name, custom_medium_name)
def test_default(self): call_command('add_email_medium') medium = get_medium() self.assertEqual(medium.name, 'email')