From 9c0ae68462805db398cb89762a7d5aa4704eefca Mon Sep 17 00:00:00 2001 From: Hans Andersen Date: Tue, 1 May 2018 11:49:34 +0200 Subject: [PATCH 1/5] Added support for email reply to with dynamic placeholders based of every other form field --- djangocms_forms/cms_plugins.py | 6 ++--- djangocms_forms/forms.py | 15 ++++++++++- .../0006_formfield_email_reply_to.py | 26 +++++++++++++++++++ djangocms_forms/models.py | 7 ++++- 4 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 djangocms_forms/migrations/0006_formfield_email_reply_to.py diff --git a/djangocms_forms/cms_plugins.py b/djangocms_forms/cms_plugins.py index 966f09f..59cf3b1 100644 --- a/djangocms_forms/cms_plugins.py +++ b/djangocms_forms/cms_plugins.py @@ -31,8 +31,8 @@ class FormFieldInline(admin.StackedInline): def get_fieldsets(self, request, obj=None): fields = ( ('label', 'field_type', 'required'), - 'initial', 'placeholder_text', 'help_text', - 'choice_values', 'position', + 'initial', 'placeholder_text', 'help_text', + 'choice_values', 'position', ) if settings.DJANGOCMS_FORMS_ALLOW_CUSTOM_FIELD_NAME: @@ -101,7 +101,7 @@ def get_fieldsets(self, request, obj=None): 'Choose storage options to capture form data. You can enter ' 'an email address to have the form submissions emailed to you or ' 'log all the form submissions to the database.', - 'fields': ('email_to', 'email_from', 'email_subject', + 'fields': ('email_to', 'email_from', 'email_reply_to', 'email_subject', 'email_uploaded_files', 'save_data', 'spam_protection', ), }), ) diff --git a/djangocms_forms/forms.py b/djangocms_forms/forms.py index 1f514e4..b2e9f58 100644 --- a/djangocms_forms/forms.py +++ b/djangocms_forms/forms.py @@ -341,6 +341,7 @@ def save_to_db(self, form_data, request, referrer): def email_submission(self, form_data, request, referrer): mail_to = re.compile('\s*[,;]+\s*').split(self.form_definition.email_to) mail_from = self.form_definition.email_from or None + mail_reply_to = self.form_definition.email_reply_to or None mail_subject = self.form_definition.email_subject or \ 'Form Submission - %s' % self.form_definition.name context = { @@ -352,10 +353,22 @@ def email_submission(self, form_data, request, referrer): 'recipients': mail_to, } + for field in form_data: + if mail_reply_to: + mail_reply_to = mail_reply_to.replace('{{{0}}}'.format(field['label']), + field['value']) + + mail_subject = mail_subject.replace('{{{0}}}'.format(field['label']), + field['value']) + + if mail_reply_to: + mail_reply_to = (mail_reply_to,) + message = render_to_string('djangocms_forms/email_template/email.txt', context) message_html = render_to_string('djangocms_forms/email_template/email.html', context) - email = EmailMultiAlternatives(mail_subject, message, mail_from, mail_to) + email = EmailMultiAlternatives(mail_subject, message, mail_from, mail_to, + reply_to=mail_reply_to) email.attach_alternative(message_html, 'text/html') if self.form_definition.email_uploaded_files: diff --git a/djangocms_forms/migrations/0006_formfield_email_reply_to.py b/djangocms_forms/migrations/0006_formfield_email_reply_to.py new file mode 100644 index 0000000..71ed3a0 --- /dev/null +++ b/djangocms_forms/migrations/0006_formfield_email_reply_to.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.12 on 2018-05-01 09:46 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('djangocms_forms', '0005_formfield_field_name'), + ] + + operations = [ + migrations.AddField( + model_name='formdefinition', + name='email_reply_to', + field=models.CharField(blank=True, help_text='Reply to e-mail header. Use form field values by inserting placeholders of field names, e.g. "{my name field} <{my email field}>"', max_length=255, verbose_name='Reply to'), + ), + migrations.AlterField( + model_name='formdefinition', + name='email_subject', + field=models.CharField(blank=True, help_text='Use form field values by inserting placeholders of field names, e.g. "{my subject}"', max_length=255, verbose_name='Email Subject'), + ), + ] diff --git a/djangocms_forms/models.py b/djangocms_forms/models.py index d56bc3b..e337b64 100644 --- a/djangocms_forms/models.py +++ b/djangocms_forms/models.py @@ -70,7 +70,12 @@ class FormDefinition(CMSPlugin): _('Send form data to e-mail address'), max_length=255, blank=True, help_text=_('Separate several addresses with a comma.')) email_from = models.EmailField(_('Sender Email Address'), max_length=255, blank=True) - email_subject = models.CharField(_('Email Subject'), max_length=255, blank=True) + email_reply_to = models.CharField(_('Reply to'), max_length=255, blank=True, + help_text=_('Reply to e-mail header. Use form field values by inserting placeholders of ' + 'field names, e.g. "{my name field} <{my email field}>"')) + email_subject = models.CharField(_('Email Subject'), max_length=255, blank=True, + help_text=_('Use form field values by inserting placeholders of ' + 'field names, e.g. "{my subject}"')) email_uploaded_files = models.BooleanField( _('Send uploaded files as email attachments'), default=True) From 7adeb79e60d6a12b6ab2696653d3e5a438af2b44 Mon Sep 17 00:00:00 2001 From: Hans Andersen Date: Mon, 28 May 2018 08:59:43 +0200 Subject: [PATCH 2/5] Fixed HTML linebreaks --- .../templates/djangocms_forms/email_template/email.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/djangocms_forms/templates/djangocms_forms/email_template/email.html b/djangocms_forms/templates/djangocms_forms/email_template/email.html index 6965263..324ad04 100755 --- a/djangocms_forms/templates/djangocms_forms/email_template/email.html +++ b/djangocms_forms/templates/djangocms_forms/email_template/email.html @@ -11,7 +11,7 @@

