edx-enterprise-data 10.12.0__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.12.0 → edx_enterprise_data-10.13.0}/CHANGELOG.rst +4 -0
- {edx_enterprise_data-10.12.0/edx_enterprise_data.egg-info → edx_enterprise_data-10.13.0}/PKG-INFO +1 -1
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0/edx_enterprise_data.egg-info}/PKG-INFO +1 -1
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/edx_enterprise_data.egg-info/SOURCES.txt +2 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/__init__.py +1 -1
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/filters/__init__.py +1 -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.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py +13 -18
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py +103 -33
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py +8 -42
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/analytics_engagements.py +10 -5
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/pre_warm_analytics_cache.py +5 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/requirements/base.txt +6 -6
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/requirements/ci.txt +1 -1
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/requirements/dev.txt +8 -8
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/requirements/quality.txt +10 -10
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/requirements/test-master.txt +8 -8
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/requirements/test-reporting.txt +5 -5
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/requirements/test.txt +8 -8
- edx_enterprise_data-10.12.0/enterprise_data/admin_analytics/database/filters/fact_completion_admin_dash.py +0 -36
- edx_enterprise_data-10.12.0/enterprise_data/admin_analytics/database/filters/fact_enrollment_admin_dash.py +0 -51
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/LICENSE +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/MANIFEST.in +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/README.md +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/edx_enterprise_data.egg-info/dependency_links.txt +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/edx_enterprise_data.egg-info/not-zip-safe +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/edx_enterprise_data.egg-info/requires.txt +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/edx_enterprise_data.egg-info/top_level.txt +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/constants.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/data_loaders.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/filters/base.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/queries/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/queries/skills_daily_rollup_admin_dash.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/query_filters/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/query_filters/base.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/query_filters/between.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/query_filters/equal.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/query_filters/in_.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/tables/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/tables/base.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/tables/skills_daily_rollup_admin_dash.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/admin_analytics/database/utils.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/urls.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v0/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v0/serializers.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v0/urls.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v0/views.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/serializers.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/urls.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/analytics_completions.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/analytics_enrollments.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/analytics_leaderboard.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/base.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/enterprise_admin.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/enterprise_learner.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/api/v1/views/enterprise_offers.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/apps.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/cache/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/cache/decorators.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/clients.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/constants.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/exceptions.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/filters.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/fixtures/enterprise_enrollment.json +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/fixtures/enterprise_user.json +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/create_dummy_data.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/create_dummy_data_lpr_v1.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/create_enterprise_enrollment.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/create_enterprise_learner_enrollment_lpr_v1.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/create_enterprise_offer.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/create_enterprise_user.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/tests/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/tests/test_create_dummy_data_lpr_v1.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/tests/test_create_enterprise_enrollment.py +0 -0
- {edx_enterprise_data-10.12.0 → 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.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/tests/test_create_enterprise_user.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/management/commands/tests/test_pre_warm_analytics_cache.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0001_initial.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0002_auto_20180430_1358.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0003_auto_20180501_0603.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0004_auto_20180501_0928.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0004_auto_20180508_1652.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0005_auto_20180524_2204.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0006_auto_20180612_0336.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0007_auto_20180612_0534.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0008_auto_20180614_0108.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0009_auto_20180628_1152.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0010_enterpriseenrollment_created.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0011_enterpriseuser.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0012_auto_20180831_1930.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0013_auto_20180831_1931.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0014_enterpriseuser_created.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0015_auto_20180907_1757.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0016_auto_20180924_2138.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0017_enterpriseenrollment_unenrollment_timestamp.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0018_enterprisedatafeaturerole_enterprisedataroleassignment.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0019_add_enterprise_data_feature_roles.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0020_add_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0021_auto_20190329_1241.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0022_remove_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0023_enterpriselearner_enterpriselearnerenrollment.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0024_auto_20210602_1811.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0025_auto_20210703_1854.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0026_auto_20210916_0414.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0027_enterpriselearnerenrollment_total_learning_time_seconds.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0028_enterpriselearnerenrollment_offer_id.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0029_enterpriseoffer.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0030_auto_20230609_1353.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0031_auto_20230615_0705.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0032_auto_20230704_0818.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0033_enterpriseadminlearnerprogress_enterpriseadminsummarizeinsights.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0034_auto_20230907_0834.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0035_auto_20230907_1154.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0036_enterprisesubsidybudget_subsidy_access_policy_display_name.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0037_alter_enterpriseenrollment_consent_granted.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0038_enterpriseoffer_export_timestamp.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0039_auto_20240212_1403.py +0 -0
- {edx_enterprise_data-10.12.0 → 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.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0044_enterpriseexecedlcmoduleperformance.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0045_alter_enterpriseexecedlcmoduleperformance_options_and_more.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0046_enterprisegroupmembership.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/0047_enterpriseexecedlcmoduleperformance_avg_after_lo_score_and_more.py +0 -0
- {edx_enterprise_data-10.12.0 → 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.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/migrations/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/models.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/paginators.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/renderers.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/settings/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/settings/test.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/signals.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/mock_analytics_data.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/mock_enrollments.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/test_analytics_engagements.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/test_analytics_enrollments.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/test_analytics_leaderboard.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/test_data_loaders.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/admin_analytics/test_enterprise_completions.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/v0/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/v0/test_serializers.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/v1/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/v1/test_serializers.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/v1/test_views.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/v1/views/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/api/v1/views/test_enterprise_admin.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/factories.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/mixins.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/test_clients.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/test_filters.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/test_models.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/test_utils.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/tests/test_views.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/urls.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data/utils.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/admin.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/apps.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/constants.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/migrations/0001_initial.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/migrations/0002_add_enterprise_data_feature_roles.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/migrations/0003_add_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/migrations/0004_enterprisedataroleassignment_enterprise_id.py +0 -0
- {edx_enterprise_data-10.12.0 → 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.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/migrations/0006_remove_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/migrations/0007_enterprisedataroleassignment_applies_to_all_contexts.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/migrations/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/models.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/rules.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/tests/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/tests/factories.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_data_roles/tests/test_models.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/clients/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/clients/enterprise.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/clients/s3.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/clients/snowflake.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/clients/vertica.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/constants.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/delivery_method.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/external_resource_link_report.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/fixtures/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/fixtures/enterprise_customer_reporting.json +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/reporter.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/send_enterprise_reports.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/__init__.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_clients.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_delivery_method.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_enterprise_client.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_external_link_report.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_reporter.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_send_enterprise_reports.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_utils.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/test_vertica_client.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/tests/utils.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/enterprise_reporting/utils.py +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/requirements/base.in +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/requirements/common_constraints.txt +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/requirements/constraints.txt +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/requirements/django.txt +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/requirements/pip.txt +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/requirements/pip_tools.txt +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/requirements/reporting.in +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/setup.cfg +0 -0
- {edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/setup.py +0 -0
@@ -15,6 +15,10 @@ 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
|
+
|
18
22
|
[10.12.0] - 2025-04-09
|
19
23
|
---------------------
|
20
24
|
* feat: Added the ability to filter enrollments by group_uuid in the enterprise completions API
|
{edx_enterprise_data-10.12.0 → edx_enterprise_data-10.13.0}/edx_enterprise_data.egg-info/SOURCES.txt
RENAMED
@@ -29,7 +29,9 @@ 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
31
|
enterprise_data/admin_analytics/database/filters/fact_completion_admin_dash.py
|
32
|
+
enterprise_data/admin_analytics/database/filters/fact_engagement_admin_dash.py
|
32
33
|
enterprise_data/admin_analytics/database/filters/fact_enrollment_admin_dash.py
|
34
|
+
enterprise_data/admin_analytics/database/filters/mixins.py
|
33
35
|
enterprise_data/admin_analytics/database/queries/__init__.py
|
34
36
|
enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py
|
35
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
|
"""
|
@@ -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
|
|
@@ -2,60 +2,26 @@
|
|
2
2
|
Module for interacting with the fact_enrollment_admin_dash table.
|
3
3
|
"""
|
4
4
|
from datetime import date, datetime
|
5
|
-
from logging import getLogger
|
6
5
|
from typing import Optional, Tuple
|
7
6
|
from uuid import UUID
|
8
7
|
|
9
8
|
from enterprise_data.cache.decorators import cache_it
|
10
|
-
from enterprise_data.clients import EnterpriseApiClient
|
11
|
-
from enterprise_data.exceptions import EnterpriseApiClientException
|
12
9
|
|
13
10
|
from ..filters import FactCompletionAdminDashFilters, FactEnrollmentAdminDashFilters
|
14
11
|
from ..queries import FactEnrollmentAdminDashQueries
|
15
|
-
from ..query_filters import
|
12
|
+
from ..query_filters import QueryFilters
|
16
13
|
from ..utils import run_query
|
17
14
|
from .base import BaseTable
|
18
15
|
|
19
|
-
LOGGER = getLogger(__name__)
|
20
|
-
|
21
16
|
|
22
17
|
class FactEnrollmentAdminDashTable(BaseTable):
|
23
18
|
"""
|
24
19
|
Class for communicating with the fact_enrollment_admin_dash table.
|
25
20
|
"""
|
26
21
|
queries = FactEnrollmentAdminDashQueries()
|
27
|
-
|
22
|
+
enrollment_filters = FactEnrollmentAdminDashFilters()
|
28
23
|
completion_filters = FactCompletionAdminDashFilters()
|
29
24
|
|
30
|
-
def __get_enterprise_user_query_filter( # pylint: disable=inconsistent-return-statements
|
31
|
-
self, group_uuid: Optional[UUID],
|
32
|
-
enterprise_customer_uuid: UUID
|
33
|
-
) -> Optional[Tuple[INQueryFilter, dict]]:
|
34
|
-
"""
|
35
|
-
Get the query filter to filter enrollments for enterprise users in the given group.
|
36
|
-
|
37
|
-
Arguments:
|
38
|
-
group_uuid (UUID): The UUID of the group.
|
39
|
-
enterprise_customer_uuid (UUID): The UUID of the enterprise customer.
|
40
|
-
|
41
|
-
Returns:
|
42
|
-
(INQueryFilter | None): The query filter to filter enrollments for enterprise users in the given group.
|
43
|
-
"""
|
44
|
-
if not group_uuid:
|
45
|
-
return None
|
46
|
-
|
47
|
-
try:
|
48
|
-
learners_in_group = EnterpriseApiClient.get_enterprise_user_ids_in_group(group_uuid)
|
49
|
-
except EnterpriseApiClientException:
|
50
|
-
LOGGER.exception(
|
51
|
-
"Failed to get learners in group [%s] for enterprise [%s]",
|
52
|
-
group_uuid,
|
53
|
-
enterprise_customer_uuid,
|
54
|
-
)
|
55
|
-
else:
|
56
|
-
params = {f'eu_{i}': enterprise_user_id for i, enterprise_user_id in enumerate(learners_in_group)}
|
57
|
-
return self.filters.enterprise_user_id_in_filter(list(params.keys())), params
|
58
|
-
|
59
25
|
def __get_common_query_filters(
|
60
26
|
self, enterprise_customer_uuid: UUID,
|
61
27
|
group_uuid: Optional[UUID],
|
@@ -74,8 +40,8 @@ class FactEnrollmentAdminDashTable(BaseTable):
|
|
74
40
|
3. group_uuid filter to filter records for learners who belong to the given group.
|
75
41
|
"""
|
76
42
|
query_filters = QueryFilters([
|
77
|
-
self.
|
78
|
-
self.
|
43
|
+
self.enrollment_filters.enterprise_customer_uuid_filter('enterprise_customer_uuid'),
|
44
|
+
self.enrollment_filters.date_range_filter('enterprise_enrollment_date', 'start_date', 'end_date'),
|
79
45
|
])
|
80
46
|
params = {
|
81
47
|
'enterprise_customer_uuid': enterprise_customer_uuid,
|
@@ -83,7 +49,7 @@ class FactEnrollmentAdminDashTable(BaseTable):
|
|
83
49
|
'end_date': end_date,
|
84
50
|
}
|
85
51
|
|
86
|
-
response = self.
|
52
|
+
response = self.enrollment_filters.enterprise_user_query_filter(
|
87
53
|
group_uuid, enterprise_customer_uuid
|
88
54
|
)
|
89
55
|
if response is not None:
|
@@ -112,8 +78,8 @@ class FactEnrollmentAdminDashTable(BaseTable):
|
|
112
78
|
4. has_passed filter to filter records for successful completions.
|
113
79
|
"""
|
114
80
|
query_filters = QueryFilters([
|
115
|
-
self.
|
116
|
-
self.completion_filters.
|
81
|
+
self.completion_filters.enterprise_customer_uuid_filter('enterprise_customer_uuid'),
|
82
|
+
self.completion_filters.date_range_filter('passed_date', 'start_date', 'end_date'),
|
117
83
|
self.completion_filters.has_passed_filter(),
|
118
84
|
])
|
119
85
|
params = {
|
@@ -122,7 +88,7 @@ class FactEnrollmentAdminDashTable(BaseTable):
|
|
122
88
|
'end_date': end_date,
|
123
89
|
}
|
124
90
|
|
125
|
-
response = self.
|
91
|
+
response = self.completion_filters.enterprise_user_query_filter(
|
126
92
|
group_uuid, enterprise_customer_uuid
|
127
93
|
)
|
128
94
|
if response is not None:
|