Skip to content

Commit 743714b

Browse files
authored
fix: Send mail action failed (#21)
* Fix: send_mail parameters were incorrect * Add test for send mail action * Also test for mail admins
1 parent f7e2413 commit 743714b

File tree

2 files changed

+78
-7
lines changed

2 files changed

+78
-7
lines changed

djangocms_form_builder/actions.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from django import forms
44
from django.apps import apps
55
from django.core.exceptions import ImproperlyConfigured
6-
from django.core.mail import mail_admins, send_mail
76
from django.core.validators import EmailValidator
87
from django.template import TemplateDoesNotExist
98
from django.template.loader import render_to_string
@@ -186,14 +185,16 @@ class Meta:
186185
)
187186

188187
def execute(self, form, request):
189-
recipients = (self.get_parameter(form, "sendemail_recipients") or [])
188+
from django.core.mail import mail_admins, send_mail
189+
190+
recipients = (self.get_parameter(form, "sendemail_recipients") or "").split()
190191
template_set = self.get_parameter(form, "sendemail_template") or "default"
191192
context = dict(
192193
cleaned_data=form.cleaned_data,
193194
form_name=getattr(form.Meta, "verbose_name", ""),
194195
user=request.user,
195-
user_agent=request.headers["User-Agent"],
196-
referer=request.headers["Referer"],
196+
user_agent=request.headers["User-Agent"] if "User-Agent" in request.headers else "",
197+
referer=request.headers["Referer"] if "Referer" in request.headers else "",
197198
)
198199

199200
html_message = render_to_string(f"djangocms_form_builder/mails/{template_set}/mail_html.html", context)
@@ -205,19 +206,20 @@ def execute(self, form, request):
205206
subject = render_to_string(f"djangocms_form_builder/mails/{template_set}/subject.txt", context)
206207
except TemplateDoesNotExist:
207208
subject = self.subject % dict(form_name=context["form_name"])
209+
208210
if not recipients:
209-
mail_admins(
211+
return mail_admins(
210212
subject,
211213
message,
212214
fail_silently=True,
213215
html_message=html_message,
214216
)
215217
else:
216-
send_mail(
218+
return send_mail(
217219
subject,
218220
message,
219-
recipients,
220221
self.from_mail,
222+
recipients,
221223
fail_silently=True,
222224
html_message=html_message,
223225
)

tests/test_actions.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
from unittest.mock import patch
2+
3+
from cms.api import add_plugin
4+
from cms.test_utils.testcases import CMSTestCase
5+
6+
from djangocms_form_builder.actions import get_registered_actions
7+
8+
from .fixtures import TestFixture
9+
10+
11+
class ActionTestCase(TestFixture, CMSTestCase):
12+
def setUp(self):
13+
super().setUp()
14+
self.actions = get_registered_actions()
15+
self.save_action = [key for key, value in self.actions if value == "Save form submission"][0]
16+
self.send_mail_action = [key for key, value in self.actions if value == "Send email"][0]
17+
18+
def test_send_mail_action(self):
19+
plugin_instance = add_plugin(
20+
placeholder=self.placeholder,
21+
plugin_type="FormPlugin",
22+
language=self.language,
23+
form_name="test_form",
24+
)
25+
plugin_instance.action_parameters = {"sendemail_recipients": "[email protected] [email protected]", "sendemail_template": "default"}
26+
plugin_instance.form_actions = f"[\"{self.send_mail_action}\"]"
27+
plugin_instance.save()
28+
29+
child_plugin = add_plugin(
30+
placeholder=self.placeholder,
31+
plugin_type="CharFieldPlugin",
32+
language=self.language,
33+
target=plugin_instance,
34+
config={"field_name": "field1"}
35+
)
36+
child_plugin.save()
37+
plugin_instance.child_plugin_instances = [child_plugin]
38+
child_plugin.child_plugin_instances = []
39+
40+
plugin = plugin_instance.get_plugin_class_instance()
41+
plugin.instance = plugin_instance
42+
43+
# Simulate form submission
44+
with patch("django.core.mail.send_mail") as mock_send_mail:
45+
form = plugin.get_form_class()({}, request=self.get_request("/"))
46+
form.cleaned_data = {"field1": "value1", "field2": "value2"}
47+
form.save()
48+
49+
# Validate send_mail call
50+
mock_send_mail.assert_called_once()
51+
args, kwargs = mock_send_mail.call_args
52+
self.assertEqual(args[0], 'Test form form submission')
53+
self.assertIn('Form submission', args[1])
54+
self.assertEqual(args[3], ['[email protected]', '[email protected]'])
55+
56+
# Test with no recipients
57+
plugin_instance.action_parameters = {"sendemail_recipients": "", "sendemail_template": "default"}
58+
plugin_instance.save()
59+
60+
with patch("django.core.mail.mail_admins") as mock_mail_admins:
61+
form = plugin.get_form_class()({}, request=self.get_request("/"))
62+
form.cleaned_data = {"field1": "value1", "field2": "value2"}
63+
form.save()
64+
65+
# Validate mail_admins call
66+
mock_mail_admins.assert_called_once()
67+
args, kwargs = mock_mail_admins.call_args
68+
self.assertEqual(args[0], 'Test form form submission')
69+
self.assertIn('Form submission', args[1])

0 commit comments

Comments
 (0)