diff --git a/docs/developer/README.md b/docs/developer/README.md index 860140a96..7519da7a9 100644 --- a/docs/developer/README.md +++ b/docs/developer/README.md @@ -405,3 +405,9 @@ This function is triggered by the post_save event on the User model, designed to 1. For New Users: Upon the creation of a new user, it checks for an existing `Contact` by email. If no matching contact is found, it creates a new Contact using the user's details from Login.gov. If a matching contact is found, it associates this contact with the user. In cases where multiple contacts with the same email exist, it logs a warning and associates the first contact found. 2. For Existing Users: For users logging in subsequent times, the function ensures that any updates from Login.gov are applied to the associated User record. However, it does not alter any existing Contact records. + +## Disable email sending (toggling the disable_email_sending flag) +1. On the app, navigate to `\admin`. +2. Under models, click `Waffle flags`. +3. Click the `disable_email_sending` record. This should exist by default, if not - create one with that name. +4. (Important) Set the field `everyone` to `Yes`. This field overrides all other settings \ No newline at end of file diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 2d6559570..54f5e0dbb 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -2305,6 +2305,8 @@ class UserGroupAdmin(AuditedAdmin): class WaffleFlagAdmin(FlagAdmin): + """Custom admin implementation of django-waffle's Flag class""" + class Meta: """Contains meta information about this class""" @@ -2338,6 +2340,6 @@ admin.site.register(models.VerifiedByStaff, VerifiedByStaffAdmin) # Register our custom waffle implementations admin.site.register(models.WaffleFlag, WaffleFlagAdmin) -# Unregister Sample and Switch from the waffle library -admin.site.unregister(Sample) +# Unregister Switch and Sample from the waffle library admin.site.unregister(Switch) +admin.site.unregister(Sample) diff --git a/src/registrar/config/settings.py b/src/registrar/config/settings.py index 9f31ffc2c..3f3af135a 100644 --- a/src/registrar/config/settings.py +++ b/src/registrar/config/settings.py @@ -326,7 +326,7 @@ SERVER_EMAIL = "root@get.gov" # endregion # region: Waffle feature flags-----------------------------------------------------------### -# If Waffle encounters a reference to a flag that is not in the database, should Waffle create the flag? +# If Waffle encounters a reference to a flag that is not in the database, create the flag automagically. WAFFLE_CREATE_MISSING_FLAGS = True # The model that will be used to keep track of flags. Extends AbstractUserFlag. diff --git a/src/registrar/tests/test_emails.py b/src/registrar/tests/test_emails.py index 19e695932..52cbccb60 100644 --- a/src/registrar/tests/test_emails.py +++ b/src/registrar/tests/test_emails.py @@ -3,10 +3,12 @@ from unittest.mock import MagicMock from django.test import TestCase +from waffle.testutils import override_flag +from registrar.utility import email +from registrar.utility.email import send_templated_email from .common import completed_domain_request, less_console_noise from datetime import datetime -from registrar.utility import email import boto3_mocking # type: ignore @@ -15,6 +17,24 @@ class TestEmails(TestCase): self.mock_client_class = MagicMock() self.mock_client = self.mock_client_class.return_value + @boto3_mocking.patching + @override_flag("disable_email_sending", active=True) + def test_disable_email_flag(self): + """Test if the 'disable_email_sending' stops emails from being sent""" + with boto3_mocking.clients.handler_for("sesv2", self.mock_client_class): + expected_message = "Email sending is disabled due to" + with self.assertRaisesRegex(email.EmailSendingError, expected_message): + send_templated_email( + "test content", + "test subject", + "doesnotexist@igorville.com", + context={"domain_request": self}, + bcc_address=None, + ) + + # Assert that an email wasn't sent + self.assertFalse(self.mock_client.send_email.called) + @boto3_mocking.patching def test_submission_confirmation(self): """Submission confirmation email works.""" diff --git a/src/registrar/utility/email.py b/src/registrar/utility/email.py index 51d61355a..2959e1499 100644 --- a/src/registrar/utility/email.py +++ b/src/registrar/utility/email.py @@ -8,6 +8,7 @@ from django.template.loader import get_template from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText +from waffle import flag_is_active logger = logging.getLogger(__name__) @@ -35,6 +36,11 @@ def send_templated_email( Raises EmailSendingError if SES client could not be accessed """ + + if flag_is_active(None, "disable_email_sending") and not settings.IS_PRODUCTION: # type: ignore + message = "Could not send email. Email sending is disabled due to flag 'disable_email_sending'." + raise EmailSendingError(message) + template = get_template(template_name) email_body = template.render(context=context)