edx-enterprise-data 9.7.1__tar.gz → 9.7.5__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-9.7.5}/CHANGELOG.rst +32 -0
- {edx_enterprise_data-9.7.1/edx_enterprise_data.egg-info → edx_enterprise_data-9.7.5}/PKG-INFO +1 -1
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5/edx_enterprise_data.egg-info}/PKG-INFO +1 -1
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/__init__.py +1 -1
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py +107 -12
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py +101 -24
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/admin_analytics/database/queries/skills_daily_rollup_admin_dash.py +8 -6
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py +74 -6
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v1/views/analytics_completions.py +1 -1
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v1/views/analytics_engagements.py +1 -1
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v1/views/analytics_enrollments.py +1 -1
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v1/views/analytics_leaderboard.py +6 -4
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/pre_warm_analytics_cache.py +5 -4
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/tests/test_pre_warm_analytics_cache.py +14 -5
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/utils.py +17 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/rules.py +1 -1
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/LICENSE +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/MANIFEST.in +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/README.md +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/edx_enterprise_data.egg-info/SOURCES.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/edx_enterprise_data.egg-info/dependency_links.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/edx_enterprise_data.egg-info/not-zip-safe +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/edx_enterprise_data.egg-info/requires.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/edx_enterprise_data.egg-info/top_level.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/admin_analytics/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/admin_analytics/constants.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/admin_analytics/data_loaders.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/admin_analytics/database/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/admin_analytics/database/queries/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/admin_analytics/database/tables/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/admin_analytics/database/tables/base.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/admin_analytics/database/tables/skills_daily_rollup_admin_dash.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/admin_analytics/database/utils.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/urls.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v0/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v0/serializers.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v0/urls.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v0/views.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v1/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v1/serializers.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v1/urls.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v1/views/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v1/views/base.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v1/views/enterprise_admin.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v1/views/enterprise_learner.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/api/v1/views/enterprise_offers.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/apps.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/cache/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/cache/decorators.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/clients.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/constants.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/filters.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/fixtures/enterprise_enrollment.json +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/fixtures/enterprise_user.json +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/create_dummy_data.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/create_dummy_data_lpr_v1.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/create_enterprise_enrollment.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/create_enterprise_learner_enrollment_lpr_v1.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/create_enterprise_offer.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/create_enterprise_user.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/tests/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/tests/test_create_dummy_data_lpr_v1.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/tests/test_create_enterprise_enrollment.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/management/commands/tests/test_create_enterprise_user.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0001_initial.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0002_auto_20180430_1358.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0003_auto_20180501_0603.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0004_auto_20180501_0928.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0004_auto_20180508_1652.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0005_auto_20180524_2204.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0006_auto_20180612_0336.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0007_auto_20180612_0534.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0008_auto_20180614_0108.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0009_auto_20180628_1152.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0010_enterpriseenrollment_created.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0011_enterpriseuser.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0012_auto_20180831_1930.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0013_auto_20180831_1931.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0014_enterpriseuser_created.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0015_auto_20180907_1757.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0016_auto_20180924_2138.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0017_enterpriseenrollment_unenrollment_timestamp.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0018_enterprisedatafeaturerole_enterprisedataroleassignment.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0019_add_enterprise_data_feature_roles.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0020_add_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0021_auto_20190329_1241.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0022_remove_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0023_enterpriselearner_enterpriselearnerenrollment.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0024_auto_20210602_1811.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0025_auto_20210703_1854.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0026_auto_20210916_0414.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0027_enterpriselearnerenrollment_total_learning_time_seconds.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0028_enterpriselearnerenrollment_offer_id.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0029_enterpriseoffer.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0030_auto_20230609_1353.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0031_auto_20230615_0705.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0032_auto_20230704_0818.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0033_enterpriseadminlearnerprogress_enterpriseadminsummarizeinsights.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0034_auto_20230907_0834.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0035_auto_20230907_1154.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0036_enterprisesubsidybudget_subsidy_access_policy_display_name.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0037_alter_enterpriseenrollment_consent_granted.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0038_enterpriseoffer_export_timestamp.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/0039_auto_20240212_1403.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/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-9.7.5}/enterprise_data/migrations/0044_enterpriseexecedlcmoduleperformance.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/migrations/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/models.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/paginators.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/renderers.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/settings/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/settings/test.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/signals.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/admin_analytics/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/admin_analytics/mock_analytics_data.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/admin_analytics/mock_enrollments.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/admin_analytics/test_analytics_engagements.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/admin_analytics/test_analytics_enrollments.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/admin_analytics/test_analytics_leaderboard.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/admin_analytics/test_data_loaders.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/admin_analytics/test_enterprise_completions.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/api/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/api/v0/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/api/v0/test_serializers.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/api/v1/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/api/v1/test_serializers.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/api/v1/test_views.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/api/v1/views/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/api/v1/views/test_enterprise_admin.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/factories.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/mixins.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/test_clients.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/test_filters.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/test_models.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/test_utils.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/tests/test_views.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data/urls.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/admin.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/apps.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/constants.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/migrations/0001_initial.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/migrations/0002_add_enterprise_data_feature_roles.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/migrations/0003_add_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/migrations/0004_enterprisedataroleassignment_enterprise_id.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/migrations/0005_turn_on_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/migrations/0006_remove_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/migrations/0007_enterprisedataroleassignment_applies_to_all_contexts.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/migrations/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/models.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/tests/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/tests/factories.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_data_roles/tests/test_models.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/clients/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/clients/enterprise.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/clients/s3.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/clients/snowflake.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/clients/vertica.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/delivery_method.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/external_resource_link_report.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/fixtures/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/fixtures/enterprise_customer_reporting.json +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/reporter.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/send_enterprise_reports.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/tests/__init__.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/tests/test_clients.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/tests/test_delivery_method.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/tests/test_enterprise_client.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/tests/test_external_link_report.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/tests/test_reporter.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/tests/test_send_enterprise_reports.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/tests/test_utils.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/tests/test_vertica_client.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/tests/utils.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/enterprise_reporting/utils.py +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/requirements/base.in +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/requirements/base.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/requirements/ci.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/requirements/common_constraints.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/requirements/constraints.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/requirements/dev.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/requirements/django.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/requirements/pip.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/requirements/pip_tools.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/requirements/quality.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/requirements/reporting.in +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/requirements/test-master.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/requirements/test-reporting.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/requirements/test.txt +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/setup.cfg +0 -0
- {edx_enterprise_data-9.7.1 → edx_enterprise_data-9.7.5}/setup.py +0 -0
@@ -16,6 +16,38 @@ Unreleased
|
|
16
16
|
|
17
17
|
=========================
|
18
18
|
|
19
|
+
[10.5.0] - 2024-11-14
|
20
|
+
---------------------
|
21
|
+
* Fix CSV file names
|
22
|
+
* Fix ordering of skills charts data
|
23
|
+
|
24
|
+
[10.4.0] - 2024-11-14
|
25
|
+
---------------------
|
26
|
+
* Updated text for null emails record of leaderboard.
|
27
|
+
|
28
|
+
[10.3.0] - 2024-11-13
|
29
|
+
---------------------
|
30
|
+
* Re-write top 10 charts queries for Enrollments, Engagements and Completions
|
31
|
+
|
32
|
+
[10.2.0] - 2024-11-12
|
33
|
+
---------------------
|
34
|
+
* Fixed null email issue for leaderboard.
|
35
|
+
|
36
|
+
|
37
|
+
[10.1.0] - 2024-10-29
|
38
|
+
---------------------
|
39
|
+
* Added management command to pre-warm analytics data.
|
40
|
+
|
41
|
+
[10.0.1] - 2024-10-25
|
42
|
+
---------------------
|
43
|
+
* Same as ``10.0.0``
|
44
|
+
* Bumping the version so a new tag can be created in the GitHub
|
45
|
+
|
46
|
+
[10.0.0] - 2024-10-25
|
47
|
+
---------------------
|
48
|
+
* feat!: Python 3.12 Upgrade
|
49
|
+
* Dropped support for ``Python<3.12``
|
50
|
+
|
19
51
|
[9.7.0] - 2024-10-23
|
20
52
|
---------------------
|
21
53
|
* feat: Add API to fetch enterprise budgets information
|
@@ -48,7 +48,7 @@ class FactEngagementAdminDashQueries:
|
|
48
48
|
"""
|
49
49
|
|
50
50
|
@staticmethod
|
51
|
-
def get_top_courses_by_engagement_query(record_count=
|
51
|
+
def get_top_courses_by_engagement_query(record_count=10):
|
52
52
|
"""
|
53
53
|
Get the query to fetch the learning time in hours by courses.
|
54
54
|
|
@@ -61,16 +61,40 @@ class FactEngagementAdminDashQueries:
|
|
61
61
|
(str): Query to fetch the learning time in hours by courses for the top courses by user engagement.
|
62
62
|
"""
|
63
63
|
return f"""
|
64
|
-
|
65
|
-
|
66
|
-
|
64
|
+
WITH filtered_data AS (
|
65
|
+
SELECT
|
66
|
+
course_key,
|
67
|
+
course_title,
|
68
|
+
enroll_type,
|
69
|
+
(learning_time_seconds / 60.0 / 60.0) AS learning_time_hours,
|
70
|
+
activity_date
|
71
|
+
FROM fact_enrollment_engagement_day_admin_dash
|
72
|
+
WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
67
73
|
activity_date BETWEEN %(start_date)s AND %(end_date)s
|
68
|
-
|
69
|
-
|
74
|
+
),
|
75
|
+
top_10_courses AS (
|
76
|
+
SELECT
|
77
|
+
course_key,
|
78
|
+
SUM(learning_time_hours) as total_learning_time
|
79
|
+
FROM filtered_data
|
80
|
+
GROUP BY course_key
|
81
|
+
ORDER BY total_learning_time DESC
|
82
|
+
LIMIT {record_count}
|
83
|
+
)
|
84
|
+
SELECT
|
85
|
+
d.course_key,
|
86
|
+
d.course_title,
|
87
|
+
d.enroll_type,
|
88
|
+
ROUND(SUM(d.learning_time_hours)) AS learning_time_hours
|
89
|
+
FROM filtered_data d
|
90
|
+
JOIN top_10_courses tc
|
91
|
+
ON d.course_key = tc.course_key
|
92
|
+
GROUP BY d.course_key, d.course_title, d.enroll_type
|
93
|
+
ORDER BY total_learning_time DESC;
|
70
94
|
"""
|
71
95
|
|
72
96
|
@staticmethod
|
73
|
-
def get_top_subjects_by_engagement_query(record_count=
|
97
|
+
def get_top_subjects_by_engagement_query(record_count=10):
|
74
98
|
"""
|
75
99
|
Get the query to fetch the learning time in hours by subjects.
|
76
100
|
|
@@ -83,12 +107,34 @@ class FactEngagementAdminDashQueries:
|
|
83
107
|
(str): Query to fetch the learning time in hours by subjects for the top subjects by user engagement.
|
84
108
|
"""
|
85
109
|
return f"""
|
86
|
-
|
87
|
-
|
88
|
-
|
110
|
+
WITH filtered_data AS (
|
111
|
+
SELECT
|
112
|
+
course_subject,
|
113
|
+
enroll_type,
|
114
|
+
(learning_time_seconds / 60.0 / 60.0) AS learning_time_hours,
|
115
|
+
activity_date
|
116
|
+
FROM fact_enrollment_engagement_day_admin_dash
|
117
|
+
WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
89
118
|
activity_date BETWEEN %(start_date)s AND %(end_date)s
|
90
|
-
|
91
|
-
|
119
|
+
),
|
120
|
+
top_10_subjects AS (
|
121
|
+
SELECT
|
122
|
+
course_subject,
|
123
|
+
SUM(learning_time_hours) as total_learning_time
|
124
|
+
FROM filtered_data
|
125
|
+
GROUP BY course_subject
|
126
|
+
ORDER BY total_learning_time DESC
|
127
|
+
LIMIT {record_count}
|
128
|
+
)
|
129
|
+
SELECT
|
130
|
+
d.course_subject,
|
131
|
+
d.enroll_type,
|
132
|
+
ROUND(SUM(d.learning_time_hours)) AS learning_time_hours
|
133
|
+
FROM filtered_data d
|
134
|
+
JOIN top_10_subjects ts
|
135
|
+
ON d.course_subject = ts.course_subject
|
136
|
+
GROUP BY d.course_subject, d.enroll_type
|
137
|
+
ORDER BY total_learning_time DESC;
|
92
138
|
"""
|
93
139
|
|
94
140
|
@staticmethod
|
@@ -163,6 +209,55 @@ class FactEngagementAdminDashQueries:
|
|
163
209
|
GROUP BY email;
|
164
210
|
"""
|
165
211
|
|
212
|
+
@staticmethod
|
213
|
+
def get_engagement_data_for_leaderboard_null_email_only_query():
|
214
|
+
"""
|
215
|
+
Get the query to fetch the engagement data for leaderboard for NULL emails only.
|
216
|
+
|
217
|
+
Query should fetch the engagement data for like learning time, session length of
|
218
|
+
the enterprise learners to show in the leaderboard.
|
219
|
+
|
220
|
+
Returns:
|
221
|
+
(str): Query to fetch the engagement data for leaderboard.
|
222
|
+
"""
|
223
|
+
return """
|
224
|
+
SELECT
|
225
|
+
email,
|
226
|
+
ROUND(SUM(learning_time_seconds) / 3600, 1) as learning_time_hours,
|
227
|
+
SUM(is_engaged) as session_count,
|
228
|
+
CASE
|
229
|
+
WHEN SUM(is_engaged) = 0 THEN 0.0
|
230
|
+
ELSE ROUND(SUM(learning_time_seconds) / 3600 / SUM(is_engaged), 1)
|
231
|
+
END AS average_session_length
|
232
|
+
FROM fact_enrollment_engagement_day_admin_dash
|
233
|
+
WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
234
|
+
(activity_date BETWEEN %(start_date)s AND %(end_date)s) AND
|
235
|
+
is_engaged = 1 AND
|
236
|
+
email is NULL
|
237
|
+
GROUP BY email;
|
238
|
+
"""
|
239
|
+
|
240
|
+
@staticmethod
|
241
|
+
def get_completion_data_for_leaderboard_null_email_only_query():
|
242
|
+
"""
|
243
|
+
Get the query to fetch the completions data for leaderboard for NULL emails.
|
244
|
+
|
245
|
+
Query should fetch the completion data for like course completion count of
|
246
|
+
the enterprise learners to show in the leaderboard.
|
247
|
+
|
248
|
+
Returns:
|
249
|
+
(list<str>): Query to fetch the completions data for leaderboard.
|
250
|
+
"""
|
251
|
+
return """
|
252
|
+
SELECT email, count(course_key) as course_completion_count
|
253
|
+
FROM fact_enrollment_admin_dash
|
254
|
+
WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
255
|
+
(passed_date BETWEEN %(start_date)s AND %(end_date)s) AND
|
256
|
+
has_passed = 1 AND
|
257
|
+
email is NULL
|
258
|
+
GROUP BY email;
|
259
|
+
"""
|
260
|
+
|
166
261
|
@staticmethod
|
167
262
|
def get_leaderboard_data_count_query():
|
168
263
|
"""
|
@@ -98,7 +98,7 @@ class FactEnrollmentAdminDashQueries:
|
|
98
98
|
"""
|
99
99
|
|
100
100
|
@staticmethod
|
101
|
-
def get_top_courses_by_enrollments_query(record_count=
|
101
|
+
def get_top_courses_by_enrollments_query(record_count=10):
|
102
102
|
"""
|
103
103
|
Get the query to fetch the enrollment count by courses.
|
104
104
|
|
@@ -108,15 +108,32 @@ class FactEnrollmentAdminDashQueries:
|
|
108
108
|
record_count (int): Number of records to fetch.
|
109
109
|
"""
|
110
110
|
return f"""
|
111
|
-
|
112
|
-
|
113
|
-
|
111
|
+
WITH filtered_data AS (
|
112
|
+
SELECT *
|
113
|
+
FROM fact_enrollment_admin_dash
|
114
|
+
WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
114
115
|
enterprise_enrollment_date BETWEEN %(start_date)s AND %(end_date)s
|
115
|
-
|
116
|
+
),
|
117
|
+
top_10_courses AS (
|
118
|
+
SELECT course_key
|
119
|
+
FROM filtered_data
|
120
|
+
GROUP BY course_key
|
121
|
+
ORDER BY COUNT(*) DESC
|
122
|
+
LIMIT {record_count}
|
123
|
+
)
|
124
|
+
|
125
|
+
SELECT
|
126
|
+
d.course_key,
|
127
|
+
d.enroll_type,
|
128
|
+
COUNT(*) AS enrollment_count
|
129
|
+
FROM filtered_data d
|
130
|
+
JOIN top_10_courses tc
|
131
|
+
ON d.course_key = tc.course_key
|
132
|
+
GROUP BY d.course_key, d.enroll_type;
|
116
133
|
"""
|
117
134
|
|
118
135
|
@staticmethod
|
119
|
-
def get_top_subjects_by_enrollments_query(record_count=
|
136
|
+
def get_top_subjects_by_enrollments_query(record_count=10):
|
120
137
|
"""
|
121
138
|
Get the query to fetch the enrollment count by subjects.
|
122
139
|
|
@@ -126,11 +143,27 @@ class FactEnrollmentAdminDashQueries:
|
|
126
143
|
record_count (int): Number of records to fetch.
|
127
144
|
"""
|
128
145
|
return f"""
|
129
|
-
|
130
|
-
|
131
|
-
|
146
|
+
WITH filtered_data AS (
|
147
|
+
SELECT *
|
148
|
+
FROM fact_enrollment_admin_dash
|
149
|
+
WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
132
150
|
enterprise_enrollment_date BETWEEN %(start_date)s AND %(end_date)s
|
133
|
-
|
151
|
+
),
|
152
|
+
top_10_subjects AS (
|
153
|
+
SELECT course_subject
|
154
|
+
FROM filtered_data
|
155
|
+
GROUP BY course_subject
|
156
|
+
ORDER BY COUNT(*) DESC
|
157
|
+
LIMIT {record_count}
|
158
|
+
)
|
159
|
+
SELECT
|
160
|
+
d.course_subject,
|
161
|
+
d.enroll_type,
|
162
|
+
COUNT(*) AS enrollment_count
|
163
|
+
FROM filtered_data d
|
164
|
+
JOIN top_10_subjects ts
|
165
|
+
ON d.course_subject = ts.course_subject
|
166
|
+
GROUP BY d.course_subject, d.enroll_type;
|
134
167
|
"""
|
135
168
|
|
136
169
|
@staticmethod
|
@@ -162,7 +195,7 @@ class FactEnrollmentAdminDashQueries:
|
|
162
195
|
"""
|
163
196
|
|
164
197
|
@staticmethod
|
165
|
-
def get_top_courses_by_completions_query(record_count=
|
198
|
+
def get_top_courses_by_completions_query(record_count=10):
|
166
199
|
"""
|
167
200
|
Get the query to fetch the completion count by courses.
|
168
201
|
|
@@ -175,17 +208,40 @@ class FactEnrollmentAdminDashQueries:
|
|
175
208
|
(str): Query to fetch the enrollment count by courses for the top courses by enrollment count.
|
176
209
|
"""
|
177
210
|
return f"""
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
211
|
+
WITH filtered_data AS (
|
212
|
+
SELECT
|
213
|
+
course_key,
|
214
|
+
course_title,
|
215
|
+
enroll_type,
|
216
|
+
passed_date
|
217
|
+
FROM fact_enrollment_admin_dash
|
218
|
+
WHERE has_passed = 1 AND
|
219
|
+
enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
182
220
|
passed_date BETWEEN %(start_date)s AND %(end_date)s
|
183
|
-
|
184
|
-
|
221
|
+
),
|
222
|
+
top_10_courses AS (
|
223
|
+
SELECT
|
224
|
+
course_key,
|
225
|
+
COUNT(*) AS total_completion_count
|
226
|
+
FROM filtered_data
|
227
|
+
GROUP BY course_key
|
228
|
+
ORDER BY total_completion_count DESC
|
229
|
+
LIMIT {record_count}
|
230
|
+
)
|
231
|
+
SELECT
|
232
|
+
d.course_key,
|
233
|
+
d.course_title,
|
234
|
+
d.enroll_type,
|
235
|
+
COUNT(*) AS completion_count
|
236
|
+
FROM filtered_data d
|
237
|
+
JOIN top_10_courses tc
|
238
|
+
ON d.course_key = tc.course_key
|
239
|
+
GROUP BY d.course_key, d.course_title, d.enroll_type
|
240
|
+
ORDER BY total_completion_count DESC;
|
185
241
|
"""
|
186
242
|
|
187
243
|
@staticmethod
|
188
|
-
def get_top_subjects_by_completions_query(record_count=
|
244
|
+
def get_top_subjects_by_completions_query(record_count=10):
|
189
245
|
"""
|
190
246
|
Get the query to fetch the completion count by subjects.
|
191
247
|
|
@@ -198,13 +254,34 @@ class FactEnrollmentAdminDashQueries:
|
|
198
254
|
(str): Query to fetch the completion count by subjects for the top subjects by completion count.
|
199
255
|
"""
|
200
256
|
return f"""
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
257
|
+
WITH filtered_data AS (
|
258
|
+
SELECT
|
259
|
+
course_subject,
|
260
|
+
enroll_type,
|
261
|
+
passed_date
|
262
|
+
FROM fact_enrollment_admin_dash
|
263
|
+
WHERE has_passed = 1 AND
|
264
|
+
enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
205
265
|
passed_date BETWEEN %(start_date)s AND %(end_date)s
|
206
|
-
|
207
|
-
|
266
|
+
),
|
267
|
+
top_10_subjects AS (
|
268
|
+
SELECT
|
269
|
+
course_subject,
|
270
|
+
COUNT(*) AS total_completion_count
|
271
|
+
FROM filtered_data
|
272
|
+
GROUP BY course_subject
|
273
|
+
ORDER BY total_completion_count DESC
|
274
|
+
LIMIT {record_count}
|
275
|
+
)
|
276
|
+
SELECT
|
277
|
+
d.course_subject,
|
278
|
+
d.enroll_type,
|
279
|
+
COUNT(*) AS completion_count
|
280
|
+
FROM filtered_data d
|
281
|
+
JOIN top_10_subjects ts
|
282
|
+
ON d.course_subject = ts.course_subject
|
283
|
+
GROUP BY d.course_subject, d.enroll_type
|
284
|
+
ORDER BY total_completion_count DESC;
|
208
285
|
"""
|
209
286
|
|
210
287
|
@staticmethod
|
@@ -38,7 +38,8 @@ class SkillsDailyRollupAdminDashQueries:
|
|
38
38
|
WITH TopSkills AS (
|
39
39
|
-- Get top 10 skills by total enrollments
|
40
40
|
SELECT
|
41
|
-
skill_name
|
41
|
+
skill_name,
|
42
|
+
SUM(enrolls) AS total_enrollment_count
|
42
43
|
FROM
|
43
44
|
skills_daily_rollup_admin_dash
|
44
45
|
WHERE
|
@@ -47,7 +48,7 @@ class SkillsDailyRollupAdminDashQueries:
|
|
47
48
|
GROUP BY
|
48
49
|
skill_name
|
49
50
|
ORDER BY
|
50
|
-
|
51
|
+
total_enrollment_count DESC
|
51
52
|
LIMIT 10
|
52
53
|
)
|
53
54
|
SELECT
|
@@ -70,7 +71,7 @@ class SkillsDailyRollupAdminDashQueries:
|
|
70
71
|
GROUP BY
|
71
72
|
sd.skill_name, subject_name
|
72
73
|
ORDER BY
|
73
|
-
|
74
|
+
total_enrollment_count DESC;
|
74
75
|
"""
|
75
76
|
|
76
77
|
@staticmethod
|
@@ -82,7 +83,8 @@ class SkillsDailyRollupAdminDashQueries:
|
|
82
83
|
WITH TopSkills AS (
|
83
84
|
-- Get top 10 skills by total completions
|
84
85
|
SELECT
|
85
|
-
skill_name
|
86
|
+
skill_name,
|
87
|
+
SUM(completions) AS total_completion_count
|
86
88
|
FROM
|
87
89
|
skills_daily_rollup_admin_dash
|
88
90
|
WHERE
|
@@ -91,7 +93,7 @@ class SkillsDailyRollupAdminDashQueries:
|
|
91
93
|
GROUP BY
|
92
94
|
skill_name
|
93
95
|
ORDER BY
|
94
|
-
|
96
|
+
total_completion_count DESC
|
95
97
|
LIMIT 10
|
96
98
|
)
|
97
99
|
SELECT
|
@@ -114,5 +116,5 @@ class SkillsDailyRollupAdminDashQueries:
|
|
114
116
|
GROUP BY
|
115
117
|
sd.skill_name, subject_name
|
116
118
|
ORDER BY
|
117
|
-
|
119
|
+
total_completion_count DESC;
|
118
120
|
"""
|
@@ -5,11 +5,14 @@ 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
|
11
12
|
from .base import BaseTable
|
12
13
|
|
14
|
+
NULL_EMAIL_TEXT = 'learners who have not shared consent'
|
15
|
+
|
13
16
|
|
14
17
|
class FactEngagementAdminDashTable(BaseTable):
|
15
18
|
"""
|
@@ -168,7 +171,14 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
168
171
|
|
169
172
|
@cache_it()
|
170
173
|
def _get_engagement_data_for_leaderboard(
|
171
|
-
self,
|
174
|
+
self,
|
175
|
+
enterprise_customer_uuid: UUID,
|
176
|
+
start_date: date,
|
177
|
+
end_date: date,
|
178
|
+
limit: int,
|
179
|
+
offset: int,
|
180
|
+
include_null_email: bool,
|
181
|
+
|
172
182
|
):
|
173
183
|
"""
|
174
184
|
Get the engagement data for leaderboard.
|
@@ -182,11 +192,12 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
182
192
|
end_date (date): The end date.
|
183
193
|
limit (int): The maximum number of records to return.
|
184
194
|
offset (int): The number of records to skip.
|
195
|
+
include_null_email (bool): If True, only fetch data for NULL emails.
|
185
196
|
|
186
197
|
Returns:
|
187
198
|
list[dict]: The engagement data for leaderboard.
|
188
199
|
"""
|
189
|
-
|
200
|
+
engagements = run_query(
|
190
201
|
query=self.queries.get_engagement_data_for_leaderboard_query(),
|
191
202
|
params={
|
192
203
|
'enterprise_customer_uuid': enterprise_customer_uuid,
|
@@ -198,9 +209,27 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
198
209
|
as_dict=True,
|
199
210
|
)
|
200
211
|
|
212
|
+
if include_null_email:
|
213
|
+
engagement_for_null_email = run_query(
|
214
|
+
query=self.queries.get_engagement_data_for_leaderboard_null_email_only_query(),
|
215
|
+
params={
|
216
|
+
'enterprise_customer_uuid': enterprise_customer_uuid,
|
217
|
+
'start_date': start_date,
|
218
|
+
'end_date': end_date,
|
219
|
+
},
|
220
|
+
as_dict=True,
|
221
|
+
)
|
222
|
+
engagements += engagement_for_null_email
|
223
|
+
return engagements
|
224
|
+
|
201
225
|
@cache_it()
|
202
226
|
def _get_completion_data_for_leaderboard_query(
|
203
|
-
self,
|
227
|
+
self,
|
228
|
+
enterprise_customer_uuid: UUID,
|
229
|
+
start_date: date,
|
230
|
+
end_date: date,
|
231
|
+
email_list: list,
|
232
|
+
include_null_email: bool,
|
204
233
|
):
|
205
234
|
"""
|
206
235
|
Get the completion data for leaderboard.
|
@@ -213,11 +242,13 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
213
242
|
start_date (date): The start date.
|
214
243
|
end_date (date): The end date.
|
215
244
|
email_list (list<str>): List of emails of the enterprise learners.
|
245
|
+
include_null_email (bool): If True, only fetch data for NULL emails.
|
216
246
|
|
217
247
|
Returns:
|
218
248
|
list[dict]: The engagement data for leaderboard.
|
219
249
|
"""
|
220
|
-
|
250
|
+
|
251
|
+
completions = run_query(
|
221
252
|
query=self.queries.get_completion_data_for_leaderboard_query(email_list),
|
222
253
|
params={
|
223
254
|
'enterprise_customer_uuid': enterprise_customer_uuid,
|
@@ -227,8 +258,28 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
227
258
|
as_dict=True,
|
228
259
|
)
|
229
260
|
|
261
|
+
if include_null_email:
|
262
|
+
completions_for_null_email = run_query(
|
263
|
+
query=self.queries.get_completion_data_for_leaderboard_null_email_only_query(),
|
264
|
+
params={
|
265
|
+
'enterprise_customer_uuid': enterprise_customer_uuid,
|
266
|
+
'start_date': start_date,
|
267
|
+
'end_date': end_date,
|
268
|
+
},
|
269
|
+
as_dict=True,
|
270
|
+
)
|
271
|
+
completions += completions_for_null_email
|
272
|
+
|
273
|
+
return completions
|
274
|
+
|
230
275
|
def get_all_leaderboard_data(
|
231
|
-
self,
|
276
|
+
self,
|
277
|
+
enterprise_customer_uuid: UUID,
|
278
|
+
start_date: date,
|
279
|
+
end_date: date,
|
280
|
+
limit: int,
|
281
|
+
offset: int,
|
282
|
+
total_count: int,
|
232
283
|
):
|
233
284
|
"""
|
234
285
|
Get the leaderboard data for the given enterprise customer.
|
@@ -239,32 +290,49 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
239
290
|
end_date (date): The end date.
|
240
291
|
limit (int): The maximum number of records to return.
|
241
292
|
offset (int): The number of records to skip.
|
293
|
+
total_count (int): The total number of records.
|
242
294
|
|
243
295
|
Returns:
|
244
296
|
list[dict]: The leaderboard data.
|
245
297
|
"""
|
298
|
+
include_null_email = False
|
299
|
+
# If this is the last or only page, we need to include NULL emails record.
|
300
|
+
if total_count <= offset + limit:
|
301
|
+
include_null_email = True
|
302
|
+
|
246
303
|
engagement_data = self._get_engagement_data_for_leaderboard(
|
247
304
|
enterprise_customer_uuid=enterprise_customer_uuid,
|
248
305
|
start_date=start_date,
|
249
306
|
end_date=end_date,
|
250
307
|
limit=limit,
|
251
308
|
offset=offset,
|
309
|
+
include_null_email=include_null_email,
|
252
310
|
)
|
253
311
|
# If there is no data, no need to proceed.
|
254
312
|
if not engagement_data:
|
255
313
|
return []
|
256
314
|
|
257
|
-
engagement_data_dict = {
|
315
|
+
engagement_data_dict = {
|
316
|
+
engagement['email']: engagement for engagement in engagement_data if engagement['email']
|
317
|
+
}
|
258
318
|
completion_data = self._get_completion_data_for_leaderboard_query(
|
259
319
|
enterprise_customer_uuid=enterprise_customer_uuid,
|
260
320
|
start_date=start_date,
|
261
321
|
end_date=end_date,
|
262
322
|
email_list=list(engagement_data_dict.keys()),
|
323
|
+
include_null_email=include_null_email,
|
263
324
|
)
|
264
325
|
for completion in completion_data:
|
265
326
|
email = completion['email']
|
266
327
|
engagement_data_dict[email]['course_completion_count'] = completion['course_completion_count']
|
267
328
|
|
329
|
+
if include_null_email:
|
330
|
+
engagement_data_dict['None'] = find_first(engagement_data, lambda x: x['email'] is None) or {}
|
331
|
+
completion = find_first(completion_data, lambda x: x['email'] is None) or \
|
332
|
+
{'course_completion_count': ''}
|
333
|
+
engagement_data_dict['None']['course_completion_count'] = completion['course_completion_count']
|
334
|
+
engagement_data_dict['None']['email'] = NULL_EMAIL_TEXT
|
335
|
+
|
268
336
|
return list(engagement_data_dict.values())
|
269
337
|
|
270
338
|
@cache_it()
|
@@ -75,7 +75,7 @@ class AdvanceAnalyticsCompletionsView(AnalyticsPaginationMixin, ViewSet):
|
|
75
75
|
)
|
76
76
|
|
77
77
|
if response_type == ResponseType.CSV.value:
|
78
|
-
filename = f"""
|
78
|
+
filename = f"""Individual Completions, {start_date} - {end_date}.csv"""
|
79
79
|
|
80
80
|
return StreamingHttpResponse(
|
81
81
|
IndividualCompletionsCSVRenderer().render(self._stream_serialized_data(
|
@@ -75,7 +75,7 @@ class AdvanceAnalyticsEngagementView(AnalyticsPaginationMixin, ViewSet):
|
|
75
75
|
)
|
76
76
|
|
77
77
|
if response_type == ResponseType.CSV.value:
|
78
|
-
filename = f"""
|
78
|
+
filename = f"""Individual Engagements, {start_date} - {end_date}.csv"""
|
79
79
|
|
80
80
|
return StreamingHttpResponse(
|
81
81
|
IndividualEngagementsCSVRenderer().render(self._stream_serialized_data(
|
@@ -74,7 +74,7 @@ class AdvanceAnalyticsEnrollmentsView(AnalyticsPaginationMixin, ViewSet):
|
|
74
74
|
)
|
75
75
|
|
76
76
|
if response_type == ResponseType.CSV.value:
|
77
|
-
filename = f"""
|
77
|
+
filename = f"""Individual Enrollments, {start_date} - {end_date}.csv"""
|
78
78
|
|
79
79
|
return StreamingHttpResponse(
|
80
80
|
IndividualEnrollmentsCSVRenderer().render(self._stream_serialized_data(
|
@@ -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
|