edx-enterprise-data 10.11.1__tar.gz → 10.13.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-10.11.1 → edx_enterprise_data-10.13.0}/CHANGELOG.rst +8 -1
- {edx_enterprise_data-10.11.1/edx_enterprise_data.egg-info → edx_enterprise_data-10.13.0}/PKG-INFO +1 -1
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0/edx_enterprise_data.egg-info}/PKG-INFO +1 -1
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/edx_enterprise_data.egg-info/SOURCES.txt +3 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/__init__.py +1 -1
- edx_enterprise_data-10.13.0/enterprise_data/admin_analytics/database/filters/__init__.py +7 -0
- edx_enterprise_data-10.13.0/enterprise_data/admin_analytics/database/filters/fact_completion_admin_dash.py +22 -0
- edx_enterprise_data-10.13.0/enterprise_data/admin_analytics/database/filters/fact_engagement_admin_dash.py +11 -0
- edx_enterprise_data-10.13.0/enterprise_data/admin_analytics/database/filters/fact_enrollment_admin_dash.py +11 -0
- edx_enterprise_data-10.13.0/enterprise_data/admin_analytics/database/filters/mixins.py +84 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py +13 -18
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py +20 -24
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py +103 -33
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py +96 -74
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/serializers.py +1 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/analytics_completions.py +11 -5
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/analytics_engagements.py +10 -5
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/enterprise_admin.py +2 -1
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/pre_warm_analytics_cache.py +11 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/v1/views/test_enterprise_admin.py +5 -4
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_delivery_method.py +1 -1
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/requirements/base.txt +6 -6
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/requirements/ci.txt +1 -1
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/requirements/dev.txt +8 -8
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/requirements/quality.txt +10 -10
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/requirements/test-master.txt +8 -8
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/requirements/test-reporting.txt +5 -5
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/requirements/test.txt +8 -8
- edx_enterprise_data-10.11.1/enterprise_data/admin_analytics/database/filters/__init__.py +0 -5
- edx_enterprise_data-10.11.1/enterprise_data/admin_analytics/database/filters/fact_enrollment_admin_dash.py +0 -51
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/LICENSE +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/MANIFEST.in +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/README.md +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/edx_enterprise_data.egg-info/dependency_links.txt +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/edx_enterprise_data.egg-info/not-zip-safe +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/edx_enterprise_data.egg-info/requires.txt +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/edx_enterprise_data.egg-info/top_level.txt +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/constants.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/data_loaders.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/filters/base.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/queries/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/queries/skills_daily_rollup_admin_dash.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/query_filters/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/query_filters/base.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/query_filters/between.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/query_filters/equal.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/query_filters/in_.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/tables/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/tables/base.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/tables/skills_daily_rollup_admin_dash.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/utils.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/urls.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v0/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v0/serializers.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v0/urls.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v0/views.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/urls.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/analytics_enrollments.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/analytics_leaderboard.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/base.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/enterprise_learner.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/enterprise_offers.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/apps.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/cache/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/cache/decorators.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/clients.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/constants.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/exceptions.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/filters.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/fixtures/enterprise_enrollment.json +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/fixtures/enterprise_user.json +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/create_dummy_data.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/create_dummy_data_lpr_v1.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/create_enterprise_enrollment.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/create_enterprise_learner_enrollment_lpr_v1.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/create_enterprise_offer.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/create_enterprise_user.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/tests/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/tests/test_create_dummy_data_lpr_v1.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/tests/test_create_enterprise_enrollment.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/tests/test_create_enterprise_user.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/tests/test_pre_warm_analytics_cache.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0001_initial.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0002_auto_20180430_1358.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0003_auto_20180501_0603.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0004_auto_20180501_0928.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0004_auto_20180508_1652.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0005_auto_20180524_2204.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0006_auto_20180612_0336.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0007_auto_20180612_0534.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0008_auto_20180614_0108.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0009_auto_20180628_1152.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0010_enterpriseenrollment_created.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0011_enterpriseuser.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0012_auto_20180831_1930.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0013_auto_20180831_1931.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0014_enterpriseuser_created.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0015_auto_20180907_1757.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0016_auto_20180924_2138.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0017_enterpriseenrollment_unenrollment_timestamp.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0018_enterprisedatafeaturerole_enterprisedataroleassignment.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0019_add_enterprise_data_feature_roles.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0020_add_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0021_auto_20190329_1241.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0022_remove_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0023_enterpriselearner_enterpriselearnerenrollment.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0024_auto_20210602_1811.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0025_auto_20210703_1854.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0026_auto_20210916_0414.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0027_enterpriselearnerenrollment_total_learning_time_seconds.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0028_enterpriselearnerenrollment_offer_id.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0029_enterpriseoffer.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0030_auto_20230609_1353.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0031_auto_20230615_0705.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0032_auto_20230704_0818.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0033_enterpriseadminlearnerprogress_enterpriseadminsummarizeinsights.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0034_auto_20230907_0834.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0035_auto_20230907_1154.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0036_enterprisesubsidybudget_subsidy_access_policy_display_name.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0037_alter_enterpriseenrollment_consent_granted.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0038_enterpriseoffer_export_timestamp.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0039_auto_20240212_1403.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0040_auto_20240718_0536_squashed_0043_alter_enterpriselearnerenrollment_enterprise_enrollment_id.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0044_enterpriseexecedlcmoduleperformance.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0045_alter_enterpriseexecedlcmoduleperformance_options_and_more.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0046_enterprisegroupmembership.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0047_enterpriseexecedlcmoduleperformance_avg_after_lo_score_and_more.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0048_alter_enterpriseexecedlcmoduleperformance_avg_after_lo_score_and_more.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/models.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/paginators.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/renderers.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/settings/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/settings/test.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/signals.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/mock_analytics_data.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/mock_enrollments.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/test_analytics_engagements.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/test_analytics_enrollments.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/test_analytics_leaderboard.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/test_data_loaders.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/test_enterprise_completions.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/v0/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/v0/test_serializers.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/v1/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/v1/test_serializers.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/v1/test_views.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/v1/views/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/factories.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/mixins.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/test_clients.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/test_filters.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/test_models.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/test_utils.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/tests/test_views.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/urls.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data/utils.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/admin.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/apps.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/constants.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/migrations/0001_initial.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/migrations/0002_add_enterprise_data_feature_roles.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/migrations/0003_add_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/migrations/0004_enterprisedataroleassignment_enterprise_id.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/migrations/0005_turn_on_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/migrations/0006_remove_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/migrations/0007_enterprisedataroleassignment_applies_to_all_contexts.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/migrations/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/models.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/rules.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/tests/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/tests/factories.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_data_roles/tests/test_models.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/clients/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/clients/enterprise.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/clients/s3.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/clients/snowflake.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/clients/vertica.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/constants.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/delivery_method.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/external_resource_link_report.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/fixtures/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/fixtures/enterprise_customer_reporting.json +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/reporter.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/send_enterprise_reports.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/__init__.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_clients.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_enterprise_client.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_external_link_report.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_reporter.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_send_enterprise_reports.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_utils.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_vertica_client.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/utils.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/enterprise_reporting/utils.py +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/requirements/base.in +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/requirements/common_constraints.txt +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/requirements/constraints.txt +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/requirements/django.txt +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/requirements/pip.txt +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/requirements/pip_tools.txt +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/requirements/reporting.in +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/setup.cfg +0 -0
- {edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/setup.py +0 -0
@@ -15,11 +15,18 @@ Unreleased
|
|
15
15
|
----------
|
16
16
|
|
17
17
|
=========================
|
18
|
+
[10.13.0] - 2025-04-11
|
19
|
+
---------------------
|
20
|
+
* feat: Support filtering of engagement API by group_uuid
|
21
|
+
|
22
|
+
[10.12.0] - 2025-04-09
|
23
|
+
---------------------
|
24
|
+
* feat: Added the ability to filter enrollments by group_uuid in the enterprise completions API
|
25
|
+
|
18
26
|
[10.11.1] - 2025-04-08
|
19
27
|
---------------------
|
20
28
|
* fix: Fixed a bug in group_uuid based filtering.
|
21
29
|
|
22
|
-
|
23
30
|
[10.11.0] - 2025-03-25
|
24
31
|
---------------------
|
25
32
|
* feat: Added the ability to filter enrollments by group_uuid in the enterprise enrollments API.
|
{edx_enterprise_data-10.11.1 → edx_enterprise_data-10.13.0}/edx_enterprise_data.egg-info/SOURCES.txt
RENAMED
@@ -28,7 +28,10 @@ enterprise_data/admin_analytics/database/__init__.py
|
|
28
28
|
enterprise_data/admin_analytics/database/utils.py
|
29
29
|
enterprise_data/admin_analytics/database/filters/__init__.py
|
30
30
|
enterprise_data/admin_analytics/database/filters/base.py
|
31
|
+
enterprise_data/admin_analytics/database/filters/fact_completion_admin_dash.py
|
32
|
+
enterprise_data/admin_analytics/database/filters/fact_engagement_admin_dash.py
|
31
33
|
enterprise_data/admin_analytics/database/filters/fact_enrollment_admin_dash.py
|
34
|
+
enterprise_data/admin_analytics/database/filters/mixins.py
|
32
35
|
enterprise_data/admin_analytics/database/queries/__init__.py
|
33
36
|
enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py
|
34
37
|
enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py
|
@@ -0,0 +1,22 @@
|
|
1
|
+
"""
|
2
|
+
Query filters for enrollments table.
|
3
|
+
"""
|
4
|
+
from enterprise_data.admin_analytics.database.filters.base import BaseFilter
|
5
|
+
from enterprise_data.admin_analytics.database.filters.mixins import CommonFiltersMixin
|
6
|
+
from enterprise_data.admin_analytics.database.query_filters import EqualQueryFilter
|
7
|
+
|
8
|
+
|
9
|
+
class FactCompletionAdminDashFilters(CommonFiltersMixin, BaseFilter):
|
10
|
+
"""
|
11
|
+
Query filters for completions data in enrollments table.
|
12
|
+
"""
|
13
|
+
|
14
|
+
@staticmethod
|
15
|
+
def has_passed_filter() -> EqualQueryFilter:
|
16
|
+
"""
|
17
|
+
Filter by has passed with fixed value 1.
|
18
|
+
"""
|
19
|
+
return EqualQueryFilter(
|
20
|
+
column='has_passed',
|
21
|
+
value=1
|
22
|
+
)
|
@@ -0,0 +1,11 @@
|
|
1
|
+
"""
|
2
|
+
Query filters for engagments data.
|
3
|
+
"""
|
4
|
+
from enterprise_data.admin_analytics.database.filters.base import BaseFilter
|
5
|
+
from enterprise_data.admin_analytics.database.filters.mixins import CommonFiltersMixin
|
6
|
+
|
7
|
+
|
8
|
+
class FactEngagementAdminDashFilters(CommonFiltersMixin, BaseFilter):
|
9
|
+
"""
|
10
|
+
Query filters for engagments data.
|
11
|
+
"""
|
@@ -0,0 +1,11 @@
|
|
1
|
+
"""
|
2
|
+
Query filters for enrollments table.
|
3
|
+
"""
|
4
|
+
from enterprise_data.admin_analytics.database.filters.base import BaseFilter
|
5
|
+
from enterprise_data.admin_analytics.database.filters.mixins import CommonFiltersMixin
|
6
|
+
|
7
|
+
|
8
|
+
class FactEnrollmentAdminDashFilters(CommonFiltersMixin, BaseFilter):
|
9
|
+
"""
|
10
|
+
Query filters for enrollments table.
|
11
|
+
"""
|
@@ -0,0 +1,84 @@
|
|
1
|
+
"""
|
2
|
+
Common query filters for all tables.
|
3
|
+
"""
|
4
|
+
from logging import getLogger
|
5
|
+
from typing import Optional, Tuple
|
6
|
+
from uuid import UUID
|
7
|
+
|
8
|
+
from enterprise_data.admin_analytics.database.filters.base import BaseFilter
|
9
|
+
from enterprise_data.admin_analytics.database.query_filters import BetweenQueryFilter, EqualQueryFilter, INQueryFilter
|
10
|
+
from enterprise_data.clients import EnterpriseApiClient
|
11
|
+
from enterprise_data.exceptions import EnterpriseApiClientException
|
12
|
+
|
13
|
+
LOGGER = getLogger(__name__)
|
14
|
+
|
15
|
+
|
16
|
+
class CommonFiltersMixin(BaseFilter):
|
17
|
+
"""
|
18
|
+
Common filters.
|
19
|
+
"""
|
20
|
+
@staticmethod
|
21
|
+
def enterprise_customer_uuid_filter(enterprise_customer_uuid_params_key: str) -> EqualQueryFilter:
|
22
|
+
"""
|
23
|
+
Filter by enterprise customer uuid.
|
24
|
+
|
25
|
+
Arguments:
|
26
|
+
enterprise_customer_uuid_params_key: The key against which value will be passed in the query.
|
27
|
+
"""
|
28
|
+
return EqualQueryFilter(
|
29
|
+
column='enterprise_customer_uuid',
|
30
|
+
value_placeholder=enterprise_customer_uuid_params_key,
|
31
|
+
)
|
32
|
+
|
33
|
+
@staticmethod
|
34
|
+
def date_range_filter(
|
35
|
+
column: str,
|
36
|
+
start_date_params_key: str,
|
37
|
+
end_date_params_key: str
|
38
|
+
) -> BetweenQueryFilter:
|
39
|
+
"""
|
40
|
+
Filter by a table column to be in the given date range.
|
41
|
+
|
42
|
+
Arguments:
|
43
|
+
column (str): The table column name to filter on.
|
44
|
+
start_date_params_key (str): The start date key against which value will be passed in the query.
|
45
|
+
end_date_params_key (str): The end date key against which value will be passed in the query.
|
46
|
+
"""
|
47
|
+
return BetweenQueryFilter(
|
48
|
+
column=column,
|
49
|
+
range_placeholders=(start_date_params_key, end_date_params_key),
|
50
|
+
)
|
51
|
+
|
52
|
+
def enterprise_user_query_filter( # pylint: disable=inconsistent-return-statements
|
53
|
+
self,
|
54
|
+
group_uuid: Optional[UUID],
|
55
|
+
enterprise_customer_uuid: UUID
|
56
|
+
) -> Optional[Tuple[INQueryFilter, dict]]:
|
57
|
+
"""
|
58
|
+
Get the query filter to filter enrollments for enterprise users in the given group.
|
59
|
+
|
60
|
+
Arguments:
|
61
|
+
group_uuid (UUID): The UUID of the group.
|
62
|
+
enterprise_customer_uuid (UUID): The UUID of the enterprise customer.
|
63
|
+
|
64
|
+
Returns:
|
65
|
+
(INQueryFilter | None): The query filter to filter enrollments for enterprise users in the given group.
|
66
|
+
"""
|
67
|
+
if not group_uuid:
|
68
|
+
return None
|
69
|
+
|
70
|
+
try:
|
71
|
+
learners_in_group = EnterpriseApiClient.get_enterprise_user_ids_in_group(group_uuid)
|
72
|
+
except EnterpriseApiClientException:
|
73
|
+
LOGGER.exception(
|
74
|
+
"Failed to get learners in group [%s] for enterprise [%s]",
|
75
|
+
group_uuid,
|
76
|
+
enterprise_customer_uuid,
|
77
|
+
)
|
78
|
+
else:
|
79
|
+
params = {f'eu_{i}': i for i in learners_in_group}
|
80
|
+
enterprise_user_id_in_filter = INQueryFilter(
|
81
|
+
column='enterprise_user_id',
|
82
|
+
values_placeholders=list(params.keys()),
|
83
|
+
)
|
84
|
+
return enterprise_user_id_in_filter, params
|
@@ -21,34 +21,32 @@ class FactEngagementAdminDashQueries:
|
|
21
21
|
"""
|
22
22
|
|
23
23
|
@staticmethod
|
24
|
-
def get_engagement_count_query():
|
24
|
+
def get_engagement_count_query(query_filters):
|
25
25
|
"""
|
26
26
|
Get the query to fetch the total number of engagements for an enterprise customer.
|
27
27
|
"""
|
28
|
-
return """
|
28
|
+
return f"""
|
29
29
|
SELECT count(*)
|
30
30
|
FROM fact_enrollment_engagement_day_admin_dash
|
31
|
-
WHERE
|
32
|
-
activity_date BETWEEN %(start_date)s AND %(end_date)s;
|
31
|
+
WHERE {query_filters.to_sql()};
|
33
32
|
"""
|
34
33
|
|
35
34
|
@staticmethod
|
36
|
-
def get_all_engagement_query():
|
35
|
+
def get_all_engagement_query(query_filters):
|
37
36
|
"""
|
38
37
|
Get the query to fetch all engagement data.
|
39
38
|
"""
|
40
|
-
return """
|
39
|
+
return f"""
|
41
40
|
SELECT
|
42
41
|
email, course_title, course_subject, enroll_type, activity_date,
|
43
42
|
learning_time_seconds/3600 as learning_time_hours
|
44
43
|
FROM fact_enrollment_engagement_day_admin_dash
|
45
|
-
WHERE
|
46
|
-
activity_date BETWEEN %(start_date)s AND %(end_date)s
|
44
|
+
WHERE {query_filters.to_sql()}
|
47
45
|
ORDER BY activity_date DESC LIMIT %(limit)s OFFSET %(offset)s;
|
48
46
|
"""
|
49
47
|
|
50
48
|
@staticmethod
|
51
|
-
def get_top_courses_by_engagement_query(record_count=10):
|
49
|
+
def get_top_courses_by_engagement_query(query_filters, record_count=10):
|
52
50
|
"""
|
53
51
|
Get the query to fetch the learning time in hours by courses.
|
54
52
|
|
@@ -69,8 +67,7 @@ class FactEngagementAdminDashQueries:
|
|
69
67
|
(learning_time_seconds / 60.0 / 60.0) AS learning_time_hours,
|
70
68
|
activity_date
|
71
69
|
FROM fact_enrollment_engagement_day_admin_dash
|
72
|
-
WHERE
|
73
|
-
activity_date BETWEEN %(start_date)s AND %(end_date)s
|
70
|
+
WHERE {query_filters.to_sql()}
|
74
71
|
),
|
75
72
|
top_10_courses AS (
|
76
73
|
SELECT
|
@@ -94,7 +91,7 @@ class FactEngagementAdminDashQueries:
|
|
94
91
|
"""
|
95
92
|
|
96
93
|
@staticmethod
|
97
|
-
def get_top_subjects_by_engagement_query(record_count=10):
|
94
|
+
def get_top_subjects_by_engagement_query(query_filters, record_count=10):
|
98
95
|
"""
|
99
96
|
Get the query to fetch the learning time in hours by subjects.
|
100
97
|
|
@@ -114,8 +111,7 @@ class FactEngagementAdminDashQueries:
|
|
114
111
|
(learning_time_seconds / 60.0 / 60.0) AS learning_time_hours,
|
115
112
|
activity_date
|
116
113
|
FROM fact_enrollment_engagement_day_admin_dash
|
117
|
-
WHERE
|
118
|
-
activity_date BETWEEN %(start_date)s AND %(end_date)s
|
114
|
+
WHERE {query_filters.to_sql()}
|
119
115
|
),
|
120
116
|
top_10_subjects AS (
|
121
117
|
SELECT
|
@@ -138,7 +134,7 @@ class FactEngagementAdminDashQueries:
|
|
138
134
|
"""
|
139
135
|
|
140
136
|
@staticmethod
|
141
|
-
def get_engagement_time_series_data_query():
|
137
|
+
def get_engagement_time_series_data_query(query_filters):
|
142
138
|
"""
|
143
139
|
Get the query to fetch the completion time series data.
|
144
140
|
|
@@ -147,11 +143,10 @@ class FactEngagementAdminDashQueries:
|
|
147
143
|
Returns:
|
148
144
|
(str): Query to fetch the completion time series data.
|
149
145
|
"""
|
150
|
-
return """
|
146
|
+
return f"""
|
151
147
|
SELECT activity_date, enroll_type, SUM(learning_time_seconds)/3600 as learning_time_hours
|
152
148
|
FROM fact_enrollment_engagement_day_admin_dash
|
153
|
-
WHERE
|
154
|
-
activity_date BETWEEN %(start_date)s AND %(end_date)s
|
149
|
+
WHERE {query_filters.to_sql()}
|
155
150
|
GROUP BY activity_date, enroll_type
|
156
151
|
ORDER BY activity_date;
|
157
152
|
"""
|
@@ -70,17 +70,15 @@ class FactEnrollmentAdminDashQueries:
|
|
70
70
|
"""
|
71
71
|
|
72
72
|
@staticmethod
|
73
|
-
def get_completion_count_query():
|
73
|
+
def get_completion_count_query(query_filters: QueryFilters) -> str:
|
74
74
|
"""
|
75
75
|
Get the query to fetch the completion count.
|
76
76
|
"""
|
77
|
-
return """
|
77
|
+
return f"""
|
78
78
|
SELECT
|
79
79
|
SUM(has_passed) as completions
|
80
80
|
FROM fact_enrollment_admin_dash
|
81
|
-
WHERE
|
82
|
-
has_passed=1 AND
|
83
|
-
passed_date BETWEEN %(start_date)s AND %(end_date)s;
|
81
|
+
WHERE {query_filters.to_sql()};
|
84
82
|
"""
|
85
83
|
|
86
84
|
@staticmethod
|
@@ -94,7 +92,7 @@ class FactEnrollmentAdminDashQueries:
|
|
94
92
|
FROM fact_engagement_admin_dash
|
95
93
|
WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
96
94
|
activity_date BETWEEN %(start_date)s AND %(end_date)s;
|
97
|
-
|
95
|
+
"""
|
98
96
|
|
99
97
|
@staticmethod
|
100
98
|
def get_top_courses_by_enrollments_query(query_filters: QueryFilters, record_count: int = 10) -> str:
|
@@ -183,27 +181,28 @@ class FactEnrollmentAdminDashQueries:
|
|
183
181
|
"""
|
184
182
|
|
185
183
|
@staticmethod
|
186
|
-
def get_all_completions_query(
|
184
|
+
def get_all_completions_query(
|
185
|
+
query_filters: QueryFilters,
|
186
|
+
) -> str:
|
187
187
|
"""
|
188
188
|
Get the query to fetch all completions.
|
189
189
|
"""
|
190
|
-
return """
|
190
|
+
return f"""
|
191
191
|
SELECT email, course_title, course_subject, enroll_type, passed_date
|
192
192
|
FROM fact_enrollment_admin_dash
|
193
|
-
WHERE
|
194
|
-
has_passed=1 AND
|
195
|
-
passed_date BETWEEN %(start_date)s AND %(end_date)s
|
193
|
+
WHERE {query_filters.to_sql()}
|
196
194
|
ORDER BY passed_date DESC LIMIT %(limit)s OFFSET %(offset)s
|
197
195
|
"""
|
198
196
|
|
199
197
|
@staticmethod
|
200
|
-
def get_top_courses_by_completions_query(record_count=10):
|
198
|
+
def get_top_courses_by_completions_query(query_filters: QueryFilters, record_count=10) -> str:
|
201
199
|
"""
|
202
200
|
Get the query to fetch the completion count by courses.
|
203
201
|
|
204
202
|
Query should fetch the top N courses by completion count. Where N is the value of record_count.
|
205
203
|
|
206
204
|
Arguments:
|
205
|
+
query_filters (QueryFilters): List of query filters.
|
207
206
|
record_count (int): Number of records to fetch.
|
208
207
|
|
209
208
|
Returns:
|
@@ -217,9 +216,7 @@ class FactEnrollmentAdminDashQueries:
|
|
217
216
|
enroll_type,
|
218
217
|
passed_date
|
219
218
|
FROM fact_enrollment_admin_dash
|
220
|
-
WHERE
|
221
|
-
enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
222
|
-
passed_date BETWEEN %(start_date)s AND %(end_date)s
|
219
|
+
WHERE {query_filters.to_sql()}
|
223
220
|
),
|
224
221
|
top_10_courses AS (
|
225
222
|
SELECT
|
@@ -243,13 +240,14 @@ class FactEnrollmentAdminDashQueries:
|
|
243
240
|
"""
|
244
241
|
|
245
242
|
@staticmethod
|
246
|
-
def get_top_subjects_by_completions_query(record_count=10):
|
243
|
+
def get_top_subjects_by_completions_query(query_filters: QueryFilters, record_count=10) -> str:
|
247
244
|
"""
|
248
245
|
Get the query to fetch the completion count by subjects.
|
249
246
|
|
250
247
|
Query should fetch the top N subjects by completion count. Where N is the value of record_count.
|
251
248
|
|
252
249
|
Arguments:
|
250
|
+
query_filters (QueryFilters): List of query filters.
|
253
251
|
record_count (int): Number of records to fetch.
|
254
252
|
|
255
253
|
Returns:
|
@@ -262,9 +260,7 @@ class FactEnrollmentAdminDashQueries:
|
|
262
260
|
enroll_type,
|
263
261
|
passed_date
|
264
262
|
FROM fact_enrollment_admin_dash
|
265
|
-
WHERE
|
266
|
-
enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
267
|
-
passed_date BETWEEN %(start_date)s AND %(end_date)s
|
263
|
+
WHERE {query_filters.to_sql()}
|
268
264
|
),
|
269
265
|
top_10_subjects AS (
|
270
266
|
SELECT
|
@@ -287,7 +283,9 @@ class FactEnrollmentAdminDashQueries:
|
|
287
283
|
"""
|
288
284
|
|
289
285
|
@staticmethod
|
290
|
-
def get_completions_time_series_data_query(
|
286
|
+
def get_completions_time_series_data_query(
|
287
|
+
query_filters: QueryFilters,
|
288
|
+
) -> str:
|
291
289
|
"""
|
292
290
|
Get the query to fetch the completion time series data.
|
293
291
|
|
@@ -296,12 +294,10 @@ class FactEnrollmentAdminDashQueries:
|
|
296
294
|
Returns:
|
297
295
|
(str): Query to fetch the completion time series data.
|
298
296
|
"""
|
299
|
-
return """
|
297
|
+
return f"""
|
300
298
|
SELECT passed_date, enroll_type, count(course_key) as completion_count
|
301
299
|
FROM fact_enrollment_admin_dash
|
302
|
-
WHERE
|
303
|
-
has_passed=1 AND
|
304
|
-
passed_date BETWEEN %(start_date)s AND %(end_date)s
|
300
|
+
WHERE {query_filters.to_sql()}
|
305
301
|
GROUP BY passed_date, enroll_type
|
306
302
|
ORDER BY passed_date;
|
307
303
|
"""
|
@@ -2,12 +2,15 @@
|
|
2
2
|
Module for interacting with the fact_enrollment_engagement_day_admin_dash table.
|
3
3
|
"""
|
4
4
|
from datetime import date
|
5
|
+
from typing import Optional, Tuple
|
5
6
|
from uuid import UUID
|
6
7
|
|
7
8
|
from enterprise_data.cache.decorators import cache_it
|
8
9
|
from enterprise_data.utils import find_first
|
9
10
|
|
11
|
+
from ..filters import FactEngagementAdminDashFilters
|
10
12
|
from ..queries import FactEngagementAdminDashQueries
|
13
|
+
from ..query_filters import QueryFilters
|
11
14
|
from ..utils import run_query
|
12
15
|
from .base import BaseTable
|
13
16
|
|
@@ -19,6 +22,43 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
19
22
|
Class for communicating with the fact_enrollment_engagement_day_admin_dash table.
|
20
23
|
"""
|
21
24
|
queries = FactEngagementAdminDashQueries()
|
25
|
+
engagement_filters = FactEngagementAdminDashFilters()
|
26
|
+
|
27
|
+
def __get_common_query_filters_for_engagement(
|
28
|
+
self, enterprise_customer_uuid: UUID,
|
29
|
+
group_uuid: Optional[UUID],
|
30
|
+
start_date: date,
|
31
|
+
end_date: date,
|
32
|
+
) -> Tuple[QueryFilters, dict]:
|
33
|
+
"""
|
34
|
+
Utility method to get query filters common in most usages below.
|
35
|
+
This will return a tuple containing the query filters list and the dictionary of query parameters that
|
36
|
+
will be used in the query.
|
37
|
+
It will contain the following query filters.
|
38
|
+
1. enterprise_customer_uuid filter to filter records for an enterprise customer.
|
39
|
+
2. enrollment_date range filter to filter records by enrollment date.
|
40
|
+
3. group_uuid filter to filter records for learners who belong to the given group.
|
41
|
+
"""
|
42
|
+
query_filters = QueryFilters([
|
43
|
+
self.engagement_filters.enterprise_customer_uuid_filter('enterprise_customer_uuid'),
|
44
|
+
self.engagement_filters.date_range_filter('activity_date', 'start_date', 'end_date'),
|
45
|
+
])
|
46
|
+
params = {
|
47
|
+
'enterprise_customer_uuid': enterprise_customer_uuid,
|
48
|
+
'start_date': start_date,
|
49
|
+
'end_date': end_date,
|
50
|
+
}
|
51
|
+
|
52
|
+
response = self.engagement_filters.enterprise_user_query_filter(
|
53
|
+
group_uuid,
|
54
|
+
enterprise_customer_uuid
|
55
|
+
)
|
56
|
+
if response is not None:
|
57
|
+
enterprise_user_id_in_filter, enterprise_user_id_params = response
|
58
|
+
query_filters.append(enterprise_user_id_in_filter)
|
59
|
+
params.update(enterprise_user_id_params)
|
60
|
+
|
61
|
+
return query_filters, params
|
22
62
|
|
23
63
|
@cache_it()
|
24
64
|
def get_learning_hours_and_daily_sessions(self, enterprise_customer_uuid: UUID, start_date: date, end_date: date):
|
@@ -47,7 +87,13 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
47
87
|
return tuple(results[0])
|
48
88
|
|
49
89
|
@cache_it()
|
50
|
-
def get_engagement_count(
|
90
|
+
def get_engagement_count(
|
91
|
+
self,
|
92
|
+
enterprise_customer_uuid: UUID,
|
93
|
+
group_uuid: Optional[UUID],
|
94
|
+
start_date: date,
|
95
|
+
end_date: date
|
96
|
+
):
|
51
97
|
"""
|
52
98
|
Get the total number of engagements for the given enterprise customer.
|
53
99
|
|
@@ -59,13 +105,13 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
59
105
|
Returns:
|
60
106
|
int: The total number of engagements.
|
61
107
|
"""
|
108
|
+
query_filters, query_filter_params = self.__get_common_query_filters_for_engagement(
|
109
|
+
enterprise_customer_uuid, group_uuid, start_date, end_date
|
110
|
+
)
|
111
|
+
|
62
112
|
results = run_query(
|
63
|
-
query=self.queries.get_engagement_count_query(),
|
64
|
-
params=
|
65
|
-
'enterprise_customer_uuid': enterprise_customer_uuid,
|
66
|
-
'start_date': start_date,
|
67
|
-
'end_date': end_date,
|
68
|
-
}
|
113
|
+
query=self.queries.get_engagement_count_query(query_filters),
|
114
|
+
params=query_filter_params,
|
69
115
|
)
|
70
116
|
if not results:
|
71
117
|
return 0
|
@@ -73,13 +119,20 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
73
119
|
|
74
120
|
@cache_it()
|
75
121
|
def get_all_engagements(
|
76
|
-
|
122
|
+
self,
|
123
|
+
enterprise_customer_uuid: UUID,
|
124
|
+
group_uuid: Optional[UUID],
|
125
|
+
start_date: date,
|
126
|
+
end_date: date,
|
127
|
+
limit: int,
|
128
|
+
offset: int
|
77
129
|
):
|
78
130
|
"""
|
79
131
|
Get all engagement data for the given enterprise customer.
|
80
132
|
|
81
133
|
Arguments:
|
82
134
|
enterprise_customer_uuid (UUID): The UUID of the enterprise customer.
|
135
|
+
group_uuid (UUID): The UUID of a group.
|
83
136
|
start_date (date): The start date.
|
84
137
|
end_date (date): The end date.
|
85
138
|
limit (int): The maximum number of records to return.
|
@@ -88,12 +141,14 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
88
141
|
Returns:
|
89
142
|
list<dict>: A list of dictionaries containing the engagement data.
|
90
143
|
"""
|
144
|
+
query_filters, query_filter_params = self.__get_common_query_filters_for_engagement(
|
145
|
+
enterprise_customer_uuid, group_uuid, start_date, end_date
|
146
|
+
)
|
147
|
+
|
91
148
|
return run_query(
|
92
|
-
query=self.queries.get_all_engagement_query(),
|
149
|
+
query=self.queries.get_all_engagement_query(query_filters),
|
93
150
|
params={
|
94
|
-
|
95
|
-
'start_date': start_date,
|
96
|
-
'end_date': end_date,
|
151
|
+
**query_filter_params,
|
97
152
|
'limit': limit,
|
98
153
|
'offset': offset,
|
99
154
|
},
|
@@ -101,7 +156,13 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
101
156
|
)
|
102
157
|
|
103
158
|
@cache_it()
|
104
|
-
def get_top_courses_by_engagement(
|
159
|
+
def get_top_courses_by_engagement(
|
160
|
+
self,
|
161
|
+
enterprise_customer_uuid: UUID,
|
162
|
+
group_uuid: Optional[UUID],
|
163
|
+
start_date: date,
|
164
|
+
end_date: date
|
165
|
+
):
|
105
166
|
"""
|
106
167
|
Get the top courses by user engagement for the given enterprise customer.
|
107
168
|
|
@@ -113,18 +174,23 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
113
174
|
Returns:
|
114
175
|
list<dict>: A list of dictionaries containing the course data.
|
115
176
|
"""
|
177
|
+
query_filters, query_filter_params = self.__get_common_query_filters_for_engagement(
|
178
|
+
enterprise_customer_uuid, group_uuid, start_date, end_date
|
179
|
+
)
|
116
180
|
return run_query(
|
117
|
-
query=self.queries.get_top_courses_by_engagement_query(),
|
118
|
-
params=
|
119
|
-
'enterprise_customer_uuid': enterprise_customer_uuid,
|
120
|
-
'start_date': start_date,
|
121
|
-
'end_date': end_date,
|
122
|
-
},
|
181
|
+
query=self.queries.get_top_courses_by_engagement_query(query_filters),
|
182
|
+
params=query_filter_params,
|
123
183
|
as_dict=True,
|
124
184
|
)
|
125
185
|
|
126
186
|
@cache_it()
|
127
|
-
def get_top_subjects_by_engagement(
|
187
|
+
def get_top_subjects_by_engagement(
|
188
|
+
self,
|
189
|
+
enterprise_customer_uuid: UUID,
|
190
|
+
group_uuid: Optional[UUID],
|
191
|
+
start_date: date,
|
192
|
+
end_date: date
|
193
|
+
):
|
128
194
|
"""
|
129
195
|
Get the top subjects by user engagement for the given enterprise customer.
|
130
196
|
|
@@ -136,18 +202,23 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
136
202
|
Returns:
|
137
203
|
list<dict>: A list of dictionaries containing the subject data.
|
138
204
|
"""
|
205
|
+
query_filters, query_filter_params = self.__get_common_query_filters_for_engagement(
|
206
|
+
enterprise_customer_uuid, group_uuid, start_date, end_date
|
207
|
+
)
|
139
208
|
return run_query(
|
140
|
-
query=self.queries.get_top_subjects_by_engagement_query(),
|
141
|
-
params=
|
142
|
-
'enterprise_customer_uuid': enterprise_customer_uuid,
|
143
|
-
'start_date': start_date,
|
144
|
-
'end_date': end_date,
|
145
|
-
},
|
209
|
+
query=self.queries.get_top_subjects_by_engagement_query(query_filters),
|
210
|
+
params=query_filter_params,
|
146
211
|
as_dict=True,
|
147
212
|
)
|
148
213
|
|
149
214
|
@cache_it()
|
150
|
-
def get_engagement_time_series_data(
|
215
|
+
def get_engagement_time_series_data(
|
216
|
+
self,
|
217
|
+
enterprise_customer_uuid: UUID,
|
218
|
+
group_uuid: Optional[UUID],
|
219
|
+
start_date: date,
|
220
|
+
end_date: date
|
221
|
+
):
|
151
222
|
"""
|
152
223
|
Get the engagement time series data.
|
153
224
|
|
@@ -159,13 +230,12 @@ class FactEngagementAdminDashTable(BaseTable):
|
|
159
230
|
Returns:
|
160
231
|
list<dict>: A list of dictionaries containing the engagement time series data.
|
161
232
|
"""
|
233
|
+
query_filters, query_filter_params = self.__get_common_query_filters_for_engagement(
|
234
|
+
enterprise_customer_uuid, group_uuid, start_date, end_date
|
235
|
+
)
|
162
236
|
return run_query(
|
163
|
-
query=self.queries.get_engagement_time_series_data_query(),
|
164
|
-
params=
|
165
|
-
'enterprise_customer_uuid': enterprise_customer_uuid,
|
166
|
-
'start_date': start_date,
|
167
|
-
'end_date': end_date,
|
168
|
-
},
|
237
|
+
query=self.queries.get_engagement_time_series_data_query(query_filters),
|
238
|
+
params=query_filter_params,
|
169
239
|
as_dict=True,
|
170
240
|
)
|
171
241
|
|