Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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
Exemplo n.º 4
0
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))
Exemplo n.º 5
0
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))
Exemplo n.º 6
0
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)
Exemplo n.º 8
0
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))
Exemplo n.º 9
0
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))