edx-enterprise-data 9.7.1__tar.gz → 10.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/CHANGELOG.rst +19 -0
- {edx_enterprise_data-9.7.1/edx_enterprise_data.egg-info → edx_enterprise_data-10.2.0}/PKG-INFO +3 -4
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0/edx_enterprise_data.egg-info}/PKG-INFO +3 -4
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/edx_enterprise_data.egg-info/requires.txt +2 -2
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/__init__.py +1 -1
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py +49 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py +71 -6
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/analytics_leaderboard.py +6 -4
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/pre_warm_analytics_cache.py +5 -4
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/tests/test_pre_warm_analytics_cache.py +14 -5
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/utils.py +17 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/rules.py +1 -1
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/base.in +2 -2
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/base.txt +24 -26
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/ci.txt +5 -5
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/common_constraints.txt +4 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/constraints.txt +0 -15
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/dev.txt +37 -45
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/pip.txt +5 -3
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/pip_tools.txt +2 -2
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/quality.txt +39 -47
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/test-master.txt +26 -28
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/test-reporting.txt +16 -16
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/test.txt +26 -28
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/setup.py +0 -1
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/LICENSE +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/MANIFEST.in +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/README.md +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/edx_enterprise_data.egg-info/SOURCES.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/edx_enterprise_data.egg-info/dependency_links.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/edx_enterprise_data.egg-info/not-zip-safe +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/edx_enterprise_data.egg-info/top_level.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/constants.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/data_loaders.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/queries/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/queries/skills_daily_rollup_admin_dash.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/tables/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/tables/base.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/tables/skills_daily_rollup_admin_dash.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/utils.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/urls.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v0/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v0/serializers.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v0/urls.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v0/views.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/serializers.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/urls.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/analytics_completions.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/analytics_engagements.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/analytics_enrollments.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/base.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/enterprise_admin.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/enterprise_learner.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/enterprise_offers.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/apps.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/cache/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/cache/decorators.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/clients.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/constants.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/filters.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/fixtures/enterprise_enrollment.json +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/fixtures/enterprise_user.json +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/create_dummy_data.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/create_dummy_data_lpr_v1.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/create_enterprise_enrollment.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/create_enterprise_learner_enrollment_lpr_v1.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/create_enterprise_offer.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/create_enterprise_user.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/tests/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/tests/test_create_dummy_data_lpr_v1.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/tests/test_create_enterprise_enrollment.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/tests/test_create_enterprise_user.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0001_initial.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0002_auto_20180430_1358.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0003_auto_20180501_0603.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0004_auto_20180501_0928.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0004_auto_20180508_1652.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0005_auto_20180524_2204.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0006_auto_20180612_0336.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0007_auto_20180612_0534.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0008_auto_20180614_0108.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0009_auto_20180628_1152.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0010_enterpriseenrollment_created.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0011_enterpriseuser.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0012_auto_20180831_1930.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0013_auto_20180831_1931.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0014_enterpriseuser_created.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0015_auto_20180907_1757.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0016_auto_20180924_2138.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0017_enterpriseenrollment_unenrollment_timestamp.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0018_enterprisedatafeaturerole_enterprisedataroleassignment.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0019_add_enterprise_data_feature_roles.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0020_add_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0021_auto_20190329_1241.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0022_remove_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0023_enterpriselearner_enterpriselearnerenrollment.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0024_auto_20210602_1811.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0025_auto_20210703_1854.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0026_auto_20210916_0414.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0027_enterpriselearnerenrollment_total_learning_time_seconds.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0028_enterpriselearnerenrollment_offer_id.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0029_enterpriseoffer.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0030_auto_20230609_1353.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0031_auto_20230615_0705.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0032_auto_20230704_0818.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0033_enterpriseadminlearnerprogress_enterpriseadminsummarizeinsights.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0034_auto_20230907_0834.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0035_auto_20230907_1154.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0036_enterprisesubsidybudget_subsidy_access_policy_display_name.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0037_alter_enterpriseenrollment_consent_granted.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0038_enterpriseoffer_export_timestamp.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0039_auto_20240212_1403.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0040_auto_20240718_0536_squashed_0043_alter_enterpriselearnerenrollment_enterprise_enrollment_id.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0044_enterpriseexecedlcmoduleperformance.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/models.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/paginators.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/renderers.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/settings/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/settings/test.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/signals.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/mock_analytics_data.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/mock_enrollments.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/test_analytics_engagements.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/test_analytics_enrollments.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/test_analytics_leaderboard.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/test_data_loaders.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/test_enterprise_completions.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/v0/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/v0/test_serializers.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/v1/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/v1/test_serializers.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/v1/test_views.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/v1/views/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/v1/views/test_enterprise_admin.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/factories.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/mixins.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/test_clients.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/test_filters.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/test_models.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/test_utils.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/test_views.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/urls.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/admin.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/apps.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/constants.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/0001_initial.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/0002_add_enterprise_data_feature_roles.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/0003_add_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/0004_enterprisedataroleassignment_enterprise_id.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/0005_turn_on_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/0006_remove_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/0007_enterprisedataroleassignment_applies_to_all_contexts.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/models.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/tests/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/tests/factories.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/tests/test_models.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/clients/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/clients/enterprise.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/clients/s3.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/clients/snowflake.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/clients/vertica.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/delivery_method.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/external_resource_link_report.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/fixtures/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/fixtures/enterprise_customer_reporting.json +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/reporter.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/send_enterprise_reports.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_clients.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_delivery_method.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_enterprise_client.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_external_link_report.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_reporter.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_send_enterprise_reports.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_utils.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_vertica_client.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/utils.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/utils.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/django.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/reporting.in +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/setup.cfg +0 -0
@@ -16,6 +16,25 @@ Unreleased
|
|
16
16
|
|
17
17
|
=========================
|
18
18
|
|
19
|
+
[10.2.0] - 2024-11-12
|
20
|
+
---------------------
|
21
|
+
* Fixed null email issue for leaderboard.
|
22
|
+
|
23
|
+
|
24
|
+
[10.1.0] - 2024-10-29
|
25
|
+
---------------------
|
26
|
+
* Added management command to pre-warm analytics data.
|
27
|
+
|
28
|
+
[10.0.1] - 2024-10-25
|
29
|
+
---------------------
|
30
|
+
* Same as ``10.0.0``
|
31
|
+
* Bumping the version so a new tag can be created in the GitHub
|
32
|
+
|
33
|
+
[10.0.0] - 2024-10-25
|
34
|
+
---------------------
|
35
|
+
* feat!: Python 3.12 Upgrade
|
36
|
+
* Dropped support for ``Python<3.12``
|
37
|
+
|
19
38
|
[9.7.0] - 2024-10-23
|
20
39
|
---------------------
|
21
40
|
* feat: Add API to fetch enterprise budgets information
|
{edx_enterprise_data-9.7.1/edx_enterprise_data.egg-info → edx_enterprise_data-10.2.0}/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: edx-enterprise-data
|
3
|
-
Version:
|
3
|
+
Version: 10.2.0
|
4
4
|
Summary: Enterprise Reporting
|
5
5
|
Home-page: https://github.com/openedx/edx-enterprise-data
|
6
6
|
Author: edX
|
@@ -9,7 +9,6 @@ License: AGPL 3.0
|
|
9
9
|
Classifier: Framework :: Django
|
10
10
|
Classifier: Framework :: Django :: 4.2
|
11
11
|
Classifier: Programming Language :: Python :: 3
|
12
|
-
Classifier: Programming Language :: Python :: 3.8
|
13
12
|
Classifier: Programming Language :: Python :: 3.12
|
14
13
|
License-File: LICENSE
|
15
14
|
Requires-Dist: Django
|
@@ -24,8 +23,8 @@ Requires-Dist: edx-rbac
|
|
24
23
|
Requires-Dist: edx-rest-api-client
|
25
24
|
Requires-Dist: factory_boy
|
26
25
|
Requires-Dist: mysql-connector-python
|
27
|
-
Requires-Dist: numpy
|
28
|
-
Requires-Dist: pandas
|
26
|
+
Requires-Dist: numpy
|
27
|
+
Requires-Dist: pandas
|
29
28
|
Requires-Dist: requests
|
30
29
|
Requires-Dist: rules
|
31
30
|
Provides-Extra: reporting
|
{edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0/edx_enterprise_data.egg-info}/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: edx-enterprise-data
|
3
|
-
Version:
|
3
|
+
Version: 10.2.0
|
4
4
|
Summary: Enterprise Reporting
|
5
5
|
Home-page: https://github.com/openedx/edx-enterprise-data
|
6
6
|
Author: edX
|
@@ -9,7 +9,6 @@ License: AGPL 3.0
|
|
9
9
|
Classifier: Framework :: Django
|
10
10
|
Classifier: Framework :: Django :: 4.2
|
11
11
|
Classifier: Programming Language :: Python :: 3
|
12
|
-
Classifier: Programming Language :: Python :: 3.8
|
13
12
|
Classifier: Programming Language :: Python :: 3.12
|
14
13
|
License-File: LICENSE
|
15
14
|
Requires-Dist: Django
|
@@ -24,8 +23,8 @@ Requires-Dist: edx-rbac
|
|
24
23
|
Requires-Dist: edx-rest-api-client
|
25
24
|
Requires-Dist: factory_boy
|
26
25
|
Requires-Dist: mysql-connector-python
|
27
|
-
Requires-Dist: numpy
|
28
|
-
Requires-Dist: pandas
|
26
|
+
Requires-Dist: numpy
|
27
|
+
Requires-Dist: pandas
|
29
28
|
Requires-Dist: requests
|
30
29
|
Requires-Dist: rules
|
31
30
|
Provides-Extra: reporting
|
@@ -163,6 +163,55 @@ class FactEngagementAdminDashQueries:
|
|
163
163
|
GROUP BY email;
|
164
164
|
"""
|
165
165
|
|
166
|
+
@staticmethod
|
167
|
+
def get_engagement_data_for_leaderboard_null_email_only_query():
|
168
|
+
"""
|
169
|
+
Get the query to fetch the engagement data for leaderboard for NULL emails only.
|
170
|
+
|
171
|
+
Query should fetch the engagement data for like learning time, session length of
|
172
|
+
the enterprise learners to show in the leaderboard.
|
173
|
+
|
174
|
+
Returns:
|
175
|
+
(str): Query to fetch the engagement data for leaderboard.
|
176
|
+
"""
|
177
|
+
return """
|
178
|
+
SELECT
|
179
|
+
email,
|
180
|
+
ROUND(SUM(learning_time_seconds) / 3600, 1) as learning_time_hours,
|
181
|
+
SUM(is_engaged) as session_count,
|
182
|
+
CASE
|
183
|
+
WHEN SUM(is_engaged) = 0 THEN 0.0
|
184
|
+
ELSE ROUND(SUM(learning_time_seconds) / 3600 / SUM(is_engaged), 1)
|
185
|
+
END AS average_session_length
|
186
|
+
FROM fact_enrollment_engagement_day_admin_dash
|
187
|
+
WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
188
|
+
(activity_date BETWEEN %(start_date)s AND %(end_date)s) AND
|
189
|
+
is_engaged = 1 AND
|
190
|
+
email is NULL
|
191
|
+
GROUP BY email;
|
192
|
+
"""
|
193
|
+
|
194
|
+
@staticmethod
|
195
|
+
def get_completion_data_for_leaderboard_null_email_only_query():
|
196
|
+
"""
|
197
|
+
Get the query to fetch the completions data for leaderboard for NULL emails.
|
198
|
+
|
199
|
+
Query should fetch the completion data for like course completion count of
|
200
|
+
the enterprise learners to show in the leaderboard.
|
201
|
+
|
202
|
+
Returns:
|
203
|
+
(list<str>): Query to fetch the completions data for leaderboard.
|
204
|
+
"""
|
205
|
+
return """
|
206
|
+
SELECT email, count(course_key) as course_completion_count
|
207
|
+
FROM fact_enrollment_admin_dash
|
208
|
+
WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
209
|
+
(passed_date BETWEEN %(start_date)s AND %(end_date)s) AND
|
210
|
+
has_passed = 1 AND
|
211
|
+
email is NULL
|
212
|
+
GROUP BY email;
|
213
|
+
"""
|
214
|
+
|
166
215
|
@staticmethod
|
167
216
|
def get_leaderboard_data_count_query():
|
168
217
|
"""
|
@@ -5,6 +5,7 @@ from datetime import date
|
|
5
5
|
from uuid import UUID
|
6
6
|
|
7
7
|
from enterprise_data.cache.decorators import cache_it
|
8
|
+
from enterprise_data.utils import find_first
|
8
9
|
|
9
10
|
from ..queries import FactEngagementAdminDashQueries
|
10
11
|
from ..utils import run_query
|
@@ -168,7 +169,14 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
168
169
|
|
169
170
|
@cache_it()
|
170
171
|
def _get_engagement_data_for_leaderboard(
|
171
|
-
self,
|
172
|
+
self,
|
173
|
+
enterprise_customer_uuid: UUID,
|
174
|
+
start_date: date,
|
175
|
+
end_date: date,
|
176
|
+
limit: int,
|
177
|
+
offset: int,
|
178
|
+
include_null_email: bool,
|
179
|
+
|
172
180
|
):
|
173
181
|
"""
|
174
182
|
Get the engagement data for leaderboard.
|
@@ -182,11 +190,12 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
182
190
|
end_date (date): The end date.
|
183
191
|
limit (int): The maximum number of records to return.
|
184
192
|
offset (int): The number of records to skip.
|
193
|
+
include_null_email (bool): If True, only fetch data for NULL emails.
|
185
194
|
|
186
195
|
Returns:
|
187
196
|
list[dict]: The engagement data for leaderboard.
|
188
197
|
"""
|
189
|
-
|
198
|
+
engagements = run_query(
|
190
199
|
query=self.queries.get_engagement_data_for_leaderboard_query(),
|
191
200
|
params={
|
192
201
|
'enterprise_customer_uuid': enterprise_customer_uuid,
|
@@ -198,9 +207,27 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
198
207
|
as_dict=True,
|
199
208
|
)
|
200
209
|
|
210
|
+
if include_null_email:
|
211
|
+
engagement_for_null_email = run_query(
|
212
|
+
query=self.queries.get_engagement_data_for_leaderboard_null_email_only_query(),
|
213
|
+
params={
|
214
|
+
'enterprise_customer_uuid': enterprise_customer_uuid,
|
215
|
+
'start_date': start_date,
|
216
|
+
'end_date': end_date,
|
217
|
+
},
|
218
|
+
as_dict=True,
|
219
|
+
)
|
220
|
+
engagements += engagement_for_null_email
|
221
|
+
return engagements
|
222
|
+
|
201
223
|
@cache_it()
|
202
224
|
def _get_completion_data_for_leaderboard_query(
|
203
|
-
self,
|
225
|
+
self,
|
226
|
+
enterprise_customer_uuid: UUID,
|
227
|
+
start_date: date,
|
228
|
+
end_date: date,
|
229
|
+
email_list: list,
|
230
|
+
include_null_email: bool,
|
204
231
|
):
|
205
232
|
"""
|
206
233
|
Get the completion data for leaderboard.
|
@@ -213,11 +240,13 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
213
240
|
start_date (date): The start date.
|
214
241
|
end_date (date): The end date.
|
215
242
|
email_list (list<str>): List of emails of the enterprise learners.
|
243
|
+
include_null_email (bool): If True, only fetch data for NULL emails.
|
216
244
|
|
217
245
|
Returns:
|
218
246
|
list[dict]: The engagement data for leaderboard.
|
219
247
|
"""
|
220
|
-
|
248
|
+
|
249
|
+
completions = run_query(
|
221
250
|
query=self.queries.get_completion_data_for_leaderboard_query(email_list),
|
222
251
|
params={
|
223
252
|
'enterprise_customer_uuid': enterprise_customer_uuid,
|
@@ -227,8 +256,28 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
227
256
|
as_dict=True,
|
228
257
|
)
|
229
258
|
|
259
|
+
if include_null_email:
|
260
|
+
completions_for_null_email = run_query(
|
261
|
+
query=self.queries.get_completion_data_for_leaderboard_null_email_only_query(),
|
262
|
+
params={
|
263
|
+
'enterprise_customer_uuid': enterprise_customer_uuid,
|
264
|
+
'start_date': start_date,
|
265
|
+
'end_date': end_date,
|
266
|
+
},
|
267
|
+
as_dict=True,
|
268
|
+
)
|
269
|
+
completions += completions_for_null_email
|
270
|
+
|
271
|
+
return completions
|
272
|
+
|
230
273
|
def get_all_leaderboard_data(
|
231
|
-
self,
|
274
|
+
self,
|
275
|
+
enterprise_customer_uuid: UUID,
|
276
|
+
start_date: date,
|
277
|
+
end_date: date,
|
278
|
+
limit: int,
|
279
|
+
offset: int,
|
280
|
+
total_count: int,
|
232
281
|
):
|
233
282
|
"""
|
234
283
|
Get the leaderboard data for the given enterprise customer.
|
@@ -239,32 +288,48 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
239
288
|
end_date (date): The end date.
|
240
289
|
limit (int): The maximum number of records to return.
|
241
290
|
offset (int): The number of records to skip.
|
291
|
+
total_count (int): The total number of records.
|
242
292
|
|
243
293
|
Returns:
|
244
294
|
list[dict]: The leaderboard data.
|
245
295
|
"""
|
296
|
+
include_null_email = False
|
297
|
+
# If this is the last or only page, we need to include NULL emails record.
|
298
|
+
if total_count <= offset + limit:
|
299
|
+
include_null_email = True
|
300
|
+
|
246
301
|
engagement_data = self._get_engagement_data_for_leaderboard(
|
247
302
|
enterprise_customer_uuid=enterprise_customer_uuid,
|
248
303
|
start_date=start_date,
|
249
304
|
end_date=end_date,
|
250
305
|
limit=limit,
|
251
306
|
offset=offset,
|
307
|
+
include_null_email=include_null_email,
|
252
308
|
)
|
253
309
|
# If there is no data, no need to proceed.
|
254
310
|
if not engagement_data:
|
255
311
|
return []
|
256
312
|
|
257
|
-
engagement_data_dict = {
|
313
|
+
engagement_data_dict = {
|
314
|
+
engagement['email']: engagement for engagement in engagement_data if engagement['email']
|
315
|
+
}
|
258
316
|
completion_data = self._get_completion_data_for_leaderboard_query(
|
259
317
|
enterprise_customer_uuid=enterprise_customer_uuid,
|
260
318
|
start_date=start_date,
|
261
319
|
end_date=end_date,
|
262
320
|
email_list=list(engagement_data_dict.keys()),
|
321
|
+
include_null_email=include_null_email,
|
263
322
|
)
|
264
323
|
for completion in completion_data:
|
265
324
|
email = completion['email']
|
266
325
|
engagement_data_dict[email]['course_completion_count'] = completion['course_completion_count']
|
267
326
|
|
327
|
+
if include_null_email:
|
328
|
+
engagement_data_dict['None'] = find_first(engagement_data, lambda x: x['email'] is None) or {}
|
329
|
+
completion = find_first(completion_data, lambda x: x['email'] is None) or \
|
330
|
+
{'course_completion_count': 'Unknown'}
|
331
|
+
engagement_data_dict['None']['course_completion_count'] = completion['course_completion_count']
|
332
|
+
|
268
333
|
return list(engagement_data_dict.values())
|
269
334
|
|
270
335
|
@cache_it()
|
@@ -49,17 +49,18 @@ class AdvanceAnalyticsLeaderboardView(AnalyticsPaginationMixin, ViewSet):
|
|
49
49
|
end_date = serializer.data.get('end_date', date.today())
|
50
50
|
page = serializer.data.get('page', 1)
|
51
51
|
page_size = serializer.data.get('page_size', 100)
|
52
|
-
|
52
|
+
total_count = FactEngagementAdminDashTable().get_leaderboard_data_count(
|
53
53
|
enterprise_customer_uuid=enterprise_uuid,
|
54
54
|
start_date=start_date,
|
55
55
|
end_date=end_date,
|
56
|
-
limit=page_size,
|
57
|
-
offset=(page - 1) * page_size,
|
58
56
|
)
|
59
|
-
|
57
|
+
leaderboard = FactEngagementAdminDashTable().get_all_leaderboard_data(
|
60
58
|
enterprise_customer_uuid=enterprise_uuid,
|
61
59
|
start_date=start_date,
|
62
60
|
end_date=end_date,
|
61
|
+
limit=page_size,
|
62
|
+
offset=(page - 1) * page_size,
|
63
|
+
total_count=total_count,
|
63
64
|
)
|
64
65
|
response_type = request.query_params.get('response_type', ResponseType.JSON.value)
|
65
66
|
|
@@ -102,6 +103,7 @@ class AdvanceAnalyticsLeaderboardView(AnalyticsPaginationMixin, ViewSet):
|
|
102
103
|
end_date=end_date,
|
103
104
|
limit=page_size,
|
104
105
|
offset=offset,
|
106
|
+
total_count=total_count,
|
105
107
|
)
|
106
108
|
yield from leaderboard
|
107
109
|
offset += page_size
|
@@ -161,17 +161,18 @@ class Command(BaseCommand):
|
|
161
161
|
start_date=start_date,
|
162
162
|
end_date=end_date,
|
163
163
|
)
|
164
|
-
enterprise_engagement_table.
|
164
|
+
total_count = enterprise_engagement_table.get_leaderboard_data_count(
|
165
165
|
enterprise_customer_uuid=enterprise_customer_uuid,
|
166
166
|
start_date=start_date,
|
167
167
|
end_date=end_date,
|
168
|
-
limit=page_size,
|
169
|
-
offset=0,
|
170
168
|
)
|
171
|
-
enterprise_engagement_table.
|
169
|
+
enterprise_engagement_table.get_all_leaderboard_data(
|
172
170
|
enterprise_customer_uuid=enterprise_customer_uuid,
|
173
171
|
start_date=start_date,
|
174
172
|
end_date=end_date,
|
173
|
+
limit=page_size,
|
174
|
+
offset=0,
|
175
|
+
total_count=total_count,
|
175
176
|
)
|
176
177
|
|
177
178
|
@staticmethod
|
@@ -30,9 +30,18 @@ class Test(TestCase):
|
|
30
30
|
get_enrollment_date_range_patcher.start()
|
31
31
|
self.addCleanup(get_enrollment_date_range_patcher.stop)
|
32
32
|
|
33
|
-
@patch(
|
34
|
-
|
35
|
-
|
33
|
+
@patch(
|
34
|
+
'enterprise_data.admin_analytics.database.tables.fact_engagement_admin_dash.run_query',
|
35
|
+
MagicMock(return_value=[])
|
36
|
+
)
|
37
|
+
@patch(
|
38
|
+
'enterprise_data.admin_analytics.database.tables.fact_enrollment_admin_dash.run_query',
|
39
|
+
MagicMock(return_value=[])
|
40
|
+
)
|
41
|
+
@patch(
|
42
|
+
'enterprise_data.admin_analytics.database.tables.skills_daily_rollup_admin_dash.run_query',
|
43
|
+
MagicMock(return_value=[])
|
44
|
+
)
|
36
45
|
@patch('enterprise_data.api.v1.views.analytics_enrollments.FactEnrollmentAdminDashTable.get_top_enterprises')
|
37
46
|
@patch('enterprise_data.cache.decorators.cache.set')
|
38
47
|
@patch('enterprise_data.cache.decorators.cache.get')
|
@@ -47,5 +56,5 @@ class Test(TestCase):
|
|
47
56
|
|
48
57
|
call_command('pre_warm_analytics_cache')
|
49
58
|
|
50
|
-
assert mock_get_cache.call_count ==
|
51
|
-
assert mock_set_cache.call_count ==
|
59
|
+
assert mock_get_cache.call_count == 23
|
60
|
+
assert mock_set_cache.call_count == 23
|
@@ -97,3 +97,20 @@ def primary_subject_truncate(x):
|
|
97
97
|
return x
|
98
98
|
else:
|
99
99
|
return "other"
|
100
|
+
|
101
|
+
|
102
|
+
def find_first(iterable, condition):
|
103
|
+
"""
|
104
|
+
Find the first item in an iterable that satisfies the condition.
|
105
|
+
|
106
|
+
Arguments:
|
107
|
+
iterable (iterable): The iterable to search.
|
108
|
+
condition (function): The condition to satisfy.
|
109
|
+
|
110
|
+
Returns:
|
111
|
+
The first item that satisfies the condition, or None if no item satisfies the condition.
|
112
|
+
"""
|
113
|
+
try:
|
114
|
+
return next(item for item in iterable if condition(item))
|
115
|
+
except StopIteration:
|
116
|
+
return None
|
@@ -57,5 +57,5 @@ def request_user_has_explicit_access(*args, **kwargs):
|
|
57
57
|
|
58
58
|
rules.add_perm(
|
59
59
|
'can_access_enterprise',
|
60
|
-
request_user_has_implicit_access | request_user_has_explicit_access
|
60
|
+
request_user_has_implicit_access | request_user_has_explicit_access
|
61
61
|
)
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# This file is autogenerated by pip-compile with Python 3.
|
2
|
+
# This file is autogenerated by pip-compile with Python 3.12
|
3
3
|
# by the following command:
|
4
4
|
#
|
5
5
|
# make upgrade
|
@@ -10,15 +10,15 @@ asgiref==3.8.1
|
|
10
10
|
# via django
|
11
11
|
asn1crypto==1.5.1
|
12
12
|
# via snowflake-connector-python
|
13
|
-
awscli==1.
|
13
|
+
awscli==1.35.20
|
14
14
|
# via -r requirements/reporting.in
|
15
15
|
bcrypt==4.2.0
|
16
16
|
# via paramiko
|
17
17
|
billiard==4.2.1
|
18
18
|
# via celery
|
19
|
-
boto3==1.35.
|
19
|
+
boto3==1.35.54
|
20
20
|
# via -r requirements/reporting.in
|
21
|
-
botocore==1.35.
|
21
|
+
botocore==1.35.54
|
22
22
|
# via
|
23
23
|
# awscli
|
24
24
|
# boto3
|
@@ -35,7 +35,7 @@ cffi==1.17.1
|
|
35
35
|
# cryptography
|
36
36
|
# pynacl
|
37
37
|
# snowflake-connector-python
|
38
|
-
charset-normalizer==3.
|
38
|
+
charset-normalizer==3.4.0
|
39
39
|
# via
|
40
40
|
# requests
|
41
41
|
# snowflake-connector-python
|
@@ -54,7 +54,7 @@ click-repl==0.3.0
|
|
54
54
|
# via celery
|
55
55
|
colorama==0.4.6
|
56
56
|
# via awscli
|
57
|
-
cryptography==43.0.
|
57
|
+
cryptography==43.0.3
|
58
58
|
# via
|
59
59
|
# -r requirements/reporting.in
|
60
60
|
# django-fernet-fields-v2
|
@@ -100,18 +100,18 @@ djangorestframework==3.15.2
|
|
100
100
|
# edx-drf-extensions
|
101
101
|
djangorestframework-csv==3.0.2
|
102
102
|
# via -r requirements/base.in
|
103
|
-
dnspython==2.
|
103
|
+
dnspython==2.7.0
|
104
104
|
# via pymongo
|
105
105
|
docutils==0.16
|
106
106
|
# via awscli
|
107
107
|
drf-jwt==1.19.2
|
108
108
|
# via edx-drf-extensions
|
109
|
-
edx-django-utils==
|
109
|
+
edx-django-utils==7.0.0
|
110
110
|
# via
|
111
111
|
# -r requirements/base.in
|
112
112
|
# edx-drf-extensions
|
113
113
|
# edx-rest-api-client
|
114
|
-
edx-drf-extensions==10.
|
114
|
+
edx-drf-extensions==10.5.0
|
115
115
|
# via
|
116
116
|
# -r requirements/base.in
|
117
117
|
# edx-rbac
|
@@ -125,7 +125,7 @@ edx-rest-api-client==6.0.0
|
|
125
125
|
# via -r requirements/base.in
|
126
126
|
factory-boy==3.3.1
|
127
127
|
# via -r requirements/base.in
|
128
|
-
faker==30.
|
128
|
+
faker==30.8.2
|
129
129
|
# via factory-boy
|
130
130
|
filelock==3.16.1
|
131
131
|
# via snowflake-connector-python
|
@@ -143,24 +143,21 @@ kombu==5.4.2
|
|
143
143
|
# via celery
|
144
144
|
monotonic==1.6
|
145
145
|
# via py2neo
|
146
|
-
mysql-connector-python==9.
|
146
|
+
mysql-connector-python==9.1.0
|
147
147
|
# via -r requirements/base.in
|
148
|
-
newrelic==10.
|
148
|
+
newrelic==10.2.0
|
149
149
|
# via edx-django-utils
|
150
|
-
numpy==1.
|
150
|
+
numpy==2.1.3
|
151
151
|
# via
|
152
|
-
# -c requirements/constraints.txt
|
153
152
|
# -r requirements/base.in
|
154
153
|
# pandas
|
155
154
|
packaging==24.1
|
156
155
|
# via
|
157
156
|
# py2neo
|
158
157
|
# snowflake-connector-python
|
159
|
-
pandas==2.
|
160
|
-
# via
|
161
|
-
|
162
|
-
# -r requirements/base.in
|
163
|
-
pansi==2020.7.3
|
158
|
+
pandas==2.2.3
|
159
|
+
# via -r requirements/base.in
|
160
|
+
pansi==2024.11.0
|
164
161
|
# via py2neo
|
165
162
|
paramiko==3.5.0
|
166
163
|
# via -r requirements/reporting.in
|
@@ -168,11 +165,13 @@ pbr==6.1.0
|
|
168
165
|
# via stevedore
|
169
166
|
pgpy==0.6.0
|
170
167
|
# via -r requirements/reporting.in
|
168
|
+
pillow==11.0.0
|
169
|
+
# via pansi
|
171
170
|
platformdirs==4.3.6
|
172
171
|
# via snowflake-connector-python
|
173
172
|
prompt-toolkit==3.0.48
|
174
173
|
# via click-repl
|
175
|
-
psutil==6.
|
174
|
+
psutil==6.1.0
|
176
175
|
# via edx-django-utils
|
177
176
|
py2neo @ https://github.com/overhangio/py2neo/releases/download/2021.2.3/py2neo-2021.2.3.tar.gz
|
178
177
|
# via -r requirements/reporting.in
|
@@ -192,7 +191,7 @@ pyjwt[crypto]==2.9.0
|
|
192
191
|
# snowflake-connector-python
|
193
192
|
pyminizip==0.2.6
|
194
193
|
# via -r requirements/reporting.in
|
195
|
-
pymongo==4.
|
194
|
+
pymongo==4.10.1
|
196
195
|
# via edx-opaque-keys
|
197
196
|
pynacl==1.5.0
|
198
197
|
# via
|
@@ -224,7 +223,7 @@ rsa==4.7.2
|
|
224
223
|
# via awscli
|
225
224
|
rules==3.5
|
226
225
|
# via -r requirements/base.in
|
227
|
-
s3transfer==0.10.
|
226
|
+
s3transfer==0.10.3
|
228
227
|
# via
|
229
228
|
# awscli
|
230
229
|
# boto3
|
@@ -234,11 +233,10 @@ six==1.16.0
|
|
234
233
|
# via
|
235
234
|
# edx-rbac
|
236
235
|
# interchange
|
237
|
-
# pansi
|
238
236
|
# py2neo
|
239
237
|
# python-dateutil
|
240
238
|
# vertica-python
|
241
|
-
snowflake-connector-python==3.12.
|
239
|
+
snowflake-connector-python==3.12.3
|
242
240
|
# via -r requirements/reporting.in
|
243
241
|
sortedcontainers==2.4.0
|
244
242
|
# via snowflake-connector-python
|
@@ -253,6 +251,7 @@ tomlkit==0.13.2
|
|
253
251
|
typing-extensions==4.12.2
|
254
252
|
# via
|
255
253
|
# edx-opaque-keys
|
254
|
+
# faker
|
256
255
|
# snowflake-connector-python
|
257
256
|
tzdata==2024.2
|
258
257
|
# via
|
@@ -261,9 +260,8 @@ tzdata==2024.2
|
|
261
260
|
# pandas
|
262
261
|
unicodecsv==0.14.1
|
263
262
|
# via -r requirements/reporting.in
|
264
|
-
urllib3==
|
263
|
+
urllib3==2.2.3
|
265
264
|
# via
|
266
|
-
# -c requirements/constraints.txt
|
267
265
|
# botocore
|
268
266
|
# py2neo
|
269
267
|
# requests
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# This file is autogenerated by pip-compile with Python 3.
|
2
|
+
# This file is autogenerated by pip-compile with Python 3.12
|
3
3
|
# by the following command:
|
4
4
|
#
|
5
5
|
# make upgrade
|
@@ -10,9 +10,9 @@ chardet==5.2.0
|
|
10
10
|
# via tox
|
11
11
|
colorama==0.4.6
|
12
12
|
# via tox
|
13
|
-
coverage==7.6.
|
13
|
+
coverage==7.6.4
|
14
14
|
# via -r requirements/ci.in
|
15
|
-
distlib==0.3.
|
15
|
+
distlib==0.3.9
|
16
16
|
# via virtualenv
|
17
17
|
filelock==3.16.1
|
18
18
|
# via
|
@@ -30,7 +30,7 @@ pluggy==1.5.0
|
|
30
30
|
# via tox
|
31
31
|
pyproject-api==1.8.0
|
32
32
|
# via tox
|
33
|
-
tox==4.
|
33
|
+
tox==4.23.2
|
34
34
|
# via -r requirements/ci.in
|
35
|
-
virtualenv==20.
|
35
|
+
virtualenv==20.27.1
|
36
36
|
# via tox
|
{edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/common_constraints.txt
RENAMED
@@ -30,3 +30,7 @@ django-simple-history==3.0.0
|
|
30
30
|
# This can be unpinned once https://github.com/openedx/edx-platform/issues/34586
|
31
31
|
# has been resolved and edx-platform is running with pymongo>=4.4.0
|
32
32
|
event-tracking<2.4.1
|
33
|
+
|
34
|
+
# Cause: https://github.com/openedx/edx-lint/issues/458
|
35
|
+
# This can be unpinned once https://github.com/openedx/edx-lint/issues/459 has been resolved.
|
36
|
+
pip<24.3
|
@@ -12,18 +12,3 @@
|
|
12
12
|
|
13
13
|
# Common constraints for edx repos
|
14
14
|
-c common_constraints.txt
|
15
|
-
|
16
|
-
# Needed for Django 4.2 + Python 3.12 compatibility
|
17
|
-
backports.zoneinfo; python_version<"3.9"
|
18
|
-
|
19
|
-
# botocore 1.34.145 depends on urllib3<1.27 and >=1.25.4; python_version < "3.10"
|
20
|
-
urllib3<2.0.0
|
21
|
-
|
22
|
-
numpy<=1.24.4
|
23
|
-
pandas<=2.0.3
|
24
|
-
|
25
|
-
# this is the last supported version for python 3.8.x
|
26
|
-
astroid<=3.2.4
|
27
|
-
|
28
|
-
# upgrade to 5.4.0 causes issues with `importlib`
|
29
|
-
edx-lint<=5.3.7
|