{{ form.title }}

{% for item in form_data %}

{% if item.label %}{{ item.label }}{% else %}{{ item.name }}{% endif %}:
- {{ item.value|friendly|default_if_none:'—' }} + {{ item.value|friendly|default_if_none:'—'|linebreaksbr }}

{% endfor %} {% trans 'Sent via' %} {{ request.get_host }}{{ referrer }} From 5b3a30c692fec49fb2b89ea5715def5457e0d30b Mon Sep 17 00:00:00 2001 From: Scott Clark Date: Fri, 8 Feb 2019 12:19:19 -0500 Subject: [PATCH 3/5] str.replace() will error if field['value'] is not a str type --- djangocms_forms/forms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/djangocms_forms/forms.py b/djangocms_forms/forms.py index b2e9f58..73a5841 100644 --- a/djangocms_forms/forms.py +++ b/djangocms_forms/forms.py @@ -356,10 +356,10 @@ def email_submission(self, form_data, request, referrer): for field in form_data: if mail_reply_to: mail_reply_to = mail_reply_to.replace('{{{0}}}'.format(field['label']), - field['value']) + str(field['value'])) mail_subject = mail_subject.replace('{{{0}}}'.format(field['label']), - field['value']) + str(field['value'])) if mail_reply_to: mail_reply_to = (mail_reply_to,) From 649571c4095b0b32ef216688edab7c12f9bdc24a Mon Sep 17 00:00:00 2001 From: Lasse Nielsen Date: Thu, 14 Feb 2019 15:01:36 +0100 Subject: [PATCH 4/5] Fixed bug where reCAPTCHA doesn't render on page --- .../static/js/djangocms_forms/jquery.djangocms-forms.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/djangocms_forms/static/js/djangocms_forms/jquery.djangocms-forms.js b/djangocms_forms/static/js/djangocms_forms/jquery.djangocms-forms.js index 636a673..aa80cd2 100644 --- a/djangocms_forms/static/js/djangocms_forms/jquery.djangocms-forms.js +++ b/djangocms_forms/static/js/djangocms_forms/jquery.djangocms-forms.js @@ -46,7 +46,7 @@ $(this).ajaxSubmit(ajaxOptions); }); - if (typeof(grecaptcha) == 'undefined') { + if (typeof(grecaptcha) == 'undefined') || typeof(grecaptcha.render) =='undefined') { { window.reCapctchaOnloadCallback = function() { this.renderReCaptcha(); }.bind(this); From b16001e878f4fdba1fa45ef65b18552dbc9d3b2d Mon Sep 17 00:00:00 2001 From: Lasse Nielsen Date: Fri, 15 Feb 2019 09:09:19 +0100 Subject: [PATCH 5/5] Update jquery.djangocms-forms.js --- .../static/js/djangocms_forms/jquery.djangocms-forms.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/djangocms_forms/static/js/djangocms_forms/jquery.djangocms-forms.js b/djangocms_forms/static/js/djangocms_forms/jquery.djangocms-forms.js index aa80cd2..e0dd9b9 100644 --- a/djangocms_forms/static/js/djangocms_forms/jquery.djangocms-forms.js +++ b/djangocms_forms/static/js/djangocms_forms/jquery.djangocms-forms.js @@ -46,7 +46,7 @@ $(this).ajaxSubmit(ajaxOptions); }); - if (typeof(grecaptcha) == 'undefined') || typeof(grecaptcha.render) =='undefined') { { + if (typeof(grecaptcha) == 'undefined') || typeof(grecaptcha.render) =='undefined') { window.reCapctchaOnloadCallback = function() { this.renderReCaptcha(); }.bind(this);