Skip to main content

A Django app to gather and send internal Government staff feedback

Project description

django-feedback

A Django app to gather and send internal Government staff feedback, e.g. for open beta periods

Installation

pip install django-feedback-govuk
  1. Add django-feedback to your INSTALLED_APPS settings:
INSTALLED_APPS = [
    ...
    'crispy_forms',
    'crispy_forms_gds',
    'django_feedback_govuk',
    ...
]
  1. Create a new email template in the GovUk Notify service, making sure to create a ((feedback_url)) field.

Note that ((feedback_url)) will be a link to the listing view, not an individual piece of feedback.

You'll need an API key and template ID from the gov.uk Notify service.

  1. Add the following settings to the file:
# Crispy forms
CRISPY_ALLOWED_TEMPLATE_PACKS = ["gds"]
CRISPY_TEMPLATE_PACK = "gds"

# Django Feedback GovUK
DJANGO_FEEDBACK_GOVUK = {
    "SERVICE_NAME": "<your-service>",
    "COPY": {
        #...add any copy tags to override here
    },
    "FEEDBACK_FORMS": {
        "default": {
            "model": "django_feedback_govuk.models.Feedback",
            "form": "django_feedback_govuk.forms.FeedbackForm",
            "view": "django_feedback_govuk.views.FeedbackView",
        },
        # ...add extra feedback forms here
    ],
}

The copy dict contains string IDs for all user-facing copy, defaulting to the following (override just the fields you want to, using the {{ service_name }} variable if necessary for _title and _body strings):

{
    "SUBMIT_TITLE": "Give feedback on {{ service_name }}",
    "CONFIRM_TITLE": "Feedback submitted",
    "CONFIRM_BODY": "Thank you for submitting your feedback.",
    "FIELD_SATISFACTION_LEGEND": "Overall, how did you feel about the service you received today?",
    "FIELD_COMMENT_LEGEND": "How could we improve this service?",
    "FIELD_COMMENT_HINT": "Do not include any personal or financial information, for example your National Insurance or credit card numbers.",
}

The email addresses are for every recipient that should get an email when feedback is submitted.

  1. Build your own templates

Override the built-in templates by making new templates in your app under the django_feedback_govuk/templates path. You'll need templates for submit.html, confirm.html, listing.html and submitted.html, each of which should load its respective template tag from feedback_submit, feedback_confirm, feedback_listing and feedback_submitted.

For example:

