Skip to main content

PyPI CI Codecov Documentation Supported Python versions License

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.

Download files

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

Source Distribution

outcome_surveys-3.0.5.tar.gz (49.4 kB view details)

Uploaded Source

Built Distribution

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

outcome_surveys-3.0.5-py2.py3-none-any.whl (50.9 kB view details)

Uploaded Python 2Python 3

File details

Details for the file outcome_surveys-3.0.5.tar.gz.

File metadata

  • Download URL: outcome_surveys-3.0.5.tar.gz
  • Upload date:
  • Size: 49.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for outcome_surveys-3.0.5.tar.gz
Algorithm Hash digest
SHA256 4ed9f82a382e18c16e7bc5cf881431b8b3dfae483450282ab48f681b4c7552bf
MD5 41ede1345fe1c77af4c293cac01b6909
BLAKE2b-256 0890e3cdc4d1d2f85f98d17b60e38f828ba037fc7c7d37ab2a810055f16fb152

See more details on using hashes here.

File details

Details for the file outcome_surveys-3.0.5-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for outcome_surveys-3.0.5-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 cbae582be48cb67b7ce5ca139972839aebc9469015fe0a5d399e96c987999dba
MD5 f75d285d92155cb27c9196b53c6a6c06
BLAKE2b-256 40d9c06535118d46102ccc7b0f3437328360d2119b7b8146ae9fe9e0e8ca3c9f

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 Sentry Error logging StatusPage Status page