fix: preserve request actions and soften test-mode mail failures

This commit is contained in:
Md Bayazid Bostame
2026-03-30 12:41:40 +02:00
parent ca9e890b0b
commit bce58b3f25
3 changed files with 46 additions and 8 deletions

View File

@@ -1,5 +1,6 @@
from datetime import timedelta from datetime import timedelta
from pathlib import Path from pathlib import Path
import logging
from django.conf import settings from django.conf import settings
from django.utils import timezone from django.utils import timezone
@@ -11,6 +12,8 @@ from .forms import OnboardingRequestForm
from .models import NotificationRule, NotificationTemplate, OnboardingRequest, ScheduledWelcomeEmail, WorkflowConfig from .models import NotificationRule, NotificationTemplate, OnboardingRequest, ScheduledWelcomeEmail, WorkflowConfig
from .services import get_email_test_redirect, is_email_test_mode from .services import get_email_test_redirect, is_email_test_mode
logger = logging.getLogger(__name__)
def resolve_workflow_emails() -> tuple[str, str, str, str, str]: def resolve_workflow_emails() -> tuple[str, str, str, str, str]:
config = WorkflowConfig.objects.order_by('id').first() config = WorkflowConfig.objects.order_by('id').first()
@@ -42,13 +45,19 @@ def send_workflow_email(
f"Originale Empfänger: {', '.join(recipients)}\n\n{body}" f"Originale Empfänger: {', '.join(recipients)}\n\n{body}"
) )
send_system_email( try:
subject=subject, send_system_email(
body=effective_body, subject=subject,
to=effective_to, body=effective_body,
attachments=[str(a) for a in (attachments or [])], to=effective_to,
from_email=from_email, attachments=[str(a) for a in (attachments or [])],
) from_email=from_email,
)
except OSError as exc:
if is_email_test_mode():
logger.warning('Email send skipped in test mode because SMTP is unavailable: %s', exc)
return
raise
def render_notification_template(template_key: str, context: dict, language_code: str | None = None) -> tuple[str, str]: def render_notification_template(template_key: str, context: dict, language_code: str | None = None) -> tuple[str, str]:

View File

@@ -54,6 +54,7 @@
const form = event.target; const form = event.target;
const message = form.dataset.confirm; const message = form.dataset.confirm;
if (!message || form.dataset.confirmBypass === '1') return; if (!message || form.dataset.confirmBypass === '1') return;
const submitter = event.submitter || null;
event.preventDefault(); event.preventDefault();
open(message).then(function (confirmed) { open(message).then(function (confirmed) {
if (!confirmed) return; if (!confirmed) return;
@@ -62,7 +63,7 @@
window.AppActionProgress.show(form); window.AppActionProgress.show(form);
} }
if (typeof form.requestSubmit === 'function') { if (typeof form.requestSubmit === 'function') {
form.requestSubmit(); form.requestSubmit(submitter || undefined);
} else { } else {
form.submit(); form.submit();
} }

View File

@@ -0,0 +1,28 @@
from pathlib import Path
from unittest.mock import patch
from django.test import TestCase, override_settings
from workflows.email_workflows import send_workflow_email
class SendWorkflowEmailTests(TestCase):
@override_settings(EMAIL_TEST_MODE=True, EMAIL_TEST_REDIRECT='test@example.com')
@patch('workflows.email_workflows.send_system_email', side_effect=ConnectionRefusedError('[Errno 111] Connection refused'))
def test_test_mode_suppresses_smtp_connection_errors(self, _mock_send_system_email):
send_workflow_email(
subject='Test',
body='Body',
to=['real@example.com'],
attachments=[Path('/tmp/test.pdf')],
)
@override_settings(EMAIL_TEST_MODE=False)
@patch('workflows.email_workflows.send_system_email', side_effect=ConnectionRefusedError('[Errno 111] Connection refused'))
def test_non_test_mode_keeps_smtp_connection_errors(self, _mock_send_system_email):
with self.assertRaises(ConnectionRefusedError):
send_workflow_email(
subject='Test',
body='Body',
to=['real@example.com'],
)