Skip to content

feat!: move enterprise_support into edx-enterprise as enterprise.platform_support - #2702

Open
pwnage101 wants to merge 1 commit into
masterfrom
pwnage101/ENT-11576
Open

pwnage101 wants to merge 1 commit into
masterfrom
pwnage101/ENT-11576

Conversation

@pwnage101

Copy link
Copy Markdown
Contributor

Moves openedx-platform's openedx/features/enterprise_support/ package into this repo as enterprise.platform_support, so the platform copy can be deleted and edx-enterprise stops being a mandatory platform dependency at the import level.

ENT-11576

@codecov

codecov Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 91.30435% with 56 lines in your changes missing coverage. Please review.
✅ Project coverage is 87.27%. Comparing base (99677d9) to head (1fc4e5a).

Files with missing lines Patch % Lines
enterprise/platform_support/api.py 89.86% 20 Missing and 10 partials ⚠️
enterprise/platform_support/utils.py 92.85% 3 Missing and 10 partials ⚠️
enterprise/platform_support/enrollments/utils.py 83.01% 7 Missing and 2 partials ⚠️
enterprise/platform_support/context.py 77.77% 0 Missing and 2 partials ⚠️
...ent/commands/email_drip_for_missing_dsc_records.py 50.00% 0 Missing and 1 partial ⚠️
enterprise/platform_support/admin/views.py 97.50% 0 Missing and 1 partial ⚠️

❌ Your patch check has failed because the patch coverage (91.30%) is below the target coverage (95.00%). You can increase the patch coverage or adjust the target coverage.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #2702      +/-   ##
==========================================
+ Coverage   87.06%   87.27%   +0.21%     
==========================================
  Files         265      274       +9     
  Lines       17280    17872     +592     
  Branches     1709     1788      +79     
