from cms.plugin_base import CMSPluginBase from cms.plugin_pool import plugin_pool from django import forms from django.contrib import admin from django.db import models from django.template.loader import select_template from django.utils.translation import ugettext_lazy as _ from .conf import settings from .forms import FormBuilder, FormDefinitionAdminForm, FormFieldInlineForm from .models import FormDefinition, FormField, FormSubmission class FormFieldInline(admin.StackedInline): model = FormField form = FormFieldInlineForm extra = 0 fieldsets = ( (None, { 'fields': (('label', 'field_type', 'required'), 'initial', 'placeholder_text', 'help_text', 'choice_values', 'position', ) }), ) formfield_overrides = { models.TextField: { 'widget': forms.Textarea( attrs={'rows': 4, 'cols': 50}) }, } class Media: css = { 'all': ('css/djangocms_forms/admin/djangocms_forms.css',) } js = ( 'js/djangocms_forms/libs/jquery.min.js', 'js/djangocms_forms/libs/jquery-ui.min.js', 'js/djangocms_forms/admin/jquery-inline-positioning.js', 'js/djangocms_forms/admin/jquery-inline-rename.js', 'js/djangocms_forms/admin/jquery-inline-collapsible.js', 'js/djangocms_forms/admin/jquery-inline-toggle-fields.js', ) class FormPlugin(CMSPluginBase): name = settings.DJANGOCMS_FORMS_PLUGIN_NAME module = settings.DJANGOCMS_FORMS_PLUGIN_MODULE model = FormDefinition cache = False form = FormDefinitionAdminForm inlines = (FormFieldInline, ) render_template = settings.DJANGOCMS_FORMS_DEFAULT_TEMPLATE def get_fieldsets(self, request, obj=None): if settings.DJANGOCMS_FORMS_FIELDSETS: return settings.DJANGOCMS_FORMS_FIELDSETS fieldsets = ( (None, {'fields': ('name', )}), (None, { 'description': _('The Title and Description ' 'will display above the input fields and Submit button.'), 'fields': ('title', 'description', ) }), (None, { 'description': _('By default, the Submit Button will say Submit. ' 'You can change this to say whatever you want'), 'fields': ('submit_btn_txt', 'form_template', ) }), (None, { 'description': _('You can also change the message that appears after someone ' 'submits your form. ' 'By default, this says Thank you!, ' 'but you are welcome to change this text as well.'), 'fields': ('post_submit_msg', ) }), (None, { 'fields': ('success_redirect', ('page_redirect', 'external_redirect'), ), }), (None, { 'description': 'Submission Settings — ' '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', 'email_uploaded_files', 'save_data', ), }), ) return fieldsets def get_render_template(self, context, instance, placeholder): # returns the first template that exists, falling back to bundled template return select_template([ instance.form_template, settings.DJANGOCMS_FORMS_DEFAULT_TEMPLATE, 'djangocms_forms/form_template/default.html' ]) def render(self, context, instance, placeholder): context = super(FormPlugin, self).render(context, instance, placeholder) request = context['request'] try: form_slug = "form-%d" % instance.plugin_reference.id except: form_slug = "" submission_instance = instance if request.session.get(form_slug, False): try: submission_instance = FormSubmission.objects.get(id=request.session.get(form_slug, False)) except: pass form = FormBuilder( initial={'referrer': request.path_info}, form_definition=instance, label_suffix='', auto_id='%s') context.update({ 'form': form, 'results': submission_instance }) return context plugin_pool.register_plugin(FormPlugin) class FormResultsPlugin(CMSPluginBase): name = 'Form Results' module = settings.DJANGOCMS_FORMS_PLUGIN_MODULE cache = False render_template = 'djangocms_forms/form_template/results.html' def render(self, context, instance, placeholder): context = super(FormResultsPlugin, self).render(context, instance, placeholder) request = context['request'] if request.session.get('last-completed-form-id', False): try: form_instance = FormSubmission.objects.get(id=request.session.get('last-completed-form-id', False)) context['results'] = form_instance except (FormSubmission.DoesNotExist): pass return context plugin_pool.register_plugin(FormResultsPlugin)