Outcome Surveys
Overview
outcome-surveys is a Django app plugin. It will be installed in edx-platform and integrated in lms. outcome_surveys plugin will be used to send follow up events for learners who have passed a course.
Development Workflow
One Time Setup
# Clone the repository
git clone git@github.com:edx/outcome-surveys.git
cd outcome-surveys
# Set up a virtualenv using virtualenvwrapper with the same name as the repo and activate it
mkvirtualenv -p python3.8 outcome-surveys
Every time you develop something in this repo
# Activate the virtualenv
workon outcome-surveys
# Grab the latest code
git checkout master
git pull
# Install/update the dev requirements
make requirements
# Run the tests and quality checks (to verify the status before you make any changes)
make validate
# Make a new branch for your changes
git checkout -b <your_github_username>/<short_description>
# Using your favorite editor, edit the code to make your change.
vim …
# Run your new tests
pytest ./path/to/new/tests
# Run all the tests and quality checks
make validate
# Make sure to update the semantic version in outcome_surveys/__init__.py
# Make sure to update CHANGELOG.rst
# Commit all your changes
git commit …
git push
# Open a PR and ask for review.
# Merge the PR
# Create and publish a release
License
The code in this repository is licensed under the AGPL 3.0 unless otherwise noted.
Please see LICENSE.txt for details.
How To Contribute
Contributions are very welcome. Please read How To Contribute for details. Even though they were written with edx-platform in mind, the guidelines should be followed for all Open edX projects.
The pull request description template should be automatically applied if you are creating a pull request from GitHub. Otherwise you can find it at PULL_REQUEST_TEMPLATE.md.
The issue report template should be automatically applied if you are creating an issue on GitHub as well. Otherwise you can find it at ISSUE_TEMPLATE.md.
Reporting Security Issues
Please do not report security issues in public. Please email security@edx.org.
Getting Help
If you’re having trouble, we have discussion forums at https://discuss.openedx.org where you can connect with others in the community.
Our real-time conversations are on Slack. You can request a Slack invitation, then join our community Slack workspace.
For more information about these options, see the Getting Help page.
Change Log
Unreleased
[3.0.5]- 2026-08-07
feat: schedule follow up survey event on COURSE_CERT_AWARDED signal, to cover certificates issued via the certificate allowlist (e.g. externally graded courses), which never trigger the existing passed_first_time follow up event.
fix: guard the passed_first_time handler against scheduling a duplicate follow up event, matching the guard already used by the COURSE_CERT_AWARDED handler. Both handlers now write via get_or_create on (user_id, course_id, event_type), so no work happens between the duplicate check and the insert.
fix: narrow the optional LMS imports (CourseEnrollment, CourseOverview, track) so only the absence of the LMS package itself is tolerated. A ModuleNotFoundError raised from inside an importable LMS module is a real deployment problem and now propagates instead of silently leaving the handler with incomplete event metadata.
fix: dedupe by learner/course when sending follow up segment events, so duplicate LearnerCourseEvent rows (including any already present) can no longer send a learner a second follow up email. Duplicate rows are marked as sent rather than re-fired. This replaces an earlier approach that added a unique constraint on (user_id, course_id, event_type); the table lives in the edxapp database and pre-existing duplicate rows would have blocked that migration.
fix: snapshot pending event ids before sending, so marking rows already_sent no longer shrinks the queryset mid-iteration and skips records past the first batch.
[3.0.4]- 2026-06-19
feat: migrated the snowflake connectivity from username to private key
[3.0.3]- 2025-08-11
temp: add logs to debug issue with OperationalError in MultiChoiceResponse.save_answers
[3.0.2]- 2025-07-29
fix: use latest version of setuptools
[3.0.1]- 2025-07-08
fix: publish to pypi github action
[3.0.0]- 2025-07-07
feat: upgrade python version to 3.11
[2.6.0]- 2024-11-06
Deprecated edx-sphinx-theme and replaced it with sphinx-book-theme
[2.5.1] - 2024-02-22
Update prepared learners query
[2.5.0] - 2023-11-02
Add management command to trigger segment events for learners who have achieved 30 minutes of learning
[2.4.0] - 2023-03-13
Add support to delete survey responses
[2.3.1] - 2023-03-01
Remove broad exception
[2.3.0] - 2023-02-27
Remove null=True from char and text model fields
[2.1.0] - 2023-02-03
Add uniqe constraints on table fields
Replace get_or_create` with custom implementation
Gracefully exit command upon SurveyMonkeyDailyRateLimitConsumed exception
[2.0.0] - 2023-02-01
Django management command to import data from SurveyMonkey
[1.1.1] - 2022-09-06
Add already_sent boolean field in LearnerCourseEvent model to store the state for sent events.
Set already_sent` to True in LearnerCourseEvent model for each triggered event.
[1.1.0] - 2022-07-14
Make follow up days configurable
[0.1.0] - 2022-07-06
Added
First release on PyPI.
Metadata
Release files for outcome-surveys 3.0.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| outcome_surveys-3.0.5.tar.gz | 49.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| outcome_surveys-3.0.5-py2.py3-none-any.whl | Python 3, Python 2 | none | any | Details |
Total release size: 100.2 kB
Release files / outcome_surveys-3.0.5.tar.gz
| Download URL | outcome_surveys-3.0.5.tar.gz |
|---|---|
| Size | 49.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4ed9f82a382e18c16e7bc5cf881431b8b3dfae483450282ab48f681b4c7552bf
|
|
BLAKE2b-256 checksum How to use checksums |
0890e3cdc4d1d2f85f98d17b60e38f828ba037fc7c7d37ab2a810055f16fb152
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / outcome_surveys-3.0.5-py2.py3-none-any.whl
| Download URL | outcome_surveys-3.0.5-py2.py3-none-any.whl |
|---|---|
| Size | 50.9 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
cbae582be48cb67b7ce5ca139972839aebc9469015fe0a5d399e96c987999dba
|
|
BLAKE2b-256 checksum How to use checksums |
40d9c06535118d46102ccc7b0f3437328360d2119b7b8146ae9fe9e0e8ca3c9f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|