def form_detail(request, slug, template="forms/form_detail.html"): """ Display a built form and handle submission. """ published = Form.objects.published(for_user=request.user) form = get_object_or_404(published, slug=slug) if form.login_required and not request.user.is_authenticated(): return redirect("%s?%s=%s" % (settings.LOGIN_URL, REDIRECT_FIELD_NAME, urlquote(request.get_full_path()))) request_context = RequestContext(request) args = (form, request_context, request.POST or None, request.FILES or None) form_for_form = FormForForm(*args) if request.method == "POST": if not form_for_form.is_valid(): form_invalid.send(sender=request, form=form_for_form) else: entry = form_for_form.save() subject = form.email_subject if not subject: subject = "%s - %s" % (form.title, entry.entry_time) fields = [] for (k, v) in form_for_form.fields.items(): value = form_for_form.cleaned_data[k] if isinstance(value, list): value = ", ".join([i.strip() for i in value]) fields.append((v.label, value)) context = { "fields": fields, "message": form.email_message, "request": request, } email_from = form.email_from or settings.DEFAULT_FROM_EMAIL email_to = form_for_form.email_to() if email_to and form.send_email: send_mail_template(subject, "form_response", email_from, email_to, context=context, fail_silently=settings.DEBUG) email_copies = split_choices(form.email_copies) if email_copies: if email_to and SEND_FROM_SUBMITTER: # Send from the email entered. email_from = email_to attachments = [] for f in form_for_form.files.values(): f.seek(0) attachments.append((f.name, f.read())) send_mail_template(subject, "form_response", email_from, email_copies, context=context, attachments=attachments, fail_silently=settings.DEBUG) form_valid.send(sender=request, form=form_for_form, entry=entry) return redirect(reverse("form_sent", kwargs={"slug": form.slug})) context = {"form": form} return render_to_response(template, context, request_context)
def form_detail(request, slug, template="forms/form_detail.html", success_url=None): """ Display a built form and handle submission. """ published = Form.objects.published(for_user=request.user) form = get_object_or_404(published, slug=slug) if form.login_required and not request.user.is_authenticated(): return redirect("%s?%s=%s" % (settings.LOGIN_URL, REDIRECT_FIELD_NAME, urlquote(request.get_full_path()))) request_context = RequestContext(request) args = (form, request_context, request.POST or None, request.FILES or None) form_for_form = FormForForm(*args) if request.method == "POST": if not form_for_form.is_valid(): form_invalid.send(sender=request, form=form_for_form) else: entry = form_for_form.save() subject = form.email_subject if not subject: subject = "%s - %s" % (form.title, entry.entry_time) fields = [] for (k, v) in form_for_form.fields.items(): value = form_for_form.cleaned_data[k] if isinstance(value, list): value = ", ".join([i.strip() for i in value]) fields.append((v.label, value)) context = { "fields": fields, "message": form.email_message, "request": request, } email_from = form.email_from or settings.DEFAULT_FROM_EMAIL email_to = form_for_form.email_to() if email_to and form.send_email: send_mail_template(subject, "form_response", email_from, email_to, context=context, fail_silently=settings.DEBUG) email_copies = [e.strip() for e in form.email_copies.split(",") if e.strip()] if email_copies: if email_to and SEND_FROM_SUBMITTER: # Send from the email entered. email_from = email_to attachments = [] for f in form_for_form.files.values(): f.seek(0) attachments.append((f.name, f.read())) send_mail_template(subject, "form_response", email_from, email_copies, context=context, attachments=attachments, fail_silently=settings.DEBUG) form_valid.send(sender=request, form=form_for_form, entry=entry) if success_url is None: success_url = reverse("form_sent", kwargs={"slug": form.slug}) # Check to see if the POST data overrides the view's success_url argument. success_url = request.POST.get("success_url", success_url) return redirect(success_url) context = {"form": form} return render_to_response(template, context, request_context)
def render(self, context, instance, placeholder): request = context['request'] form = instance.form context.update({'form': form, 'published' : True, 'valid': False}) if form.login_required and not request.user.is_authenticated(): return context published = Form.objects.published(for_user=request.user) if USE_SITES: published = published.filter(sites=Site.objects.get_current()) if form not in published: context.update({'published': False}) return context form_for_form = FormForForm(form, context) form_for_form.fields['cms_form_id'] = forms.CharField(initial=form.id, widget=forms.HiddenInput) try: if request.method == 'POST' and int(request.POST.get('cms_form_id',0)) == form.id: form_for_form = FormForForm(form, context, request.POST, request.FILES) if form_for_form.is_valid(): context.update({'valid': True}) entry = form_for_form.save() fields = ["%s: %s" % (v.label, form_for_form.cleaned_data[k]) for (k, v) in form_for_form.fields.items()] subject = form.email_subject if not subject: subject = "%s - %s" % (form.title, entry.entry_time) body = "\n".join(fields) if form.email_message: body = "%s\n\n%s" % (form.email_message, body) email_from = form.email_from or settings.DEFAULT_FROM_EMAIL email_to = form_for_form.email_to() if email_to and form.send_email: msg = EmailMessage(subject, body, email_from, [email_to]) msg.send() email_from = email_to or email_from # Send from the email entered. email_copies = [e.strip() for e in form.email_copies.split(",") if e.strip()] if email_copies: msg = EmailMessage(subject, body, email_from, email_copies) for f in form_for_form.files.values(): f.seek(0) msg.attach(f.name, f.read()) msg.send() return context except ValueError: pass context.update({'form_for_form': form_for_form}) return context
def form_detail(request, slug, template="forms/form_detail.html"): """ Display a built form and handle submission. """ published = Form.objects.published(for_user=request.user) if USE_SITES: published = published.filter(sites=Site.objects.get_current()) form = get_object_or_404(published, slug=slug) if form.login_required and not request.user.is_authenticated(): return redirect("%s?%s=%s" % (settings.LOGIN_URL, REDIRECT_FIELD_NAME, urlquote(request.get_full_path()))) args = (form, request.POST or None, request.FILES or None) form_for_form = FormForForm(*args) if request.method == "POST": if not form_for_form.is_valid(): form_invalid.send(sender=request, form=form_for_form) else: entry = form_for_form.save() fields = [ "%s: %s" % (v.label, form_for_form.cleaned_data[k]) for (k, v) in form_for_form.fields.items() ] subject = form.email_subject if not subject: subject = "%s - %s" % (form.title, entry.entry_time) body = "\n".join(fields) if form.email_message: body = "%s\n\n%s" % (form.email_message, body) email_from = form.email_from or settings.DEFAULT_FROM_EMAIL email_to = form_for_form.email_to() if email_to and form.send_email: msg = EmailMessage(subject, body, email_from, [email_to]) msg.send() email_from = email_to or email_from # Send from the email entered. email_copies = [ e.strip() for e in form.email_copies.split(",") if e.strip() ] if email_copies: msg = EmailMessage(subject, body, email_from, email_copies) for f in form_for_form.files.values(): f.seek(0) msg.attach(f.name, f.read()) msg.send() form_valid.send(sender=request, form=form_for_form, entry=entry) return redirect(reverse("form_sent", kwargs={"slug": form.slug})) context = {"form": form, "form_for_form": form_for_form} return render_to_response(template, context, RequestContext(request))
def form_detail(request, slug, template="forms/form_detail.html"): """ Display a built form and handle submission. """ published = Form.objects.published(for_user=request.user) if USE_SITES: published = published.filter(sites=Site.objects.get_current()) form = get_object_or_404(published, slug=slug) if form.login_required and not request.user.is_authenticated(): return redirect("%s?%s=%s" % (settings.LOGIN_URL, REDIRECT_FIELD_NAME, urlquote(request.get_full_path()))) args = (form, request.POST or None, request.FILES or None) form_for_form = FormForForm(*args) if request.method == "POST": if not form_for_form.is_valid(): form_invalid.send(sender=request, form=form_for_form) else: entry = form_for_form.save() fields = ["%s: %s" % (v.label, form_for_form.cleaned_data[k]) for (k, v) in form_for_form.fields.items()] subject = form.email_subject if not subject: subject = "%s - %s" % (form.title, entry.entry_time) body = "\n".join(fields) if form.email_message: body = "%s\n\n%s" % (form.email_message, body) email_from = form.email_from or settings.DEFAULT_FROM_EMAIL email_to = form_for_form.email_to() if email_to and form.send_email: msg = EmailMessage(subject, body, email_from, [email_to]) msg.send() email_from = email_to or email_from # Send from the email entered. email_copies = [e.strip() for e in form.email_copies.split(",") if e.strip()] if email_copies: msg = EmailMessage(subject, body, email_from, email_copies) for f in form_for_form.files.values(): f.seek(0) msg.attach(f.name, f.read()) msg.send() form_valid.send(sender=request, form=form_for_form, entry=entry) return redirect(reverse("form_sent", kwargs={"slug": form.slug})) context = {"form": form, "form_for_form": form_for_form} return render_to_response(template, context, RequestContext(request))
def process_form(request, form, context={}, is_cms_plugin=False): if form.login_required and not request.user.is_authenticated(): return redirect("%s?%s=%s" % (settings.LOGIN_URL, REDIRECT_FIELD_NAME, urlquote(request.get_full_path()))) args = (form, request.POST or None, request.FILES or None) form_for_form = FormForForm(*args) if request.method == "POST": if not form_for_form.is_valid(): form_invalid.send(sender=request, form=form_for_form) else: entry = form_for_form.save() fields = ["%s: %s" % (v.label, form_for_form.cleaned_data[k]) for (k, v) in form_for_form.fields.items()] subject = form.email_subject if not subject: subject = "%s - %s" % (form.title, entry.entry_time) body = "\n".join(fields) if form.email_message: body = "%s\n\n%s" % (form.email_message, body) email_from = form.email_from or settings.DEFAULT_FROM_EMAIL email_to = form_for_form.email_to() if email_to and form.send_email: msg = EmailMessage(subject, body, email_from, [email_to]) msg.send() email_copies = [e.strip() for e in form.email_copies.split(",") if e.strip()] if email_copies: msg = EmailMessage(subject, body, email_from, email_copies) for f in form_for_form.files.values(): f.seek(0) msg.attach(f.name, f.read()) msg.send() form_valid.send(sender=request, form=form_for_form, entry=entry) if is_cms_plugin: context['form_sent'] = True else: return redirect(reverse("form_sent", kwargs={"slug": form.slug})) context.update({"form": form, "form_for_form": form_for_form}) return context
def process(self, request, **kwargs): request_context = RequestContext(request) form = self.form args = (form, request_context, request.POST or None, request.FILES or None) form_for_form = FormForForm(*args) if request.method == "POST": if not form_for_form.is_valid(): form_invalid.send(sender=request, form=form_for_form) else: entry = form_for_form.save() # send e-mail message to user email_to = form_for_form.email_to() if email_to and form.send_email: send_email_message(form_for_form, email_to, entry) # send email to email_copies send_email_form(request, form_for_form, entry) form_valid.send(sender=request, form=form_for_form, entry=entry) if form.response.startswith('/') or form.response.startswith('http'): return redirect(form.response) context = Context({ 'form': form_for_form, }) template = Template(form.response) self.rendered_output = template.render(context) return context = { "form": form_for_form, } self.rendered_output = render_to_string(self.template, context, request_context)
def form_detail(request, slug, template="questionnaire/form_detail.html", extra_object_id=None): """ Display a built form and handle its submission. object_id is the primary key of an object like Conversation or BuddyChatProfile that will be linked to this FormEntry via ConversationFormEntry or QuestionnaireFormEntry. """ published = Form.objects.published(for_user=request.user) if USE_SITES: published = published.filter(sites=Site.objects.get_current()) form = get_object_or_404(published, slug=slug) if form.login_required and not request.user.is_authenticated(): return redirect("%s?%s=%s" % (settings.LOGIN_URL, REDIRECT_FIELD_NAME, urlquote(request.get_full_path()))) args = (form, request.POST or None, request.FILES or None) form_for_form = FormForForm(*args) if request.method == "POST": has_extra_permission = False # if the id of an extra object is given, make sure user has permissions and preconditions are met if extra_object_id > 0: if form.questionnaire.position == 'SC': conv = get_object_or_404(Conversation, pk=extra_object_id) # only staff member assigned to Conversation may take SC-Questionnaire has_permission = (conv.getStaff().user == request.user) # the SC-Questionnaire can be taken only once doesnt_exist = (form.questionnaire.conversationformentry_set.filter(conversation__id=extra_object_id).count() == 0) has_extra_permission = has_permission and doesnt_exist elif form.questionnaire.position == 'CR': profile = get_object_or_404(BuddyChatProfile, pk=extra_object_id) has_permission = (profile.user == request.user) doesnt_exist = (profile.questionnaires.filter(position='CR').count() == 0) has_extra_permission = has_permission and doesnt_exist elif form.questionnaire.position == 'CX': profile = get_object_or_404(BuddyChatProfile, pk=extra_object_id) has_extra_permission = (profile.user == request.user) elif form.questionnaire.position == 'SX': profile = get_object_or_404(BuddyChatProfile, pk=extra_object_id) # only careworker assigned to BuddyProfile may take SX-Questionnaire has_extra_permission = (profile.careworker == request.user) if not form_for_form.is_valid() or (extra_object_id > 0 and not has_extra_permission): form_invalid.send(sender=request, form=form_for_form) else: entry = form_for_form.save() # send email fields = ["%s: %s" % (v.label, form_for_form.cleaned_data[k]) for (k, v) in form_for_form.fields.items()] subject = form.email_subject if not subject: subject = "%s - %s" % (form.title, entry.entry_time) body = "\n".join(fields) if form.email_message: body = "%s\n\n%s" % (form.email_message, body) email_from = form.email_from or settings.DEFAULT_FROM_EMAIL email_to = form_for_form.email_to() if email_to and form.send_email: msg = EmailMessage(subject, body, email_from, [email_to]) msg.send() email_from = email_to or email_from # Send from the email entered. email_copies = [e.strip() for e in form.email_copies.split(",") if e.strip()] if email_copies: msg = EmailMessage(subject, body, email_from, email_copies) for f in form_for_form.files.values(): f.seek(0) msg.attach(f.name, f.read()) msg.send() # send signals form_valid.send(sender=request, form=form_for_form, entry=entry) questionnaire_saved.send(sender=request, questionnaire=form.questionnaire, entry=entry, extra_object_id=extra_object_id) return redirect(reverse("form_sent", kwargs={"slug": form.slug, "entry": entry.pk})) context = { "form": form, "form_for_form": form_for_form, } return render_to_response(template, context, RequestContext(request))
def form_detail(request, slug, template="forms/form_detail.html"): """ Display a built form and handle submission. """ published = Form.objects.published(for_user=request.user) form = get_object_or_404(published, slug=slug) if not has_view_perm(request.user,'forms.view_form',form): raise Http403 form_for_form = FormForForm(form, request.user, request.POST or None, request.FILES or None) for field in form_for_form.fields: form_for_form.fields[field].initial = request.GET.get(field, '') if request.method == "POST": if form_for_form.is_valid(): entry = form_for_form.save() entry.entry_path = request.POST.get("entry_path", "") entry.save() email_headers = {} # content type specified below if form.email_from: email_headers.update({'Reply-To':form.email_from}) subject = generate_email_subject(form, entry) # fields aren't included in submitter body to prevent spam admin_body = generate_admin_email_body(entry) submitter_body = generate_submitter_email_body(entry) email_from = form.email_from or settings.DEFAULT_FROM_EMAIL sender = get_setting('site', 'global', 'siteemailnoreplyaddress') email_to = form_for_form.email_to() if email_to and form.send_email and form.email_text: # Send message to the person who submitted the form. msg = EmailMessage(subject, submitter_body, sender, [email_to], headers=email_headers) msg.content_subtype = 'html' msg.send() email_from = email_to or email_from # Send from the email entered. email_headers.update({'Reply-To':email_from}) email_copies = [e.strip() for e in form.email_copies.split(",") if e.strip()] if email_copies: # Send message to the email addresses listed in the copies. msg = EmailMessage(subject, admin_body, sender, email_copies, headers=email_headers) msg.content_subtype = 'html' for f in form_for_form.files.values(): f.seek(0) msg.attach(f.name, f.read()) msg.send() # payment redirect if form.custom_payment: # create the invoice invoice = make_invoice_for_entry(entry, custom_price=form_for_form.cleaned_data.get('custom_price')) # log an event for invoice add log_defaults = { 'event_id' : 311000, 'event_data': '%s (%d) added by %s' % (invoice._meta.object_name, invoice.pk, request.user), 'description': '%s added' % invoice._meta.object_name, 'user': request.user, 'request': request, 'instance': invoice, } EventLog.objects.log(**log_defaults) # redirect to billing form return redirect('form_entry_payment', invoice.id, invoice.guid) # default redirect if form.completion_url: return redirect(form.completion_url) return redirect("form_sent", form.slug) context = {"form": form, "form_for_form": form_for_form} return render_to_response(template, context, RequestContext(request))