You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
2.0 KiB
61 lines
2.0 KiB
# -*- coding: utf-8 -*-
|
|
|
|
from django.contrib import messages
|
|
from django.shortcuts import get_object_or_404, redirect
|
|
from django.utils.html import strip_tags
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from django.views.generic import FormView
|
|
|
|
from .forms import FormBuilder
|
|
from .models import FormDefinition
|
|
from .signals import form_submission
|
|
from .uploads import handle_uploaded_files
|
|
from .utils import hashid_to_int
|
|
|
|
try:
|
|
from django.http import JsonResponse
|
|
except ImportError:
|
|
from .compat import JsonResponse
|
|
|
|
|
|
class FormSubmission(FormView):
|
|
form_class = FormBuilder
|
|
http_method_names = ['post']
|
|
|
|
def get_form_kwargs(self):
|
|
form_kwargs = super(FormSubmission, self).get_form_kwargs()
|
|
form_id = hashid_to_int(self.request.POST.get('form_id'))
|
|
form_definition = get_object_or_404(FormDefinition, pk=form_id)
|
|
form_kwargs.update({
|
|
'form_definition': form_definition
|
|
})
|
|
return form_kwargs
|
|
|
|
def form_valid(self, form, *args, **kwargs):
|
|
form.files = handle_uploaded_files(form)
|
|
form.save(request=self.request)
|
|
form_submission.send(
|
|
sender=self.__class__,
|
|
form=form.form_definition,
|
|
cleaned_data=form.cleaned_data)
|
|
|
|
if self.request.is_ajax():
|
|
response = {
|
|
'status': 'success',
|
|
'redirect_url': form.redirect_url
|
|
}
|
|
return JsonResponse(response)
|
|
else:
|
|
messages.success(self.request, strip_tags(form.form_definition.post_submit_msg))
|
|
return redirect(form.redirect_url or form.cleaned_data['current_page'])
|
|
|
|
def form_invalid(self, form, *args, **kwargs):
|
|
if self.request.is_ajax():
|
|
response = {
|
|
'status': 'error',
|
|
'form_errors': form.errors,
|
|
}
|
|
return JsonResponse(response)
|
|
else:
|
|
messages.error(self.request, _(u'Invalid form data, one or more fields had errors'))
|
|
return redirect(form.cleaned_data['current_page'])
|
|
|