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.
Files changed (198) hide show
  1. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/CHANGELOG.rst +7 -0
  2. {edx_enterprise_data-8.9.0/edx_enterprise_data.egg-info → edx_enterprise_data-8.11.0}/PKG-INFO +1 -1
  3. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0/edx_enterprise_data.egg-info}/PKG-INFO +1 -1
  4. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/edx_enterprise_data.egg-info/SOURCES.txt +11 -1
  5. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/__init__.py +1 -1
  6. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/admin_analytics/constants.py +8 -0
  7. edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/__init__.py +4 -0
  8. edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/queries/__init__.py +5 -0
  9. edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py +21 -0
  10. edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py +61 -0
  11. edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/tables/__init__.py +5 -0
  12. edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/tables/base.py +18 -0
  13. edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py +38 -0
  14. edx_enterprise_data-8.11.0/enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py +76 -0
  15. 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
  16. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/serializers.py +31 -1
  17. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/urls.py +14 -0
  18. edx_enterprise_data-8.11.0/enterprise_data/api/v1/views/analytics_engagements.py +395 -0
  19. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/analytics_enrollments.py +1 -0
  20. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/analytics_leaderboard.py +4 -1
  21. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/enterprise_admin.py +15 -44
  22. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/enterprise_completions.py +2 -0
  23. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/renderers.py +14 -0
  24. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/mock_analytics_data.py +41 -1
  25. edx_enterprise_data-8.11.0/enterprise_data/tests/admin_analytics/test_analytics_engagements.py +390 -0
  26. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/v1/views/test_enterprise_admin.py +43 -20
  27. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/LICENSE +0 -0
  28. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/MANIFEST.in +0 -0
  29. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/README.md +0 -0
  30. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/edx_enterprise_data.egg-info/dependency_links.txt +0 -0
  31. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/edx_enterprise_data.egg-info/not-zip-safe +0 -0
  32. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/edx_enterprise_data.egg-info/requires.txt +0 -0
  33. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/edx_enterprise_data.egg-info/top_level.txt +0 -0
  34. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/admin_analytics/__init__.py +0 -0
  35. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/admin_analytics/completions_utils.py +0 -0
  36. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/admin_analytics/data_loaders.py +0 -0
  37. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/admin_analytics/utils.py +0 -0
  38. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/__init__.py +0 -0
  39. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/urls.py +0 -0
  40. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v0/__init__.py +0 -0
  41. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v0/serializers.py +0 -0
  42. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v0/urls.py +0 -0
  43. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v0/views.py +0 -0
  44. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/__init__.py +0 -0
  45. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/paginators.py +0 -0
  46. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/__init__.py +0 -0
  47. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/base.py +0 -0
  48. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/enterprise_learner.py +0 -0
  49. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/api/v1/views/enterprise_offers.py +0 -0
  50. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/apps.py +0 -0
  51. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/clients.py +0 -0
  52. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/constants.py +0 -0
  53. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/filters.py +0 -0
  54. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/fixtures/enterprise_enrollment.json +0 -0
  55. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/fixtures/enterprise_user.json +0 -0
  56. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/__init__.py +0 -0
  57. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/__init__.py +0 -0
  58. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/create_dummy_data.py +0 -0
  59. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/create_dummy_data_lpr_v1.py +0 -0
  60. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/create_enterprise_enrollment.py +0 -0
  61. {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
  62. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py +0 -0
  63. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/create_enterprise_offer.py +0 -0
  64. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/create_enterprise_user.py +0 -0
  65. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/tests/__init__.py +0 -0
  66. {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
  67. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/tests/test_create_enterprise_enrollment.py +0 -0
  68. {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
  69. {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
  70. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/management/commands/tests/test_create_enterprise_user.py +0 -0
  71. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0001_initial.py +0 -0
  72. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0002_auto_20180430_1358.py +0 -0
  73. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0003_auto_20180501_0603.py +0 -0
  74. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0004_auto_20180501_0928.py +0 -0
  75. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0004_auto_20180508_1652.py +0 -0
  76. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0005_auto_20180524_2204.py +0 -0
  77. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0006_auto_20180612_0336.py +0 -0
  78. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0007_auto_20180612_0534.py +0 -0
  79. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0008_auto_20180614_0108.py +0 -0
  80. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0009_auto_20180628_1152.py +0 -0
  81. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0010_enterpriseenrollment_created.py +0 -0
  82. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0011_enterpriseuser.py +0 -0
  83. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0012_auto_20180831_1930.py +0 -0
  84. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0013_auto_20180831_1931.py +0 -0
  85. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0014_enterpriseuser_created.py +0 -0
  86. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0015_auto_20180907_1757.py +0 -0
  87. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0016_auto_20180924_2138.py +0 -0
  88. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0017_enterpriseenrollment_unenrollment_timestamp.py +0 -0
  89. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0018_enterprisedatafeaturerole_enterprisedataroleassignment.py +0 -0
  90. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0019_add_enterprise_data_feature_roles.py +0 -0
  91. {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
  92. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0021_auto_20190329_1241.py +0 -0
  93. {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
  94. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0023_enterpriselearner_enterpriselearnerenrollment.py +0 -0
  95. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0024_auto_20210602_1811.py +0 -0
  96. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0025_auto_20210703_1854.py +0 -0
  97. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0026_auto_20210916_0414.py +0 -0
  98. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0027_enterpriselearnerenrollment_total_learning_time_seconds.py +0 -0
  99. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0028_enterpriselearnerenrollment_offer_id.py +0 -0
  100. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0029_enterpriseoffer.py +0 -0
  101. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0030_auto_20230609_1353.py +0 -0
  102. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0031_auto_20230615_0705.py +0 -0
  103. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0032_auto_20230704_0818.py +0 -0
  104. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0033_enterpriseadminlearnerprogress_enterpriseadminsummarizeinsights.py +0 -0
  105. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0034_auto_20230907_0834.py +0 -0
  106. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0035_auto_20230907_1154.py +0 -0
  107. {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
  108. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0037_alter_enterpriseenrollment_consent_granted.py +0 -0
  109. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0038_enterpriseoffer_export_timestamp.py +0 -0
  110. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0039_auto_20240212_1403.py +0 -0
  111. {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
  112. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/0044_enterpriseexecedlcmoduleperformance.py +0 -0
  113. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/migrations/__init__.py +0 -0
  114. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/models.py +0 -0
  115. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/paginators.py +0 -0
  116. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/settings/__init__.py +0 -0
  117. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/settings/test.py +0 -0
  118. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/signals.py +0 -0
  119. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/__init__.py +0 -0
  120. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/__init__.py +0 -0
  121. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/mock_enrollments.py +0 -0
  122. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/test_analytics_enrollments.py +0 -0
  123. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/test_analytics_leaderboard.py +0 -0
  124. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/test_data_loaders.py +0 -0
  125. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/test_enterprise_completions.py +0 -0
  126. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/admin_analytics/test_utils.py +0 -0
  127. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/__init__.py +0 -0
  128. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/v0/__init__.py +0 -0
  129. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/v0/test_serializers.py +0 -0
  130. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/v1/__init__.py +0 -0
  131. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/v1/test_serializers.py +0 -0
  132. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/v1/test_views.py +0 -0
  133. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/api/v1/views/__init__.py +0 -0
  134. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/factories.py +0 -0
  135. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/mixins.py +0 -0
  136. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/test_clients.py +0 -0
  137. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/test_filters.py +0 -0
  138. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/test_models.py +0 -0
  139. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/test_utils.py +0 -0
  140. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/tests/test_views.py +0 -0
  141. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/urls.py +0 -0
  142. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data/utils.py +0 -0
  143. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/__init__.py +0 -0
  144. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/admin.py +0 -0
  145. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/apps.py +0 -0
  146. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/constants.py +0 -0
  147. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/migrations/0001_initial.py +0 -0
  148. {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
  149. {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
  150. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/migrations/0004_enterprisedataroleassignment_enterprise_id.py +0 -0
  151. {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
  152. {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
  153. {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
  154. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/migrations/__init__.py +0 -0
  155. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/models.py +0 -0
  156. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/rules.py +0 -0
  157. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/tests/__init__.py +0 -0
  158. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/tests/factories.py +0 -0
  159. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_data_roles/tests/test_models.py +0 -0
  160. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/__init__.py +0 -0
  161. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/clients/__init__.py +0 -0
  162. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/clients/enterprise.py +0 -0
  163. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/clients/s3.py +0 -0
  164. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/clients/snowflake.py +0 -0
  165. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/clients/vertica.py +0 -0
  166. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/delivery_method.py +0 -0
  167. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/external_resource_link_report.py +0 -0
  168. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/fixtures/__init__.py +0 -0
  169. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/fixtures/enterprise_customer_reporting.json +0 -0
  170. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/reporter.py +0 -0
  171. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/send_enterprise_reports.py +0 -0
  172. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/__init__.py +0 -0
  173. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_clients.py +0 -0
  174. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_delivery_method.py +0 -0
  175. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_enterprise_client.py +0 -0
  176. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_external_link_report.py +0 -0
  177. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_reporter.py +0 -0
  178. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_send_enterprise_reports.py +0 -0
  179. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_utils.py +0 -0
  180. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/test_vertica_client.py +0 -0
  181. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/tests/utils.py +0 -0
  182. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/enterprise_reporting/utils.py +0 -0
  183. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/base.in +0 -0
  184. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/base.txt +0 -0
  185. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/ci.txt +0 -0
  186. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/common_constraints.txt +0 -0
  187. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/constraints.txt +0 -0
  188. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/dev.txt +0 -0
  189. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/django.txt +0 -0
  190. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/pip.txt +0 -0
  191. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/pip_tools.txt +0 -0
  192. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/quality.txt +0 -0
  193. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/reporting.in +0 -0
  194. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/test-master.txt +0 -0
  195. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/test-reporting.txt +0 -0
  196. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/requirements/test.txt +0 -0
  197. {edx_enterprise_data-8.9.0 → edx_enterprise_data-8.11.0}/setup.cfg +0 -0
  198. {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
  ---------------------
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edx-enterprise-data
3
- Version: 8.9.0
3
+ Version: 8.11.0
4
4
  Summary: Enterprise Reporting
5
5
  Home-page: https://github.com/openedx/edx-enterprise-data
6
6
  Author: edX
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edx-enterprise-data
3
- Version: 8.9.0
3
+ Version: 8.11.0
4
4
  Summary: Enterprise Reporting
5
5
  Home-page: https://github.com/openedx/edx-enterprise-data
6
6
  Author: edX
@@ -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
@@ -2,4 +2,4 @@
2
2
  Enterprise data api application. This Django app exposes API endpoints used by enterprises.
3
3
  """
4
4
 
5
- __version__ = "8.9.0"
5
+ __version__ = "8.11.0"
@@ -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,4 @@
1
+ """
2
+ This module contains the database queries for the admin analytics.
3
+ """
4
+ from .utils import run_query
@@ -0,0 +1,5 @@
1
+ """
2
+ Module containing queries for the fact_enrollment_admin_dash table.
3
+ """
4
+ from .fact_engagement_admin_dash import FactEngagementAdminDashQueries
5
+ from .fact_enrollment_admin_dash import FactEnrollmentAdminDashQueries
@@ -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,5 @@
1
+ """
2
+ This module contains the database queries for the admin analytics.
3
+ """
4
+ from .fact_engagement_admin_dash import FactEngagementAdminDashTable
5
+ from .fact_enrollment_admin_dash import FactEnrollmentAdminDashTable
@@ -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}".')
@@ -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 Calculation, EnrollmentChart, Granularity, ResponseType
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(),