A django survey app, based on and compatible with "django-survey". You will be able to migrate your data from an ancient version of django-survey, but it has been ported to python 3 and you can export results as CSV or PDF using your native language.
If you want the latest version still compatible with python 2.7 you need a version < 1.3.0.
- Getting started
- Making a survey
- Generating a pdf report from the survey's result
- Contributing as a developper
- Translating the project
- Credit
Add django-survey-and-report
to your requirements and get it with pip.
echo 'django-survey-and-report' > requirements.txt
pip install -r requirements.txt
Add bootstrapform
and survey
in the INSTALLED_APPS
in your settings :
INSTALLED_APPS = [
# Your own installed apps here
]
from pathlib import Path
CSV_DIRECTORY = Path("csv") # Define the directory where csv are exported
TEX_DIRECTORY = Path("tex") # Define the directory where tex files and pdf are exported
INSTALLED_APPS += [
'bootstrapform',
'survey'
]
Add an URL entry to your project’s urls.py, for example:
from django.conf import settings
from django.conf.urls import include, url
urlpatterns = [
# Your own url pattern here
]
if 'survey' in settings.INSTALLED_APPS:
urlpatterns += [
url(r'^survey/', include('survey.urls'))
]
Note: you can use whatever you wish as the URL prefix.
You can also change some options:
# The separator for questions (Default to ",")
CHOICES_SEPARATOR = "|"
# What is shown in export when the user do not answer (Default to "Left blank")
USER_DID_NOT_ANSWER = "NAA"
# Path to the Tex configuration file (default to an internal file that should be sufficient)
from pathlib import Path
TEX_CONFIGURATION_FILE = Path("tex", "tex.conf")
# Default color for exported pdf pie (default to "red!50")
SURVEY_DEFAULT_PIE_COLOR = "blue!50"
To uninstall django-survey-and-report
, simply comment out or remove the
'survey' line in your INSTALLED_APPS
.
If you want to use the pdf rendering you need to install xelatex
. If you're
using the Sankey's diagram generation you will also have to install python-tk
(for python 2.7) or python3-tk
(for python 3.x).
Using the admin interface you can create surveys, add questions, give questions categories, and mark them as required or not. You can define choices for answers using comma separated words.
The front-end survey view then automatically populates based on the questions that have been defined and published in the admin interface. We use bootstrap3 to render them.
Submitted responses can be viewed via the admin backend, in an exported csv or in a pdf generated with latex.
You can manage the way the report is created in a yaml file, globally, survey by survey, or question by question. In order to render pdf you will need to install texlive and python-tk or python3-tk for sankey's diagram.
The results are generated for the server only when needed, but you can force it as a developper with:
python manage.py exportresult -h
Following is an example of a configuration file. you can generate one with:
python manage.py generatetexconf -h
generic:
document_option: 11pt
'Test survëy':
document_class: report
questions:
'Lorem ipsum dolor sit amët, <strong> consectetur </strong> adipiscing elit.':
chart:
type: polar
text: pin
'Dolor sit amët, consectetur<strong> adipiscing</strong> elit.':
chart:
type: cloud
text: inside
The pdf is then generated using the very good pgf-pie library.
If you installed python3-tk, you can also show the relation between two questions using a sankey diagram :
'Lorem ipsum dolor sit amët, <strong> consectetur </strong> adipiscing elit.':
chart:
type: sankey
question: 'Dolor sit amët, consectetur<strong> adipiscing</strong> elit.'
You get this as a result:
You can also limit the answers shown by cardinality, filter them, group them together and choose the color for each answer or group of answers.
If you use this configuration for the previous question:
'Test survëy':
'Dolor sit amët, consectetur<strong> adipiscing</strong> elit.':
multiple_charts:
'Sub Sub Section with radius=3':
color:
Yës: blue!50
No: red!50
Whatever: red!50!blue!50
radius: 3
'Sub Sub Section with text=pin':
group_together:
Nah:
- No
- Whatever
K.:
- Yës
color:
Nah: blue!33!red!66
K.: blue!50
text: pin
chart:
radius: 1
type: cloud
text: inside
You get this as a result:
If you want to make your own treatment you can use your own class, for example.
Configuration:
'Test survëy':
questions:
'Ipsum dolor sit amët, <strong> consectetur </strong> adipiscing elit.':
chart:
type: survey.tests.exporter.tex.CustomQuestion2TexChild
Code in survey.tests.exporter.tex.CustomQuestion2TexChild
:
from survey.exporter.tex.question2tex_chart import Question2TexChart
class CustomQuestion2TexChild(Question2TexChart):
def get_results(self):
self.type = "polar"
return """ 2/There were no answer at all,
3/But we have a custom treatment to show some,
2/You can make minor changes too !"""
Result:
For a full example of a configuration file look at example_conf.yaml
in doc,
you can also generate your configuration file with
python manage.py generatetexconf -h
, it will create the default skeleton
for every survey and question.
To guide you during the python development, you can read:
- The default reporter for PieChart in
Question2TexChart
: https://github.com/Pierre-Sassoulas/django-survey/blob/master/survey/exporter/tex/question2tex_chart.py#L13 - The Sankey reporter in
Question3TexSankey
: https://github.com/Pierre-Sassoulas/django-survey/blob/master/survey/exporter/tex/question2tex_sankey.py#L15 - The Raw reporter in
Question2TexRax
: https://github.com/Pierre-Sassoulas/django-survey/blob/master/survey/exporter/tex/question2tex_raw.py.
Do not hesitate to make a pull request with your new exporter if it can be of interest for others I'll integrate it.
This is the typical command you should do to get started:
python -m venv venv/ # Create virtualenv
source venv/bin/activate # Activate virtualenv
pip install -e ".[dev]" # Install dev requirements
pre-commit install # Install pre-commit hook framework
python manage.py migrate # Create database
python manage.py loaddata survey/tests/testdump.json # Load test data
python manage.py createsuperuser
python manage.py runserver # Launch server
python manage.py test survey
If you want to dump a test database after adding data to it, this is the command to have a minimal diff :
python manage.py dumpdata --format json -e contenttypes -e admin -e auth.Permission
-e sessions.session -e sites.site --natural-foreign --indent 1
-o survey/tests/testdump.json
coverage run --source=survey --omit=survey/migrations/* ./manage.py test
coverage html
xdg-open htmlcov/index.html
We're using pre-commit
, it should take care of linting during commit.
Django survey's is available in multiple language. Your contribution would be very appreciated if you know a language that is not yet available.
The software is developed in english. Other available languages are :
- Chinese thanks to 朱聖黎 (Zhu Sheng Li)
- French thanks to Pierre Sassoulas
- Japanese thanks to Nobukuni Suzue
- Spanish thanks to Javier Ordóñez
- Russian thanks to Vlad M.
- German thanks to Georg Elsas
If your language do not exists add it in the LANGUAGE
variable in the
settings, like here.
Do not forget to credit yourself like in the header seen
here
Then you can translate with :
python manage.py makemessages
# python manage.py createsuperuser ? (You need to login for rosetta)
python manage.py runserver
# Access http://localhost:8000/admin to login
# Then go to http://localhost:8000/rosetta to translate
python manage.py makemessages --no-obsolete --no-wrap
git add survey/locale/
...
If your language is not yet available in rosetta, this stack overflow question should work even for language not handled by django.
If you're not a developper, open an issue on github and ask for a .po file in your language. I will generate it for you, so you can edit it with an online editor. I will then create the .po and commit them, so you can edit them with your github account or integrate it myself if you do not have one. You will be credited here.
Based on jessykate's django-survey, and contribution by jibaku, joshualoving, and ijasperyang in forks of jessykate's project.
We use anazalea's pySankey for sankey's diagram during reporting.