Skip to main content

Provides support forms for your application.

Project description

plain.support

Provides support forms for your application.

Overview

You can add support forms to your application to collect user feedback, bug reports, and other messages. When a form is submitted, an email is sent to your support team.

# app/urls.py
from plain.urls import include, path, Router
from plain.support.urls import SupportRouter


class AppRouter(Router):
    namespace = "app"
    urls = [
        path("support/", include(SupportRouter)),
        # ...
    ]
# app/settings.py
SUPPORT_EMAIL = "support@example.com"

This creates a support form at /support/form/default/ that users can fill out. When submitted, an email is sent to your SUPPORT_EMAIL address with the user's name, email, and message.

Settings

Setting Default Env var
SUPPORT_EMAIL Required PLAIN_SUPPORT_EMAIL
SUPPORT_FORMS {"default": "..."} -

See default_settings.py for more details.

Custom forms

You can create custom support forms by extending SupportForm. The form uses ModelForm from plain.postgres.forms.

# app/forms.py
from plain.support.forms import SupportForm
from plain.support.models import SupportFormEntry
from plain import forms


class BugReportForm(SupportForm):
    browser = forms.TextField(max_length=100, required=False)

    class Meta:
        model = SupportFormEntry
        fields = ["name", "email", "message", "browser"]

Then register it in your settings:

# app/settings.py
SUPPORT_FORMS = {
    "default": "plain.support.forms.SupportForm",
    "bug-report": "app.forms.BugReportForm",
}

The form will be available at /support/form/bug-report/.

You can also customize the email notification by overriding the notify method:

class BugReportForm(SupportForm):
    # ...

    def notify(self, instance):
        # Send to a different channel, create a ticket, etc.
        pass

Views

You can use the following views for different scenarios:

Embedded forms

Support forms can be embedded in other sites using an iframe:

<iframe src="https://example.com/support/form/default/iframe/" width="100%" height="600"></iframe>

Or using the provided JavaScript embed:

<div id="support-form"></div>
<script src="https://example.com/support/form/default.js"></script>

Security considerations

Most support forms allow users to type in any email address. Be careful, because anybody can pretend to be anybody else. Conversations either need to continue over email (which confirms they have access to the email account), or include a verification step (emailing a code to the email address, for example).

The SupportForm.find_user() method attempts to associate entries with existing users by email, but this does not confirm the submitter's identity.

FAQs

How do I customize the form templates?

You can override the default templates by creating your own templates at:

  • support/page.html: The full page template
  • support/iframe.html: The iframe-friendly template
  • support/forms/<form_slug>.html: The form rendering template
  • support/success/<form_slug>.html: The success message template

How do I view support form entries?

Support form entries are stored in the SupportFormEntry model. You can query them directly or use the admin interface if you have plain.admin installed with the SupportFormEntryAdmin registered.

Can I associate support entries with logged-in users?

Yes. When a user is logged in, the form automatically associates the entry with their account. If the user is not logged in (common with iframe embeds), the form will try to find an existing user by email address using find_user().

Installation

Install the plain.support package from PyPI:

uv add plain.support

Add plain.support to your INSTALLED_PACKAGES in app/settings.py:

# app/settings.py
INSTALLED_PACKAGES = [
    # ...
    "plain.support",
]

Set the required SUPPORT_EMAIL setting:

# app/settings.py
SUPPORT_EMAIL = "support@example.com"

Include the support URLs in your app's URL configuration:

# app/urls.py
from plain.urls import include, path, Router
from plain.support.urls import SupportRouter


class AppRouter(Router):
    namespace = "app"
    urls = [
        path("support/", include(SupportRouter)),
        # ...
    ]

Run migrations to create the SupportFormEntry table:

uv run plain migrate

Create the required templates. At minimum, you need a form template:

<!-- app/templates/support/forms/default.html -->
{{ form.as_fields }}
<button type="submit">Send message</button>

And a success template:

<!-- app/templates/support/success/default.html -->
<p>Thank you for your message! We'll get back to you soon.</p>

You also need to create an email template for notifications. See the plain.email package for template setup instructions:

<!-- app/emails/support_form_entry.html -->
<p>New support request from {{ support_form_entry.name }} ({{ support_form_entry.email }})</p>
<p>{{ support_form_entry.message }}</p>

Visit /support/form/default/ to see your support form.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

plain_support-0.33.1.tar.gz (15.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

plain_support-0.33.1-py3-none-any.whl (22.2 kB view details)

Uploaded Python 3

File details

Details for the file plain_support-0.33.1.tar.gz.

File metadata

  • Download URL: plain_support-0.33.1.tar.gz
  • Upload date:
  • Size: 15.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for plain_support-0.33.1.tar.gz
Algorithm Hash digest
SHA256 feffd799c5d705987d121ef2c5c2f563a2486af6d90e585feadc95b0dc2b9419
MD5 c2fdb026026b9f6422daa1135c15b8b8
BLAKE2b-256 f465c5ec5f2000d93fe621f8f807416e062ddbe017abee5307cf780f1681e754

See more details on using hashes here.

File details

Details for the file plain_support-0.33.1-py3-none-any.whl.

File metadata

  • Download URL: plain_support-0.33.1-py3-none-any.whl
  • Upload date:
  • Size: 22.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for plain_support-0.33.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c8111a98e369b404d9b2a1c788868115a6378dea0431ff845fc9dc6fc34bddd5
MD5 b4c930e565c4a2ff16fbd2d34bd4b5c5
BLAKE2b-256 a755c9c47c3f3b229b0eb54ce398b9f683c1ea4776ee791c3a636587b1a02b61

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page