==========================================
+ Hits        15044    15597     +553     
- Misses       1898     1917      +19     
- Partials      338      358      +20     
Flag Coverage Δ
unittests 87.27% <91.30%> (+0.21%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@pwnage101
pwnage101 force-pushed the pwnage101/ENT-11576 branch 2 times, most recently from 20ca3cc to 2f35c4b Compare October 8, 2026 19:39
@pwnage101
pwnage101 requested a balanced review from Copilot October 8, 2026 19:51

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔵 Needs a closer look

The oversized migration has unresolved correctness, reliability, performance, and coverage issues.

13 open findings
What changed in this PR

Moves openedx-platform’s enterprise support package into enterprise.platform_support, rewires consumers, and adds standalone test infrastructure.

Changes:

  • Adds platform-support APIs, utilities, signals, tasks, serializers, admin views, and templates.
  • Repoints existing enterprise integrations to internal imports.
  • Adds tests, compatibility stubs, signal registration, and release metadata.

Key concerns: stale enterprise caches, swallowed refund failures, standalone admin errors, and incomplete test coverage. The PR also substantially exceeds the repository’s 400-line/10-file review threshold.

File Description
tox.ini Updates import formatting.
tests/​test_platform_support/​test_utils.py Tests support utilities.
tests/​test_platform_support/​test_signals.py Tests signal handlers.
tests/​test_platform_support/​test_serializers.py Tests enrollment serialization.
tests/​test_platform_support/​test_context.py Tests event context.
tests/​test_platform_support/​test_api.py Tests support APIs.
tests/​test_platform_support/​test_admin.py Tests CSV admin workflow.
tests/​test_platform_support/​platform_stubs.py Stubs platform-only dependencies.
tests/​test_platform_support/​mixins.py Provides API test helpers.
tests/​test_platform_support/​factories.py Provides specialized factories.
tests/​test_platform_support/​enrollments/​test_utils.py Tests enrollment utilities.
tests/​test_platform_support/​enrollments/​__init__.py Marks test package.
tests/​test_platform_support/​__init__.py Defines test fixtures.
tests/​test_apps.py Tests signal registration.
tests/​filters/​test_logistration.py Updates migrated-path documentation.
enterprise/​views.py Uses internal login utility.
enterprise/​utils.py Uses internal enrollment utility.
enterprise/​templates/​enterprise_support/​enterprise_consent_declined_notification.html Adds consent notification template.
enterprise/​templates/​enterprise_support/​admin/​enrollment_attributes_override.html Adds admin upload template.
enterprise/​signals.py Uses internal customer lookup.
enterprise/​settings/​test.py Adds standalone support settings.
enterprise/​platform_support/​utils.py Adds enterprise UI and cache utilities.
enterprise/​platform_support/​tasks.py Adds consent-cache clearing task.
enterprise/​platform_support/​signals.py Adds platform and model handlers.
enterprise/​platform_support/​serializers.py Adds enrollment serializer.
enterprise/​platform_support/​README.rst Documents package purpose.
enterprise/​platform_support/​enrollments/​utils.py Adds LMS enrollment logic.
enterprise/​platform_support/​enrollments/​exceptions.py Adds enrollment exceptions.
enterprise/​platform_support/​enrollments/​__init__.py Marks enrollment package.
enterprise/​platform_support/​context.py Adds event context helper.
enterprise/​platform_support/​api.py Adds enterprise and consent APIs.
enterprise/​platform_support/​admin/​views.py Adds CSV override view.
enterprise/​platform_support/​admin/​forms.py Adds CSV upload form.
enterprise/​platform_support/​admin/​__init__.py Marks admin package.
enterprise/​platform_support/​__init__.py Marks support package.
enterprise/​overrides/​program_nudge_email.py Uses internal learner lookup.
enterprise/​overrides/​learner_home.py Uses internal support APIs.
enterprise/​overrides/​course_home_progress.py Uses internal naming utility.
enterprise/​overrides/​branding.py Uses internal branding utilities.
enterprise/​management/​commands/​email_drip_for_missing_dsc_records.py Uses internal access check.
enterprise/​filters/​support.py Repoints support filter imports.
enterprise/​filters/​logistration.py Repoints authentication filter imports.
enterprise/​filters/​discounts.py Repoints learner check import.
enterprise/​filters/​dashboard.py Repoints dashboard imports.
enterprise/​filters/​course_modes.py Repoints customer lookup import.
enterprise/​core_api.py Repoints customer resolution import.
enterprise/​constants.py Adds signal dispatch identifiers.
enterprise/​apps.py Registers migrated signal handlers.
enterprise/​admin/​__init__.py Registers migrated admin view.
enterprise/​__init__.py Bumps version to 8.18.0.
consent/​helpers.py Uses internal consent support APIs.
CHANGELOG.rst Documents the migration release.

🧠 Review effort: Balanced


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread enterprise/admin/__init__.py
Comment thread enterprise/platform_support/signals.py Outdated
Comment thread enterprise/platform_support/utils.py
Comment thread enterprise/platform_support/admin/views.py
Comment thread enterprise/platform_support/api.py
Comment thread tests/test_platform_support/test_utils.py Outdated
Comment thread enterprise/platform_support/api.py
Comment thread enterprise/platform_support/api.py
Comment thread enterprise/platform_support/enrollments/utils.py
Comment thread enterprise/platform_support/utils.py
@pwnage101
pwnage101 force-pushed the pwnage101/ENT-11576 branch 4 times, most recently from 625ab3d to c04f8be Compare October 8, 2026 22:37
@pwnage101 pwnage101 changed the title feat: move enterprise_support into edx-enterprise as enterprise.platform_support feat!: move enterprise_support into edx-enterprise as enterprise.platform_support Oct 8, 2026
@pwnage101
pwnage101 marked this pull request as ready for review October 8, 2026 22:37
Moves openedx-platform's `openedx.features.enterprise_support` module into this
repo as `enterprise.platform_support`, so the platform copy can be deleted and
edx-enterprise stops being a mandatory platform dependency.

Related changes:
- The package's five signal handlers move into `enterprise/signals.py`, beside
  this app's others. `EnterpriseConfig.ready()` connects the three bound to
  openedx-platform grade and unenrollment signals, in the LMS only, since
  `EnterpriseSupportConfig` was never installed in Studio.
- `enterprise/signals.py`'s four existing module-level `.connect()` calls move out
  of import time: the two `openedx_events` hookups become `@receiver`, and the
  two platform-only ones are connected in `EnterpriseConfig.ready()`.
- `markupsafe`, which now stands in for the platform's `HTML`/`Text` wrappers, is
  declared in `requirements/base.in` instead of arriving only through jinja2.
- Keep release-ulmo's `build_enterprise_branding_for_authn_mfe`.
- Keep release-ulmo's `enterprise_slug` sidebar-context key.
- Keep release-ulmo's `ENABLE_LEGACY_INTEGRATED_CHANNELS` switch.
- Keep release-ulmo's null-safe SSO pipeline lookup.
- Keep release-ulmo's `@set_code_owner_attribute` on the Celery task.
- ``enterprise_enabled()`` is now a hybrid implementation which now
  honors both the top-level `ENABLE_ENTERPRISE_INTEGRATION` setting used
  by master and the `FEATURES` entry used by release-ulmo.

The moved tests live at `tests/test_platform_support/` rather than beside the
package, because this repo keeps every test under the top-level `tests/` tree and
pytest's ``testpaths = tests`` collects nothing outside it; the signal-handler
tests sit in `tests/test_enterprise/test_signals.py` with the module they test.
123 tests run and pass, bringing the moved package to 92% coverage. Adapting them to run without an
openedx-platform install took more than an import flip:

- `platform_stubs.py` registers stand-ins in `sys.modules` for the modules the
  package imports lazily at call time -- the enrollment error classes, the
  completion app and the branding API -- so that `except` clauses and
  `assertRaises` match the classes the tests raise.
- Platform test base classes and fixtures give way to this repo's equivalents:
  Django's `TestCase` for `CacheIsolationTestCase`, `test_utils` factories for
  the platform's, and explicit cache clears in place of the cache isolation the
  platform's test settings used to provide.
- The three modulestore-backed modules are rewritten against mocks: the admin
  view's two ORM entry points, the signal handlers invoked directly rather than
  through platform signals, and the completion app behind `is_course_accessed`.
- release-ulmo's three tests for `build_enterprise_branding_for_authn_mfe` are
  ported. The rest come from master's test files, which never had the function.
- HTTP mocking moves from httpretty, which this repo does not depend on, to
  `responses`, which it already pins and uses in 33 other test modules.
- `test_enterprise_fields_only` now patches `get_configuration_value`. The move
  swapped the platform's `configuration_helpers` for this repo's helper, but the
  test kept patching the old name, which no longer exists on the module.
- The unittest-style assertions the modules arrived with are converted to plain
  `assert` and `pytest.raises`, removing all eleven `# noqa: PT009`/`PT027`
  suppressions. The one `# noqa: PT019` goes too: its parameter was named `_`
  only because it was unused, so it is now named and asserted on instead.
- `test_logout.py` is not migrated. It covers `LogoutView._is_enterprise_target`,
  which stays in the LMS, so it is relocated there instead.

`enterprise/settings/test.py` gains the ten settings the moved package reads,
including `ENTERPRISE_API_URL`, `ENTERPRISE_CONSENT_API_URL`,
`BASE_COOKIE_DOMAIN` and `SUPPORT_SITE_LINK`. These still come from
`lms/envs/common.py` at runtime; migrating them into `plugin_settings()` is
ENT-11577.

ENT-11576

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@pwnage101
pwnage101 force-pushed the pwnage101/ENT-11576 branch from c04f8be to 1fc4e5a Compare October 8, 2026 22:52

@brobro10000 brobro10000 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Reviewed with Claude Code (pr-review-hil, cross-checked against the companion edx-platform#494/openedx-platform#39166 split). This is a faithful move — spot-checked signals.py, apps.py, and platform_stubs.py against the pre-image of the deleted openedx/features/enterprise_support/, and the moved logic is byte-for-byte unchanged aside from the new conditional signal-wiring in apps.py::ready(). A couple of non-blocking items:

  • codecov/patch is currently failing at 91.30% vs. the 95% target, concentrated in the new platform_support/ tree. Small, closeable gap — worth a look before merge, not blocking.
  • Heads up: edx-platform#494 and openedx-platform#39166 both pin edx-enterprise==9.0.0, which doesn't exist on PyPI until this merges and releases. Worth confirming the merge/release order is coordinated before any of the three land.

See inline comment below. Otherwise LGTM.

Comment thread enterprise/signals.py


@receiver(post_save, sender=models.EnterpriseCourseEnrollment)
def update_dsc_cache_on_course_enrollment(sender, instance, **kwargs): # pylint: disable=unused-argument

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

update_dsc_cache_on_course_enrollment (here) and update_dsc_cache_on_enterprise_customer_update (line 566) have no SERVICE_VARIANT gate, so now that enterprise is registered under both lms.djangoapp and cms.djangoapp, they're reachable from Studio — which was structurally impossible before this move (EnterpriseSupportConfig was never installed in Studio). test_ready_activates_data_sharing_consent_cache_signal_handlers suggests this is intentional (these react to edx-enterprise's own models, unlike the three LMS-only grade/unenrollment handlers which do get a SERVICE_VARIANT gate in apps.py). Can you confirm that's deliberate? Non-blocking either way.

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.

3 participants