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

# -*- 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'])