diff --git a/cmsplugin_contact_plus/admin.py b/cmsplugin_contact_plus/admin.py index d75be22..fc54d54 100755 --- a/cmsplugin_contact_plus/admin.py +++ b/cmsplugin_contact_plus/admin.py @@ -8,7 +8,7 @@ class ExtraFieldInline(SortableTabularInline): model = ExtraField - fields = ('label', 'fieldType', 'initial', 'placeholder', 'required') + fields = ('label', 'fieldType', 'initial', 'placeholder', 'css_classes', 'required') class ContactFormPlusAdmin(NonSortableParentAdmin): diff --git a/cmsplugin_contact_plus/cms_plugins.py b/cmsplugin_contact_plus/cms_plugins.py index 9e79bc3..550f039 100755 --- a/cmsplugin_contact_plus/cms_plugins.py +++ b/cmsplugin_contact_plus/cms_plugins.py @@ -1,4 +1,5 @@ from django.utils.translation import ugettext_lazy as _ +from django.contrib import messages from django.conf import settings from cms.plugin_base import CMSPluginBase from cms.plugin_pool import plugin_pool @@ -7,19 +8,21 @@ from cmsplugin_contact_plus.models import ContactPlus from cmsplugin_contact_plus.forms import ContactFormPlus +from .exceptions import MakeRedirectException + import time -def handle_uploaded_file(f, ts): +def handle_uploaded_file(f, ts): destination = open('%s/%s' % (settings.MEDIA_ROOT, ts + '-' + f.name), 'wb+') for chunk in f.chunks(): destination.write(chunk) destination.close() - - + + class CMSContactPlusPlugin(CMSPluginBase): - """ + """ """ model = ContactPlus inlines = [ExtraFieldInline, ] @@ -35,9 +38,9 @@ def render(self, context, instance, placeholder): self.render_template = instance.template if request.method == "POST" and "contact_plus_form_" + str(instance.id) in request.POST.keys(): - form = ContactFormPlus(contactFormInstance=instance, - request=request, - data=request.POST, + form = ContactFormPlus(contactFormInstance=instance, + request=request, + data=request.POST, files=request.FILES) if form.is_valid(): ts = str(int(time.time())) @@ -47,10 +50,8 @@ def render(self, context, instance, placeholder): handle_uploaded_file(f, ts) form.send(instance.recipient_email, request, ts, instance, form.is_multipart) - context.update({ - 'contact': instance, - }) - return context + messages.success(request, instance.thanks) + raise MakeRedirectException else: context.update({ 'contact': instance, @@ -58,7 +59,10 @@ def render(self, context, instance, placeholder): }) else: - form = ContactFormPlus(contactFormInstance=instance, request=request) + form = ContactFormPlus( + contactFormInstance=instance, + request=request, + ) context.update({ 'contact': instance, 'form': form, diff --git a/cmsplugin_contact_plus/exceptions.py b/cmsplugin_contact_plus/exceptions.py new file mode 100644 index 0000000..145f384 --- /dev/null +++ b/cmsplugin_contact_plus/exceptions.py @@ -0,0 +1,3 @@ + +class MakeRedirectException(Exception): + pass diff --git a/cmsplugin_contact_plus/forms.py b/cmsplugin_contact_plus/forms.py index df5758a..686a0ac 100755 --- a/cmsplugin_contact_plus/forms.py +++ b/cmsplugin_contact_plus/forms.py @@ -35,7 +35,7 @@ def __init__(self, contactFormInstance, request, *args, **kwargs): self.fields[slugify(extraField.label)] = forms.EmailField(label=extraField.label, initial=extraField.initial, widget=forms.TextInput( - attrs={'placeholder': extraField.placeholder} + attrs={'placeholder': extraField.placeholder, 'class': extraField.css_classes} ), required=extraField.required) elif extraField.fieldType == 'DecimalField': @@ -86,7 +86,7 @@ def __init__(self, contactFormInstance, request, *args, **kwargs): self.fields[slugify(extraField.label)] = forms.CharField(label=extraField.label, initial=extraField.initial, widget=forms.Textarea( - attrs={'placeholder': extraField.placeholder} + attrs={'placeholder': extraField.placeholder, 'class': extraField.css_classes} ), required=extraField.required) elif extraField.fieldType == 'auto_hidden_input': @@ -106,7 +106,9 @@ def __init__(self, contactFormInstance, request, *args, **kwargs): self.fields[slugify(extraField.label)] = MathCaptchaField( label=extraField.label, initial=extraField.initial, - required=True) + required=True, + ) + self.fields[slugify(extraField.label)].widget.attrs={'class': extraField.css_classes} elif extraField.fieldType == 'ReCaptcha': self.fields[slugify(extraField.label)] = ReCaptchaField( label=extraField.label, diff --git a/cmsplugin_contact_plus/middleware.py b/cmsplugin_contact_plus/middleware.py new file mode 100644 index 0000000..91e3992 --- /dev/null +++ b/cmsplugin_contact_plus/middleware.py @@ -0,0 +1,10 @@ +from django.http import HttpResponsePermanentRedirect +from .exceptions import MakeRedirectException + + +class ContactPlusMiddleware: + + def process_exception(self, request, exception): + if isinstance(exception, MakeRedirectException): + redirect_url= request.META['PATH_INFO'] + return HttpResponsePermanentRedirect(redirect_url) diff --git a/cmsplugin_contact_plus/migrations/0005_extrafield_css_classes.py b/cmsplugin_contact_plus/migrations/0005_extrafield_css_classes.py new file mode 100644 index 0000000..2706211 --- /dev/null +++ b/cmsplugin_contact_plus/migrations/0005_extrafield_css_classes.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2017-09-21 19:15 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cmsplugin_contact_plus', '0004_auto_20170410_1553'), + ] + + operations = [ + migrations.AddField( + model_name='extrafield', + name='css_classes', + field=models.CharField(blank=True, max_length=250, null=True, verbose_name='CSS classes'), + ), + ] diff --git a/cmsplugin_contact_plus/models.py b/cmsplugin_contact_plus/models.py index 2311938..7c18187 100755 --- a/cmsplugin_contact_plus/models.py +++ b/cmsplugin_contact_plus/models.py @@ -103,6 +103,8 @@ class ExtraField(SortableMixin): _('Inital Value'), max_length=250, blank=True, null=True) placeholder = models.CharField( _('Placeholder Value'), max_length=250, blank=True, null=True) + css_classes = models.CharField( + _('CSS classes'), max_length=250, blank=True, null=True) required = models.BooleanField( _('Mandatory field'), default=True) widget = models.CharField(