page_processors.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from __future__ import unicode_literals
  2. from django.shortcuts import redirect
  3. from django.template import RequestContext
  4. from mezzanine.conf import settings
  5. from mezzanine.forms.forms import FormForForm
  6. from mezzanine.forms.models import Form
  7. from mezzanine.forms.signals import form_invalid, form_valid
  8. from mezzanine.pages.page_processors import processor_for
  9. from mezzanine.utils.email import split_addresses, send_mail_template
  10. from mezzanine.utils.views import is_spam
  11. def format_value(value):
  12. """
  13. Convert a list into a comma separated string, for displaying
  14. select multiple values in emails.
  15. """
  16. if isinstance(value, list):
  17. value = ", ".join([v.strip() for v in value])
  18. return value
  19. @processor_for(Form)
  20. def form_processor(request, page):
  21. """
  22. Display a built form and handle submission.
  23. """
  24. form = FormForForm(page.form, RequestContext(request),
  25. request.POST or None, request.FILES or None)
  26. if form.is_valid():
  27. url = page.get_absolute_url() + "?sent=1"
  28. if is_spam(request, form, url):
  29. return redirect(url)
  30. attachments = []
  31. for f in form.files.values():
  32. f.seek(0)
  33. attachments.append((f.name, f.read()))
  34. entry = form.save()
  35. subject = page.form.email_subject
  36. if not subject:
  37. subject = "%s - %s" % (page.form.title, entry.entry_time)
  38. fields = [(v.label, format_value(form.cleaned_data[k]))
  39. for (k, v) in form.fields.items()]
  40. context = {
  41. "fields": fields,
  42. "message": page.form.email_message,
  43. "request": request,
  44. }
  45. email_from = page.form.email_from or settings.DEFAULT_FROM_EMAIL
  46. email_to = form.email_to()
  47. if email_to and page.form.send_email:
  48. send_mail_template(subject, "email/form_response", email_from,
  49. email_to, context)
  50. headers = None
  51. if email_to:
  52. # Add the email entered as a Reply-To header
  53. headers = {'Reply-To': email_to}
  54. email_copies = split_addresses(page.form.email_copies)
  55. if email_copies:
  56. send_mail_template(subject, "email/form_response_copies",
  57. email_from, email_copies, context,
  58. attachments=attachments, headers=headers)
  59. form_valid.send(sender=request, form=form, entry=entry)
  60. return redirect(url)
  61. form_invalid.send(sender=request, form=form)
  62. return {"form": form}