Skip to main content

What Apollo Is

At Morgan & Morgan, the development team builds lots of forms. A lot. While most of the heavy lifting for form management was done for us by the marketing platform, Hubspot, there were some major gaps that forced us to consider a switch:

  1. Cost. Our Hubspot license was > $50,000 yearly where the only utility came from the form management tooling.
  2. Lack of flexibility. While defining basic validation rules and field layouts was OK, doing anything more complex (e.g. email blacklists, geo-based submission filtering, etc.) was impossible. In fact, since their switch to React rendered forms, custom validation in a Hubspot form doesn't work at all.
  3. Lack of control. The Hubspot JS library is 300kb+ in size before gzip and sets short-term cache expiration headers. Why? It's hard to say without access to the unminified source.
    more than 300kb
  4. Lack of transparency. Hubspot provides Salesforce syncing out of the box. However, having a highly customized Salesforce Org, our Hubspot sync process was anything but straightforward.

With these problems in mind, we built Apollo as a solution.

Apollo is a Django application which - in conjunction with the Icarus Javascript Library - aims to act as a plug-and-play solution for the busy engineer. In addition to providing a management interface for building form fields, designing forms, and viewing form submissions, Apollo makes the assumption that it should make no assumptions about domain specific requirements of the host application. Thus, it decouples form management from submission processing, leaving the job of reacting to events within the host. To facilitate this architecture, Apollo opts for a Pub/Sub design, notifying listeners on key events:

  • form submitted
  • form submission validated
  • form submission error

See more details on signals in the signals reference

Why Apollo

  1. It is - and always will be - free and open source
  2. Plug-and-play architecture
  3. Utility in a wide variety of use case
  4. Integration with native Django permissions, allowing for role assignment when delegating API / form builder access.

Installation

pip install django-apollo-forms

# add the App to the list of INSTALLED_APPS
INSTALLED_APPS = {
  ...  
  'django_filters',
  'rest_framework',
  'rest_framework_swagger', # optional, creates browsable API docs
  'apollo',
  ...
}

# run the migrations to generate DB tables
python manage.py makemigrations apollo
python manage.py migrate apollo

# collectstatic to generate the static files for the form builder interface
python manage.py collectstatic

Customization

You can customize the behavior of Apollo by overriding the defaults of the APOLLO variable in your settings.py. Below are the parameters which may be controlled in this setting.

Parameter Default Description
BUILDER_ROOT_PREFIX "" The path at which the Apollo form builder is mounted in the host application
BUILDER_REQUIRES_IS_STAFF True If True, then only users with is_staff permissions can access the form builder
DOWNLOAD_REQUIRES_IS_STAFF True If True, then only users with is_staff permissions can download form submissions
API_ROOT /api The path to the API root on the server
API_VERSION v1 The Apollo API version
ICARUS_THEMES_URL //static.forthepeople.com/engineering/icarus/v1.0-latest/themes Location where icarus themes are located
SUBMISSION_EMAIL_FROM None Email address to send submission notifications from
EXTERNAL_HOOKS_SIGNAL_ONLY True If True, then we we do not send webhooks notifications, only trigger a signal
REDACT_SENSITIVE_DATA True If True, SSN / ITIN / driver's license / passport / card numbers are redacted ([REDACTED]) from free-text fields before a submission is stored, signalled or forwarded. Set to False to turn off (emergency switch)
DEFAULT_FORM_SUBMISSION_SERIALIZER apollo.api.v1.serializers.FormSubmissionSerializer Dotted path to a serializer class to use for FormSubmission objects

Example

APOLLO = {
    "BUILDER_ROOT_PREFIX": "/apollo"
}

Features

Setup field templates for your forms. These define the default configurations for fields and can be overridden on a per-form basis.


Step-by-step form builder interface.


Powerful layout creator with the ability to apply different layouts for desktop and mobile screens.


Form Usage

When it comes to actually using the forms built by Apollo, you have two options:

  1. Use the Icarus Javascript Library (Recommended)
  2. DIY.

If you decide to pursue (2), you'll want to consult the Browsable API, mounted at /<API_ROOT>/<API_VERSION>/docs for details on authentication, request format, and available resources.

Development

Getting Started

Bringing up a new dev environment should be fairly straightforward. Run docker-compose up -d to bring up a complete development environment.

Building Releases

Create a virtualenv then run pip install -r requirements.txt in order to install versioning utilities. Run bumpversion <SEMVER> to create a buildable version then push upstream to trigger CI.

Metadata

Release files for django-apollo-forms 2.2.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-apollo-forms 2.2.6
File Size Uploaded Provenance
django_apollo_forms-2.2.6.tar.gz 835.4 kB Without provenance Details

Release files / django_apollo_forms-2.2.6.tar.gz

Download URL django_apollo_forms-2.2.6.tar.gz
Size 835.4 kB
Tags Source
SHA-256 checksum
How to use checksums
d9e515f0bc081a65e92961efbdbdcc35a0efa87277e430b7c4a252f912cc3eb7
BLAKE2b-256 checksum
How to use checksums
6ae5bb9bdf397c33da75ee069e3b27d6e1290be53ea1133d4fb47dd2946cdffa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.8.20

Security for django-apollo-forms 2.2.6

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

2.2.6 This release

1 release file No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page