{# /your-project/templates/django_feedback_govuk/templates/submit.html #}
{% extends "base.html" %}
{% load feedback_tags %}
{% block content %}
    {% feedback_submit %}
{% endblock content %}

If you'd like to use the templatetags without causing page loads to new views

  1. Add the URLs to your project
from django_feedback_govuk import urls as feedback_urls


urlpatterns = [
    ...
    path("feedback/", include(feedback_urls)),
    ...
]
  1. Set up user permissions

Adding more/custom feedback forms

The FEEDBACK_FORMS key in the DJANGO_FEEDBACK_GOVUK settings dict can be used to add a custom feedback model with a custom form and optional view to allow different kinds of feedback to be submitted.

Define your custom feedback model:

Define a feedback model that inherits from BaseFeedback. BaseFeedback provides the submitter and submitted_at fields and logic. Add any custom fields to store the submitted data.

# models.py
from django.db import models
from django_feedback_govuk.models import BaseFeedback


class CustomFeedback(BaseFeedback):
    custom_field = models.TextField(blank=True)

Define your custom model form:

Define a model form that inherits from BaseFeedbackForm. BaseFeedbackForm provides the initial foundations for your feedback form. Simply, add your new model fields to the Meta.fields list and define the layout using crispy_forms_gds. Then move the submit button to the bottom of the layout.

# forms.py
from crispy_forms_gds.layout import Field, Fieldset, Size
from django_feedback_govuk.forms import SUBMIT_BUTTON, BaseFeedbackForm
from .models import CustomFeedback


class CustomFeedbackForm(BaseFeedbackForm):
    class Meta:
        model = CustomFeedback
        fields = ["submitter", "custom_field"]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.fields["custom_field"].label = ""

        self.helper.layout.remove(SUBMIT_BUTTON)
        self.helper.layout.append(
            Fieldset(
                Field("custom_field"),
                legend="Custom question?",
                legend_size=Size.MEDIUM,
            )
        )
        self.helper.layout.append(SUBMIT_BUTTON)

Update settings

Add a new entry to the DJANGO_FEEDBACK_GOVUK["FEEDBACK_FORMS"] dict that tells the package where to find the new model and form, give it a unique key that gives some context to the purpose of the new feedback form.

# settings.py
DJANGO_FEEDBACK_GOVUK = {
    ...
    "FEEDBACK_FORMS": {
        "default": {
            "model": "django_feedback_govuk.models.Feedback",
            "form": "django_feedback_govuk.forms.FeedbackForm",
            "view": "django_feedback_govuk.views.FeedbackView",
        },
        "custom": {
            "model": "YOUR_PACKAGE.models.CustomFeedback",
            "form": "YOUR_PACKAGE.forms.CustomFeedbackForm",
        },
    ],
}

Custom form copy

You can override the default copy passed to the forms by adding a copy key to the DJANGO_FEEDBACK_GOVUK["FEEDBACK_FORMS"][YOUR_FORM] dict like so:

# settings.py
DJANGO_FEEDBACK_GOVUK = {
    ...
    "FEEDBACK_FORMS": {
        "default": {
            "model": "django_feedback_govuk.models.Feedback",
            "form": "django_feedback_govuk.forms.FeedbackForm",
            "view": "django_feedback_govuk.views.FeedbackView",
        },
        "custom": {
            "model": "YOUR_PACKAGE.models.CustomFeedback",
            "form": "YOUR_PACKAGE.forms.CustomFeedbackForm",
            "copy": {
                "SUBMIT_TITLE": "Please provide feedback on {{ service_name }}",
            },
        },
    },
}

This copy dict should match the formatting of the root COPY dict. However, it can't override the copy that is defined on the provided FeedbackForm. If you wish to use that form in multiple feedback forms you should create a custom form that inherits from FeedbackForm, and update the text there.

Pushing to PyPI

Running make build-package will build the package into the dist/ directory.

Running make push-pypi-test will push the built package to Test PyPI.

Running make push-pypi will push the built package to PyPI.

Setting up poetry for pushing to PyPI

First you will need to add the test pypy repository to your poetry config:

poetry config repositories.test-pypi https://test.pypi.org/legacy/

Then go to https://test.pypi.org/manage/account/token/ and generate a token.

Then add it to your poetry config:

poetry config pypi-token.test-pypi XXXXXXXX

Then you also need to go to https://pypi.org/manage/account/token/ to generate a token for the real PyPI.

Then add it to your poetry config:

poetry config pypi-token.pypi XXXXXXXX

Now the make commands should work as expected.

Sending automated emails after form submission

Based on the needs of your project you may want to be notified of the feedback received. For example you might want to receive an email if there is new feedback to be reviewed. To do this you can create a method and call it on a regular schedule (e.g. once a day) through cron, Celery Beat, etc.

feedback_submitted_past_day = (
    BaseFeedback.objects.all().filter(
        submitted_at__gte=timezone.now() + timedelta(days=-1),
    ).exists()
)
if feedback_submitted_past_day:
    send_email() # This is not a real method, just an example to show this is where the send email logic would go.

This can be achieved through the GovUK Notify Client.

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

django_feedback_govuk-0.2.12.tar.gz (17.1 kB view details)

Uploaded Source

Built Distribution

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

django_feedback_govuk-0.2.12-py3-none-any.whl (24.9 kB view details)

Uploaded Python 3

File details

Details for the file django_feedback_govuk-0.2.12.tar.gz.

File metadata

  • Download URL: django_feedback_govuk-0.2.12.tar.gz
  • Upload date:
  • Size: 17.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.12.2 Darwin/24.5.0

File hashes

Hashes for django_feedback_govuk-0.2.12.tar.gz
Algorithm Hash digest
SHA256 81cba90712e89140cedd9acc5997fac38fc2851c021dad8d54564bf9f7b93a3c
MD5 9f0408e00a6169c2d97b110954056c57
BLAKE2b-256 e6e0135a2da94f7ad7c041031c021c6cb2c43333de480afc56b07117217b16b5

See more details on using hashes here.

File details

Details for the file django_feedback_govuk-0.2.12-py3-none-any.whl.

File metadata

File hashes

Hashes for django_feedback_govuk-0.2.12-py3-none-any.whl
Algorithm Hash digest
SHA256 9bb96f60db0a60d05adc5fcbae813df0c410a08798c0f50a2a33265c11df8644
MD5 f7854f0dc5ec58e562b11e7790c398b6
BLAKE2b-256 fa77642abc66afcba9fd71a278688f369faadcbf32cc5ea138e134cf39c19414

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