edx-enterprise-data 8.9.0__tar.gz → 8.11.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-8.9.0 → edx_enterprise_data-8.11.0}/CHANGELOG.rst +7 -0
- {edx_enterprise_data-8.9.0/edx_enterprise_data.egg-info → edx_enterprise_data-8.11.0}/PKG-INFO +1 -1
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0/edx_enterprise_data.egg-info}/PKG-INFO +1 -1
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/edx_enterprise_data.egg-info/SOURCES.txt +11 -1
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/__init__.py +1 -1
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/admin_analytics/constants.py +8 -0
- edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/__init__.py +4 -0
- edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/queries/__init__.py +5 -0
- edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py +21 -0
- edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py +61 -0
- edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/tables/__init__.py +5 -0
- edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/tables/base.py +18 -0
- edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py +38 -0
- edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py +76 -0
- edx_enterprise_data-8.9.0/enterprise_data/admin_analytics/database.py → edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/utils.py +3 -2
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/serializers.py +31 -1
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/urls.py +14 -0
- edx_enterprise_data-8.11.0/enterprise_data/api/v1/views/analytics_engagements.py +395 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/analytics_enrollments.py +1 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/analytics_leaderboard.py +4 -1
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/enterprise_admin.py +15 -44
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/enterprise_completions.py +2 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/renderers.py +14 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/mock_analytics_data.py +41 -1
- edx_enterprise_data-8.11.0/enterprise_data/tests/admin_analytics/test_analytics_engagements.py +390 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/v1/views/test_enterprise_admin.py +43 -20
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/LICENSE +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/MANIFEST.in +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/README.md +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/edx_enterprise_data.egg-info/dependency_links.txt +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/edx_enterprise_data.egg-info/not-zip-safe +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/edx_enterprise_data.egg-info/requires.txt +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/edx_enterprise_data.egg-info/top_level.txt +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/admin_analytics/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/admin_analytics/completions_utils.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/admin_analytics/data_loaders.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/admin_analytics/utils.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/urls.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v0/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v0/serializers.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v0/urls.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v0/views.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/paginators.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/base.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/enterprise_learner.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/enterprise_offers.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/apps.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/clients.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/constants.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/filters.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/fixtures/enterprise_enrollment.json +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/fixtures/enterprise_user.json +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/create_dummy_data.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/create_dummy_data_lpr_v1.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/create_enterprise_enrollment.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/create_enterprise_learner_enrollment_lpr_v1.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/create_enterprise_offer.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/create_enterprise_user.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/tests/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/tests/test_create_dummy_data_lpr_v1.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/tests/test_create_enterprise_enrollment.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/tests/test_create_enterprise_user.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0001_initial.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0002_auto_20180430_1358.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0003_auto_20180501_0603.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0004_auto_20180501_0928.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0004_auto_20180508_1652.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0005_auto_20180524_2204.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0006_auto_20180612_0336.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0007_auto_20180612_0534.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0008_auto_20180614_0108.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0009_auto_20180628_1152.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0010_enterpriseenrollment_created.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0011_enterpriseuser.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0012_auto_20180831_1930.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0013_auto_20180831_1931.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0014_enterpriseuser_created.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0015_auto_20180907_1757.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0016_auto_20180924_2138.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0017_enterpriseenrollment_unenrollment_timestamp.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0018_enterprisedatafeaturerole_enterprisedataroleassignment.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0019_add_enterprise_data_feature_roles.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0020_add_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0021_auto_20190329_1241.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0022_remove_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0023_enterpriselearner_enterpriselearnerenrollment.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0024_auto_20210602_1811.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0025_auto_20210703_1854.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0026_auto_20210916_0414.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0027_enterpriselearnerenrollment_total_learning_time_seconds.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0028_enterpriselearnerenrollment_offer_id.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0029_enterpriseoffer.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0030_auto_20230609_1353.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0031_auto_20230615_0705.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0032_auto_20230704_0818.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0033_enterpriseadminlearnerprogress_enterpriseadminsummarizeinsights.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0034_auto_20230907_0834.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0035_auto_20230907_1154.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0036_enterprisesubsidybudget_subsidy_access_policy_display_name.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0037_alter_enterpriseenrollment_consent_granted.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0038_enterpriseoffer_export_timestamp.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0039_auto_20240212_1403.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0040_auto_20240718_0536_squashed_0043_alter_enterpriselearnerenrollment_enterprise_enrollment_id.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0044_enterpriseexecedlcmoduleperformance.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/models.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/paginators.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/settings/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/settings/test.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/signals.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/mock_enrollments.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/test_analytics_enrollments.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/test_analytics_leaderboard.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/test_data_loaders.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/test_enterprise_completions.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/test_utils.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/v0/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/v0/test_serializers.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/v1/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/v1/test_serializers.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/v1/test_views.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/v1/views/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/factories.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/mixins.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/test_clients.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/test_filters.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/test_models.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/test_utils.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/test_views.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/urls.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/utils.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/admin.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/apps.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/constants.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/migrations/0001_initial.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/migrations/0002_add_enterprise_data_feature_roles.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/migrations/0003_add_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/migrations/0004_enterprisedataroleassignment_enterprise_id.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/migrations/0005_turn_on_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/migrations/0006_remove_role_based_access_control_switch.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/migrations/0007_enterprisedataroleassignment_applies_to_all_contexts.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/migrations/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/models.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/rules.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/tests/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/tests/factories.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/tests/test_models.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/clients/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/clients/enterprise.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/clients/s3.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/clients/snowflake.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/clients/vertica.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/delivery_method.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/external_resource_link_report.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/fixtures/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/fixtures/enterprise_customer_reporting.json +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/reporter.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/send_enterprise_reports.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/__init__.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_clients.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_delivery_method.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_enterprise_client.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_external_link_report.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_reporter.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_send_enterprise_reports.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_utils.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_vertica_client.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/utils.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/utils.py +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/base.in +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/base.txt +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/ci.txt +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/common_constraints.txt +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/constraints.txt +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/dev.txt +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/django.txt +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/pip.txt +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/pip_tools.txt +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/quality.txt +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/reporting.in +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/test-master.txt +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/test-reporting.txt +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/test.txt +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/setup.cfg +0 -0
- {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/setup.py +0 -0
@@ -15,6 +15,13 @@ Unreleased
|
|
15
15
|
----------
|
16
16
|
|
17
17
|
=========================
|
18
|
+
[8.11.0] - 2024-08-29
|
19
|
+
---------------------
|
20
|
+
* perf: Performance enhancements for admin analytics aggregates endpoint.
|
21
|
+
|
22
|
+
[8.10.0] - 2024-08-27
|
23
|
+
---------------------
|
24
|
+
* feat: Added API endpoints for advance analytics engagements data.
|
18
25
|
|
19
26
|
[8.9.0] - 2024-08-23
|
20
27
|
---------------------
|
{edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/edx_enterprise_data.egg-info/SOURCES.txt
RENAMED
@@ -24,8 +24,16 @@ enterprise_data/admin_analytics/__init__.py
|
|
24
24
|
enterprise_data/admin_analytics/completions_utils.py
|
25
25
|
enterprise_data/admin_analytics/constants.py
|
26
26
|
enterprise_data/admin_analytics/data_loaders.py
|
27
|
-
enterprise_data/admin_analytics/database.py
|
28
27
|
enterprise_data/admin_analytics/utils.py
|
28
|
+
enterprise_data/admin_analytics/database/__init__.py
|
29
|
+
enterprise_data/admin_analytics/database/utils.py
|
30
|
+
enterprise_data/admin_analytics/database/queries/__init__.py
|
31
|
+
enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py
|
32
|
+
enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py
|
33
|
+
enterprise_data/admin_analytics/database/tables/__init__.py
|
34
|
+
enterprise_data/admin_analytics/database/tables/base.py
|
35
|
+
enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py
|
36
|
+
enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py
|
29
37
|
enterprise_data/api/__init__.py
|
30
38
|
enterprise_data/api/urls.py
|
31
39
|
enterprise_data/api/v0/__init__.py
|
@@ -37,6 +45,7 @@ enterprise_data/api/v1/paginators.py
|
|
37
45
|
enterprise_data/api/v1/serializers.py
|
38
46
|
enterprise_data/api/v1/urls.py
|
39
47
|
enterprise_data/api/v1/views/__init__.py
|
48
|
+
enterprise_data/api/v1/views/analytics_engagements.py
|
40
49
|
enterprise_data/api/v1/views/analytics_enrollments.py
|
41
50
|
enterprise_data/api/v1/views/analytics_leaderboard.py
|
42
51
|
enterprise_data/api/v1/views/base.py
|
@@ -117,6 +126,7 @@ enterprise_data/tests/test_views.py
|
|
117
126
|
enterprise_data/tests/admin_analytics/__init__.py
|
118
127
|
enterprise_data/tests/admin_analytics/mock_analytics_data.py
|
119
128
|
enterprise_data/tests/admin_analytics/mock_enrollments.py
|
129
|
+
enterprise_data/tests/admin_analytics/test_analytics_engagements.py
|
120
130
|
enterprise_data/tests/admin_analytics/test_analytics_enrollments.py
|
121
131
|
enterprise_data/tests/admin_analytics/test_analytics_leaderboard.py
|
122
132
|
enterprise_data/tests/admin_analytics/test_data_loaders.py
|
@@ -31,3 +31,11 @@ class ResponseType(Enum):
|
|
31
31
|
"""Response type choices"""
|
32
32
|
JSON = 'json'
|
33
33
|
CSV = 'csv'
|
34
|
+
|
35
|
+
|
36
|
+
class EngagementChart(Enum):
|
37
|
+
"""Response Choices"""
|
38
|
+
ENGAGEMENTS_OVER_TIME = 'engagements_over_time'
|
39
|
+
TOP_COURSES_BY_ENGAGEMENTS = 'top_courses_by_engagements'
|
40
|
+
TOP_SUBJECTS_BY_ENGAGEMENTS = 'top_subjects_by_engagements'
|
41
|
+
INDIVIDUAL_ENGAGEMENTS = 'individual_engagements'
|
@@ -0,0 +1,21 @@
|
|
1
|
+
"""
|
2
|
+
Module containing queries for the fact_enrollment_engagement_day_admin_dash table.
|
3
|
+
"""
|
4
|
+
|
5
|
+
|
6
|
+
class FactEngagementAdminDashQueries:
|
7
|
+
"""
|
8
|
+
Queries related to the fact_enrollment_engagement_day_admin_dash table.
|
9
|
+
"""
|
10
|
+
@staticmethod
|
11
|
+
def get_learning_hours_and_daily_sessions_query():
|
12
|
+
"""
|
13
|
+
Get the query to fetch the learning hours and daily sessions.
|
14
|
+
"""
|
15
|
+
return """
|
16
|
+
SELECT
|
17
|
+
ROUND(SUM(learning_time_seconds) / 60 / 60, 1) as hours, SUM(is_engaged) as sessions
|
18
|
+
FROM fact_enrollment_engagement_day_admin_dash
|
19
|
+
WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
20
|
+
activity_date BETWEEN %(start_date)s AND %(end_date)s;
|
21
|
+
"""
|
@@ -0,0 +1,61 @@
|
|
1
|
+
"""
|
2
|
+
Module containing queries for the fact_enrollment_admin_dash table.
|
3
|
+
"""
|
4
|
+
|
5
|
+
|
6
|
+
class FactEnrollmentAdminDashQueries:
|
7
|
+
"""
|
8
|
+
Queries related to the fact_enrollment_admin_dash table.
|
9
|
+
"""
|
10
|
+
|
11
|
+
@staticmethod
|
12
|
+
def get_enrollment_date_range_query():
|
13
|
+
"""
|
14
|
+
Get the query to fetch the enrollment date range.
|
15
|
+
"""
|
16
|
+
return """
|
17
|
+
SELECT
|
18
|
+
MIN(enterprise_enrollment_date) AS min_enrollment_date,
|
19
|
+
MAX(enterprise_enrollment_date) AS max_enrollment_date
|
20
|
+
FROM fact_enrollment_admin_dash
|
21
|
+
WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s;
|
22
|
+
"""
|
23
|
+
|
24
|
+
@staticmethod
|
25
|
+
def get_enrollment_and_course_count_query():
|
26
|
+
"""
|
27
|
+
Get the query to fetch the enrollment and course count.
|
28
|
+
"""
|
29
|
+
return """
|
30
|
+
SELECT
|
31
|
+
count(*) as enrolls, count(DISTINCT course_key) as courses
|
32
|
+
FROM fact_enrollment_admin_dash
|
33
|
+
WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
34
|
+
enterprise_enrollment_date BETWEEN %(start_date)s AND %(end_date)s;
|
35
|
+
"""
|
36
|
+
|
37
|
+
@staticmethod
|
38
|
+
def get_completion_count_query():
|
39
|
+
"""
|
40
|
+
Get the query to fetch the completion count.
|
41
|
+
"""
|
42
|
+
return """
|
43
|
+
SELECT
|
44
|
+
SUM(has_passed) as completions
|
45
|
+
FROM fact_enrollment_admin_dash
|
46
|
+
WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
47
|
+
passed_date BETWEEN %(start_date)s AND %(end_date)s;
|
48
|
+
"""
|
49
|
+
|
50
|
+
@staticmethod
|
51
|
+
def get_learning_hours_and_daily_sessions_query():
|
52
|
+
"""
|
53
|
+
Get the query to fetch the learning hours and daily sessions.
|
54
|
+
"""
|
55
|
+
return """
|
56
|
+
SELECT
|
57
|
+
ROUND(SUM(learning_time_seconds) / 60 / 60, 1) as hours, SUM(is_engaged) as sessions
|
58
|
+
FROM fact_engagement_admin_dash
|
59
|
+
WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
|
60
|
+
activity_date BETWEEN %(start_date)s AND %(end_date)s;
|
61
|
+
"""
|
@@ -0,0 +1,18 @@
|
|
1
|
+
"""
|
2
|
+
Base class to store the table information.
|
3
|
+
"""
|
4
|
+
|
5
|
+
|
6
|
+
class BaseTable:
|
7
|
+
"""
|
8
|
+
Singleton class to store the table information.
|
9
|
+
"""
|
10
|
+
instance = None
|
11
|
+
|
12
|
+
def __new__(cls):
|
13
|
+
"""
|
14
|
+
Singleton method to create a single instance of the table.
|
15
|
+
"""
|
16
|
+
if cls.instance is None:
|
17
|
+
cls.instance = super(BaseTable, cls).__new__(cls)
|
18
|
+
return cls.instance
|
@@ -0,0 +1,38 @@
|
|
1
|
+
"""
|
2
|
+
Module for interacting with the fact_enrollment_engagement_day_admin_dash table.
|
3
|
+
"""
|
4
|
+
from datetime import date
|
5
|
+
from uuid import UUID
|
6
|
+
|
7
|
+
from ..queries import FactEngagementAdminDashQueries
|
8
|
+
from ..utils import run_query
|
9
|
+
from .base import BaseTable
|
10
|
+
|
11
|
+
|
12
|
+
class FactEngagementAdminDashTable(BaseTable):
|
13
|
+
"""
|
14
|
+
Class for communicating with the fact_enrollment_engagement_day_admin_dash table.
|
15
|
+
"""
|
16
|
+
queries = FactEngagementAdminDashQueries()
|
17
|
+
|
18
|
+
def get_learning_hours_and_daily_sessions(self, enterprise_customer_uuid: UUID, start_date: date, end_date: date):
|
19
|
+
"""
|
20
|
+
Get the learning hours and daily sessions for the given enterprise customer.
|
21
|
+
|
22
|
+
Arguments:
|
23
|
+
enterprise_customer_uuid (UUID): The UUID of the enterprise customer.
|
24
|
+
start_date (date): The start date.
|
25
|
+
end_date (date): The end date.
|
26
|
+
|
27
|
+
Returns:
|
28
|
+
(tuple<float, int>): The learning hours and daily sessions.
|
29
|
+
"""
|
30
|
+
results = run_query(
|
31
|
+
query=self.queries.get_learning_hours_and_daily_sessions_query(),
|
32
|
+
params={
|
33
|
+
'enterprise_customer_uuid': enterprise_customer_uuid,
|
34
|
+
'start_date': start_date,
|
35
|
+
'end_date': end_date,
|
36
|
+
}
|
37
|
+
)
|
38
|
+
return tuple(results[0])
|
@@ -0,0 +1,76 @@
|
|
1
|
+
"""
|
2
|
+
Module for interacting with the fact_enrollment_admin_dash table.
|
3
|
+
"""
|
4
|
+
from datetime import date
|
5
|
+
from uuid import UUID
|
6
|
+
|
7
|
+
from ..queries import FactEnrollmentAdminDashQueries
|
8
|
+
from ..utils import run_query
|
9
|
+
from .base import BaseTable
|
10
|
+
|
11
|
+
|
12
|
+
class FactEnrollmentAdminDashTable(BaseTable):
|
13
|
+
"""
|
14
|
+
Class for communicating with the fact_enrollment_admin_dash table.
|
15
|
+
"""
|
16
|
+
queries = FactEnrollmentAdminDashQueries()
|
17
|
+
|
18
|
+
def get_enrollment_date_range(self, enterprise_customer_uuid: UUID):
|
19
|
+
"""
|
20
|
+
Get the enrollment date range for the given enterprise customer.
|
21
|
+
|
22
|
+
Arguments:
|
23
|
+
enterprise_customer_uuid (UUID): The UUID of the enterprise customer.
|
24
|
+
|
25
|
+
Returns:
|
26
|
+
(tuple<int, int>): The minimum and maximum enrollment dates.
|
27
|
+
"""
|
28
|
+
results = run_query(
|
29
|
+
query=self.queries.get_enrollment_date_range_query(),
|
30
|
+
params={'enterprise_customer_uuid': enterprise_customer_uuid}
|
31
|
+
)
|
32
|
+
return tuple(results[0])
|
33
|
+
|
34
|
+
def get_enrollment_and_course_count(self, enterprise_customer_uuid: UUID, start_date: date, end_date: date):
|
35
|
+
"""
|
36
|
+
Get the enrollment and course count for the given enterprise customer.
|
37
|
+
|
38
|
+
Arguments:
|
39
|
+
enterprise_customer_uuid (UUID): The UUID of the enterprise customer.
|
40
|
+
start_date (date): The start date.
|
41
|
+
end_date (date): The end date.
|
42
|
+
|
43
|
+
Returns:
|
44
|
+
(tuple<int, int>): The enrollment and course count.
|
45
|
+
"""
|
46
|
+
results = run_query(
|
47
|
+
query=self.queries.get_enrollment_and_course_count_query(),
|
48
|
+
params={
|
49
|
+
'enterprise_customer_uuid': enterprise_customer_uuid,
|
50
|
+
'start_date': start_date,
|
51
|
+
'end_date': end_date,
|
52
|
+
}
|
53
|
+
)
|
54
|
+
return tuple(results[0])
|
55
|
+
|
56
|
+
def get_completion_count(self, enterprise_customer_uuid: UUID, start_date: date, end_date: date):
|
57
|
+
"""
|
58
|
+
Get the completion count for the given enterprise customer.
|
59
|
+
|
60
|
+
Arguments:
|
61
|
+
enterprise_customer_uuid (UUID): The UUID of the enterprise customer.
|
62
|
+
start_date (date): The start date.
|
63
|
+
end_date (date): The end date.
|
64
|
+
|
65
|
+
Returns:
|
66
|
+
int: The completion count.
|
67
|
+
"""
|
68
|
+
results = run_query(
|
69
|
+
query=self.queries.get_completion_count_query(),
|
70
|
+
params={
|
71
|
+
'enterprise_customer_uuid': enterprise_customer_uuid,
|
72
|
+
'start_date': start_date,
|
73
|
+
'end_date': end_date,
|
74
|
+
}
|
75
|
+
)
|
76
|
+
return results[0][0]
|
@@ -30,12 +30,13 @@ def get_db_connection(database=settings.ENTERPRISE_REPORTING_DB_ALIAS):
|
|
30
30
|
|
31
31
|
|
32
32
|
@timeit
|
33
|
-
def run_query(query):
|
33
|
+
def run_query(query, params: dict = None):
|
34
34
|
"""
|
35
35
|
Run a query on the database and return the results.
|
36
36
|
|
37
37
|
Arguments:
|
38
38
|
query (str): The query to run.
|
39
|
+
params (dict): The parameters to pass to the query.
|
39
40
|
|
40
41
|
Returns:
|
41
42
|
(list): The results of the query.
|
@@ -43,7 +44,7 @@ def run_query(query):
|
|
43
44
|
try:
|
44
45
|
with closing(get_db_connection()) as connection:
|
45
46
|
with closing(connection.cursor()) as cursor:
|
46
|
-
cursor.execute(query)
|
47
|
+
cursor.execute(query, params=params)
|
47
48
|
return cursor.fetchall()
|
48
49
|
except Exception:
|
49
50
|
LOGGER.exception(f'[run_query]: run_query failed for query "{query}".')
|
{edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/serializers.py
RENAMED
@@ -5,7 +5,13 @@ from uuid import UUID
|
|
5
5
|
|
6
6
|
from rest_framework import serializers
|
7
7
|
|
8
|
-
from enterprise_data.admin_analytics.constants import
|
8
|
+
from enterprise_data.admin_analytics.constants import (
|
9
|
+
Calculation,
|
10
|
+
EngagementChart,
|
11
|
+
EnrollmentChart,
|
12
|
+
Granularity,
|
13
|
+
ResponseType,
|
14
|
+
)
|
9
15
|
from enterprise_data.models import (
|
10
16
|
EnterpriseAdminLearnerProgress,
|
11
17
|
EnterpriseAdminSummarizeInsights,
|
@@ -331,3 +337,27 @@ class AdvanceAnalyticsEnrollmentStatsSerializer(
|
|
331
337
|
if value not in self.CHART_TYPES:
|
332
338
|
raise serializers.ValidationError(f"chart_type must be one of {self.CHART_TYPES}")
|
333
339
|
return value
|
340
|
+
|
341
|
+
|
342
|
+
class AdvanceAnalyticsEngagementStatsSerializer(
|
343
|
+
AdvanceAnalyticsQueryParamSerializer
|
344
|
+
): # pylint: disable=abstract-method
|
345
|
+
"""Serializer for validating Advance Analytics Engagements Stats API"""
|
346
|
+
CHART_TYPES = [
|
347
|
+
EngagementChart.ENGAGEMENTS_OVER_TIME.value,
|
348
|
+
EngagementChart.TOP_COURSES_BY_ENGAGEMENTS.value,
|
349
|
+
EngagementChart.TOP_SUBJECTS_BY_ENGAGEMENTS.value
|
350
|
+
]
|
351
|
+
|
352
|
+
chart_type = serializers.CharField(required=False)
|
353
|
+
|
354
|
+
def validate_chart_type(self, value):
|
355
|
+
"""
|
356
|
+
Validate the chart_type value.
|
357
|
+
|
358
|
+
Raises:
|
359
|
+
serializers.ValidationError: If chart_type is not one of the valid choices
|
360
|
+
"""
|
361
|
+
if value not in self.CHART_TYPES:
|
362
|
+
raise serializers.ValidationError(f"chart_type must be one of {self.CHART_TYPES}")
|
363
|
+
return value
|
@@ -11,6 +11,10 @@ from enterprise_data.api.v1.views import enterprise_admin as enterprise_admin_vi
|
|
11
11
|
from enterprise_data.api.v1.views import enterprise_completions as enterprise_completions_views
|
12
12
|
from enterprise_data.api.v1.views import enterprise_learner as enterprise_learner_views
|
13
13
|
from enterprise_data.api.v1.views import enterprise_offers as enterprise_offers_views
|
14
|
+
from enterprise_data.api.v1.views.analytics_engagements import (
|
15
|
+
AdvanceAnalyticsEngagementStatsView,
|
16
|
+
AdvanceAnalyticsIndividualEngagementsView,
|
17
|
+
)
|
14
18
|
from enterprise_data.api.v1.views.analytics_enrollments import (
|
15
19
|
AdvanceAnalyticsEnrollmentStatsView,
|
16
20
|
AdvanceAnalyticsIndividualEnrollmentsView,
|
@@ -73,6 +77,16 @@ urlpatterns = [
|
|
73
77
|
AdvanceAnalyticsIndividualEnrollmentsView.as_view(),
|
74
78
|
name='enterprise-admin-analytics-enrollments'
|
75
79
|
),
|
80
|
+
re_path(
|
81
|
+
fr'^admin/analytics/(?P<enterprise_uuid>{UUID4_REGEX})/engagements/stats$',
|
82
|
+
AdvanceAnalyticsEngagementStatsView.as_view(),
|
83
|
+
name='enterprise-admin-analytics-engagements-stats'
|
84
|
+
),
|
85
|
+
re_path(
|
86
|
+
fr'^admin/analytics/(?P<enterprise_uuid>{UUID4_REGEX})/engagements$',
|
87
|
+
AdvanceAnalyticsIndividualEngagementsView.as_view(),
|
88
|
+
name='enterprise-admin-analytics-engagements'
|
89
|
+
),
|
76
90
|
re_path(
|
77
91
|
fr'^admin/analytics/(?P<enterprise_id>{UUID4_REGEX})/skills/stats',
|
78
92
|
enterprise_admin_views.EnterpriseAdminAnalyticsSkillsView.as_view(),
|