def _send_payment_received_email(invoice, locale): user = get_user_model().objects.get(stripe_customer_id=invoice.customer) subscription_info = retrieve_and_synchronize_subscription_info(user) locale = locale or settings.WIKI_DEFAULT_LANGUAGE context = { "payment_date": datetime.fromtimestamp(invoice.created), "next_payment_date": subscription_info["next_payment_at"], "invoice_number": invoice.number, "cost": invoice.total / 100, "credit_card_brand": subscription_info["brand"], "manage_subscription_url": absolutify(reverse("payment_management")), "faq_url": absolutify(reverse("payments_index")), "contact_email": settings.CONTRIBUTION_SUPPORT_EMAIL, } with translation.override(locale): subject = render_email("users/email/payment_received/subject.ltxt", context) # Email subject *must not* contain newlines subject = "".join(subject.splitlines()) plain = render_email("users/email/payment_received/plain.ltxt", context) send_mail_retrying( subject, plain, settings.DEFAULT_FROM_EMAIL, [user.email], attachment={ "name": os.path.basename(urlparse(invoice.invoice_pdf).path), "bytes": _download_from_url(invoice.invoice_pdf), "mime": "application/pdf", }, )
def send_recovery_email(user_pk, email, locale=None): user = get_user_model().objects.get(pk=user_pk) locale = locale or settings.WIKI_DEFAULT_LANGUAGE url = settings.SITE_URL + user.get_recovery_url() context = {"recovery_url": url, "username": user.username} with translation.override(locale): subject = render_email("users/email/recovery/subject.ltxt", context) # Email subject *must not* contain newlines subject = "".join(subject.splitlines()) plain = render_email("users/email/recovery/plain.ltxt", context) send_mail_retrying(subject, plain, settings.DEFAULT_FROM_EMAIL, [email])
def send_payment_received_email(stripe_customer_id, locale, timestamp, invoice_pdf): user = get_user_model().objects.get(stripe_customer_id=stripe_customer_id) locale = locale or settings.WIKI_DEFAULT_LANGUAGE context = { "payment_date": datetime.datetime.fromtimestamp(timestamp), "manage_subscription_url": absolutify(reverse("recurring_payment_management")), "faq_url": absolutify(reverse("payments_index")), "contact_email": settings.CONTRIBUTION_SUPPORT_EMAIL, "invoice_pdf": invoice_pdf, } with translation.override(locale): subject = render_email("users/email/payment_received/subject.ltxt", context) # Email subject *must not* contain newlines subject = "".join(subject.splitlines()) plain = render_email("users/email/payment_received/plain.ltxt", context) send_mail_retrying(subject, plain, settings.DEFAULT_FROM_EMAIL, [user.email])
def test_send_mail_retrying(settings): settings.EMAIL_BACKEND = "kuma.core.tests.test_utils.SMTPFlakyEmailBackend" send_mail_retrying( "Subject", "Message", "*****@*****.**", ["*****@*****.**"], retry_options={ "retry_exceptions": (SomeException, ), # Overriding defaults to avoid the test being slow. "sleeptime": 0.02, "jitter": 0.01, }, ) sent = mail.outbox[-1] # sanity check assert sent.subject == "Subject"
def move_page(locale, slug, new_slug, user_id): transaction.set_autocommit(False) User = get_user_model() try: user = User.objects.get(id=user_id) except User.DoesNotExist: transaction.rollback() logging.error("Page move failed: no user with id %s" % user_id) return try: doc = Document.objects.get(locale=locale, slug=slug) except Document.DoesNotExist: transaction.rollback() message = """ Page move failed. Move was requested for document with slug %(slug)s in locale %(locale)s, but no such document exists. """ % { "slug": slug, "locale": locale, } logging.error(message) send_mail_retrying( "Page move failed", textwrap.dedent(message), settings.DEFAULT_FROM_EMAIL, [user.email], ) transaction.set_autocommit(True) return try: doc._move_tree(new_slug, user=user) except PageMoveError as e: transaction.rollback() message = """ Page move failed. Move was requested for document with slug %(slug)s in locale %(locale)s, but could not be completed. Diagnostic info: %(message)s """ % { "slug": slug, "locale": locale, "message": e.message, } logging.error(message) send_mail_retrying( "Page move failed", textwrap.dedent(message), settings.DEFAULT_FROM_EMAIL, [user.email], ) transaction.set_autocommit(True) return except Exception as e: transaction.rollback() message = """ Page move failed. Move was requested for document with slug %(slug)s in locale %(locale)s, but could not be completed. %(info)s """ % { "slug": slug, "locale": locale, "info": e, } logging.error(message) send_mail_retrying( "Page move failed", textwrap.dedent(message), settings.DEFAULT_FROM_EMAIL, [user.email], ) transaction.set_autocommit(True) return transaction.commit() transaction.set_autocommit(True) # Now that we know the move succeeded, re-render the whole tree. for moved_doc in [doc] + doc.get_descendants(): moved_doc.schedule_rendering("max-age=0") subject = "Page move completed: " + slug + " (" + locale + ")" full_url = settings.SITE_URL + "/" + locale + "/docs/" + new_slug # Get the parent document, if parent doc is None, it means its the parent document parent_doc = doc.parent or doc other_locale_urls = [ settings.SITE_URL + translation.get_absolute_url() for translation in parent_doc.translations.exclude(locale=doc.locale).order_by( "locale" ) ] # If the document is a translation we should include the parent document url to the list if doc.parent: other_locale_urls = [ settings.SITE_URL + doc.parent.get_absolute_url() ] + other_locale_urls message = ( textwrap.dedent( """ Page move completed. The move requested for the document with slug %(slug)s in locale %(locale)s, and all its children, has been completed. The following localized articles may need to be moved also: %(locale_urls)s You can now view this document at its new location: %(full_url)s. """ ) % { "slug": slug, "locale": locale, "full_url": full_url, "locale_urls": "\n".join(other_locale_urls), } ) send_mail_retrying(subject, message, settings.DEFAULT_FROM_EMAIL, [user.email])