Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: unenrolled defaults are now not enrollable #2301

Merged
merged 1 commit into from
Dec 10, 2024

Conversation

iloveagent57
Copy link
Contributor

@iloveagent57 iloveagent57 commented Dec 10, 2024

The default enrollment learner_status view now considers intended courses from which the requested user has unenrolled as no-longer realizable.
ENT-9839

Merge checklist:

  • Any new requirements are in the right place (do not manually modify the requirements/*.txt files)
    • base.in if needed in production but edx-platform doesn't install it
    • test-master.in if edx-platform pins it, with a matching version
    • make upgrade && make requirements have been run to regenerate requirements
  • make static has been run to update webpack bundling if any static content was updated
  • ./manage.py makemigrations has been run
    • Checkout the Database Migration Confluence page for helpful tips on creating migrations.
    • Note: This must be run if you modified any models.
      • It may or may not make a migration depending on exactly what you modified, but it should still be run.
    • This should be run from either a venv with all the lms/edx-enterprise requirements installed or if you checked out edx-enterprise into the src directory used by lms, you can run this command through an lms shell.
      • It would be ./manage.py lms makemigrations in the shell.
  • Version bumped
  • Changelog record added
  • Translations updated (see docs/internationalization.rst but also this isn't blocking for merge atm)

Post merge:

  • Tag pushed and a new version released
    • Note: Assets will be added automatically. You just need to provide a tag (should match your version number) and title and description.
  • After versioned build finishes in GitHub Actions, verify version has been pushed to PyPI
    • Each step in the release build has a condition flag that checks if the rest of the steps are done and if so will deploy to PyPi.
      (so basically once your build finishes, after maybe a minute you should see the new version in PyPi automatically (on refresh))
  • PR created in edx-platform to upgrade dependencies (including edx-enterprise)
    • Trigger the 'Upgrade one Python dependency' action against master in edx-platform with new version number to generate version bump PR
    • This must be done after the version is visible in PyPi as make upgrade in edx-platform will look for the latest version in PyPi.
    • Note: the edx-enterprise constraint in edx-platform must also be bumped to the latest version in PyPi.

@iloveagent57 iloveagent57 force-pushed the aed/unenrolled-defaults branch from 61bb513 to c9ad71e Compare December 10, 2024 18:53
Comment on lines +277 to +285
@ddt.data(
{'run_is_enrollable': False, 'unenrollment_exists': False},
{'run_is_enrollable': True, 'unenrollment_exists': True},
)
@mock.patch('enterprise.content_metadata.api.EnterpriseCatalogApiClient')
@mock.patch('enterprise.models.utils.get_best_mode_from_course_key')
@mock.patch.object(EnterpriseCourseEnrollment, 'course_enrollment', new_callable=mock.PropertyMock)
@ddt.unpack
def test_default_enrollment_intentions_learner_status_content_not_enrollable(
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the only changed test, everything else has just been refactored into this new file.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call to start breaking up the giant test_views file :)

Copy link
Member

@adamstankiewicz adamstankiewicz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A couple small nits, with a broader sanity check question about the logic considering unenrolled for audit enrollments.

enterprise/api/v1/views/default_enterprise_enrollments.py Outdated Show resolved Hide resolved
@@ -211,6 +211,12 @@ def _partition_default_enrollment_intentions_by_enrollment_status(
already_enrolled.append((intention, non_audit_enrollment))
continue

if non_audit_enrollment and non_audit_enrollment.unenrolled:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[sanity check] If the existing enrollment is audit (vs. the non_audit_enrollment here), the learners unenrolls, and there's non-audit modes that exist, would we also want to prevent automatic re-enrollment, too?

For example, would the conditions below the NOTE comment also need to take into account audit_enrollment.unenrolled?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought about that but decided against it, I can leave a comment in the code. My reasoning is that default enrollments should be "exactly once" per (user, enterprise), if possible. If they enrolled in audit and unenrolled, it means they likely never had a default intention realized for them. This isn't a strongly-held position though.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If they enrolled in audit and unenrolled, it means they likely never had a default intention realized for them.

Ah yeah, this probably represents the source of most audit enrollments. The exception would be for courses that are audit-only, which likely rarely happens in production; it does happen somewhat frequently on stage, though we shouldn't optimize for bad stage data 😉

Let's leave it as is for now, with a comment!

Comment on lines +277 to +285
@ddt.data(
{'run_is_enrollable': False, 'unenrollment_exists': False},
{'run_is_enrollable': True, 'unenrollment_exists': True},
)
@mock.patch('enterprise.content_metadata.api.EnterpriseCatalogApiClient')
@mock.patch('enterprise.models.utils.get_best_mode_from_course_key')
@mock.patch.object(EnterpriseCourseEnrollment, 'course_enrollment', new_callable=mock.PropertyMock)
@ddt.unpack
def test_default_enrollment_intentions_learner_status_content_not_enrollable(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call to start breaking up the giant test_views file :)

The default enrollment ``learner_status`` view now considers intended courses from which the requested user has unenrolled as no-longer realizable.
ENT-9839
@iloveagent57 iloveagent57 force-pushed the aed/unenrolled-defaults branch from c9ad71e to ccd4dc3 Compare December 10, 2024 19:39
@iloveagent57 iloveagent57 merged commit 1ed53c2 into master Dec 10, 2024
10 checks passed
@iloveagent57 iloveagent57 deleted the aed/unenrolled-defaults branch December 10, 2024 19:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants