edx-enterprise-data 9.2.1__tar.gz → 9.3.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 (196) hide show
  1. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/CHANGELOG.rst +8 -0
  2. {edx_enterprise_data-9.2.1/edx_enterprise_data.egg-info → edx_enterprise_data-9.3.0}/PKG-INFO +1 -1
  3. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0/edx_enterprise_data.egg-info}/PKG-INFO +1 -1
  4. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/__init__.py +1 -1
  5. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py +51 -61
  6. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py +71 -4
  7. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v1/views/enterprise_learner.py +2 -19
  8. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/LICENSE +0 -0
  9. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/MANIFEST.in +0 -0
  10. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/README.md +0 -0
  11. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/edx_enterprise_data.egg-info/SOURCES.txt +0 -0
  12. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/edx_enterprise_data.egg-info/dependency_links.txt +0 -0
  13. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/edx_enterprise_data.egg-info/not-zip-safe +0 -0
  14. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/edx_enterprise_data.egg-info/requires.txt +0 -0
  15. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/edx_enterprise_data.egg-info/top_level.txt +0 -0
  16. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/admin_analytics/__init__.py +0 -0
  17. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/admin_analytics/constants.py +0 -0
  18. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/admin_analytics/data_loaders.py +0 -0
  19. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/admin_analytics/database/__init__.py +0 -0
  20. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/admin_analytics/database/queries/__init__.py +0 -0
  21. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py +0 -0
  22. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/admin_analytics/database/queries/skills_daily_rollup_admin_dash.py +0 -0
  23. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/admin_analytics/database/tables/__init__.py +0 -0
  24. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/admin_analytics/database/tables/base.py +0 -0
  25. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py +0 -0
  26. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/admin_analytics/database/tables/skills_daily_rollup_admin_dash.py +0 -0
  27. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/admin_analytics/database/utils.py +0 -0
  28. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/__init__.py +0 -0
  29. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/urls.py +0 -0
  30. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v0/__init__.py +0 -0
  31. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v0/serializers.py +0 -0
  32. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v0/urls.py +0 -0
  33. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v0/views.py +0 -0
  34. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v1/__init__.py +0 -0
  35. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v1/serializers.py +0 -0
  36. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v1/urls.py +0 -0
  37. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v1/views/__init__.py +0 -0
  38. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v1/views/analytics_completions.py +0 -0
  39. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v1/views/analytics_engagements.py +0 -0
  40. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v1/views/analytics_enrollments.py +0 -0
  41. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v1/views/analytics_leaderboard.py +0 -0
  42. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v1/views/base.py +0 -0
  43. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v1/views/enterprise_admin.py +0 -0
  44. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/api/v1/views/enterprise_offers.py +0 -0
  45. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/apps.py +0 -0
  46. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/clients.py +0 -0
  47. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/constants.py +0 -0
  48. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/filters.py +0 -0
  49. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/fixtures/enterprise_enrollment.json +0 -0
  50. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/fixtures/enterprise_user.json +0 -0
  51. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/management/__init__.py +0 -0
  52. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/management/commands/__init__.py +0 -0
  53. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/management/commands/create_dummy_data.py +0 -0
  54. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/management/commands/create_dummy_data_lpr_v1.py +0 -0
  55. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/management/commands/create_enterprise_enrollment.py +0 -0
  56. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/management/commands/create_enterprise_learner_enrollment_lpr_v1.py +0 -0
  57. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py +0 -0
  58. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/management/commands/create_enterprise_offer.py +0 -0
  59. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/management/commands/create_enterprise_user.py +0 -0
  60. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/management/commands/tests/__init__.py +0 -0
  61. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/management/commands/tests/test_create_dummy_data_lpr_v1.py +0 -0
  62. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/management/commands/tests/test_create_enterprise_enrollment.py +0 -0
  63. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py +0 -0
  64. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py +0 -0
  65. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/management/commands/tests/test_create_enterprise_user.py +0 -0
  66. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0001_initial.py +0 -0
  67. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0002_auto_20180430_1358.py +0 -0
  68. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0003_auto_20180501_0603.py +0 -0
  69. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0004_auto_20180501_0928.py +0 -0
  70. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0004_auto_20180508_1652.py +0 -0
  71. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0005_auto_20180524_2204.py +0 -0
  72. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0006_auto_20180612_0336.py +0 -0
  73. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0007_auto_20180612_0534.py +0 -0
  74. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0008_auto_20180614_0108.py +0 -0
  75. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0009_auto_20180628_1152.py +0 -0
  76. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0010_enterpriseenrollment_created.py +0 -0
  77. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0011_enterpriseuser.py +0 -0
  78. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0012_auto_20180831_1930.py +0 -0
  79. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0013_auto_20180831_1931.py +0 -0
  80. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0014_enterpriseuser_created.py +0 -0
  81. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0015_auto_20180907_1757.py +0 -0
  82. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0016_auto_20180924_2138.py +0 -0
  83. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0017_enterpriseenrollment_unenrollment_timestamp.py +0 -0
  84. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0018_enterprisedatafeaturerole_enterprisedataroleassignment.py +0 -0
  85. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0019_add_enterprise_data_feature_roles.py +0 -0
  86. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0020_add_role_based_access_control_switch.py +0 -0
  87. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0021_auto_20190329_1241.py +0 -0
  88. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0022_remove_role_based_access_control_switch.py +0 -0
  89. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0023_enterpriselearner_enterpriselearnerenrollment.py +0 -0
  90. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0024_auto_20210602_1811.py +0 -0
  91. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0025_auto_20210703_1854.py +0 -0
  92. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0026_auto_20210916_0414.py +0 -0
  93. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0027_enterpriselearnerenrollment_total_learning_time_seconds.py +0 -0
  94. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0028_enterpriselearnerenrollment_offer_id.py +0 -0
  95. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0029_enterpriseoffer.py +0 -0
  96. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0030_auto_20230609_1353.py +0 -0
  97. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0031_auto_20230615_0705.py +0 -0
  98. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0032_auto_20230704_0818.py +0 -0
  99. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0033_enterpriseadminlearnerprogress_enterpriseadminsummarizeinsights.py +0 -0
  100. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0034_auto_20230907_0834.py +0 -0
  101. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0035_auto_20230907_1154.py +0 -0
  102. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0036_enterprisesubsidybudget_subsidy_access_policy_display_name.py +0 -0
  103. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0037_alter_enterpriseenrollment_consent_granted.py +0 -0
  104. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0038_enterpriseoffer_export_timestamp.py +0 -0
  105. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0039_auto_20240212_1403.py +0 -0
  106. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0040_auto_20240718_0536_squashed_0043_alter_enterpriselearnerenrollment_enterprise_enrollment_id.py +0 -0
  107. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/0044_enterpriseexecedlcmoduleperformance.py +0 -0
  108. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/migrations/__init__.py +0 -0
  109. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/models.py +0 -0
  110. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/paginators.py +0 -0
  111. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/renderers.py +0 -0
  112. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/settings/__init__.py +0 -0
  113. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/settings/test.py +0 -0
  114. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/signals.py +0 -0
  115. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/__init__.py +0 -0
  116. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/admin_analytics/__init__.py +0 -0
  117. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/admin_analytics/mock_analytics_data.py +0 -0
  118. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/admin_analytics/mock_enrollments.py +0 -0
  119. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/admin_analytics/test_analytics_engagements.py +0 -0
  120. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/admin_analytics/test_analytics_enrollments.py +0 -0
  121. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/admin_analytics/test_analytics_leaderboard.py +0 -0
  122. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/admin_analytics/test_data_loaders.py +0 -0
  123. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/admin_analytics/test_enterprise_completions.py +0 -0
  124. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/api/__init__.py +0 -0
  125. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/api/v0/__init__.py +0 -0
  126. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/api/v0/test_serializers.py +0 -0
  127. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/api/v1/__init__.py +0 -0
  128. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/api/v1/test_serializers.py +0 -0
  129. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/api/v1/test_views.py +0 -0
  130. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/api/v1/views/__init__.py +0 -0
  131. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/api/v1/views/test_enterprise_admin.py +0 -0
  132. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/factories.py +0 -0
  133. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/mixins.py +0 -0
  134. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/test_clients.py +0 -0
  135. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/test_filters.py +0 -0
  136. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/test_models.py +0 -0
  137. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/test_utils.py +0 -0
  138. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/tests/test_views.py +0 -0
  139. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/urls.py +0 -0
  140. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data/utils.py +0 -0
  141. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/__init__.py +0 -0
  142. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/admin.py +0 -0
  143. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/apps.py +0 -0
  144. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/constants.py +0 -0
  145. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/migrations/0001_initial.py +0 -0
  146. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/migrations/0002_add_enterprise_data_feature_roles.py +0 -0
  147. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/migrations/0003_add_role_based_access_control_switch.py +0 -0
  148. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/migrations/0004_enterprisedataroleassignment_enterprise_id.py +0 -0
  149. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/migrations/0005_turn_on_role_based_access_control_switch.py +0 -0
  150. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/migrations/0006_remove_role_based_access_control_switch.py +0 -0
  151. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/migrations/0007_enterprisedataroleassignment_applies_to_all_contexts.py +0 -0
  152. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/migrations/__init__.py +0 -0
  153. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/models.py +0 -0
  154. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/rules.py +0 -0
  155. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/tests/__init__.py +0 -0
  156. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/tests/factories.py +0 -0
  157. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_data_roles/tests/test_models.py +0 -0
  158. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/__init__.py +0 -0
  159. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/clients/__init__.py +0 -0
  160. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/clients/enterprise.py +0 -0
  161. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/clients/s3.py +0 -0
  162. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/clients/snowflake.py +0 -0
  163. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/clients/vertica.py +0 -0
  164. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/delivery_method.py +0 -0
  165. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/external_resource_link_report.py +0 -0
  166. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/fixtures/__init__.py +0 -0
  167. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/fixtures/enterprise_customer_reporting.json +0 -0
  168. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/reporter.py +0 -0
  169. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/send_enterprise_reports.py +0 -0
  170. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/tests/__init__.py +0 -0
  171. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/tests/test_clients.py +0 -0
  172. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/tests/test_delivery_method.py +0 -0
  173. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/tests/test_enterprise_client.py +0 -0
  174. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/tests/test_external_link_report.py +0 -0
  175. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/tests/test_reporter.py +0 -0
  176. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/tests/test_send_enterprise_reports.py +0 -0
  177. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/tests/test_utils.py +0 -0
  178. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/tests/test_vertica_client.py +0 -0
  179. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/tests/utils.py +0 -0
  180. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/enterprise_reporting/utils.py +0 -0
  181. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/requirements/base.in +0 -0
  182. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/requirements/base.txt +0 -0
  183. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/requirements/ci.txt +0 -0
  184. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/requirements/common_constraints.txt +0 -0
  185. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/requirements/constraints.txt +0 -0
  186. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/requirements/dev.txt +0 -0
  187. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/requirements/django.txt +0 -0
  188. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/requirements/pip.txt +0 -0
  189. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/requirements/pip_tools.txt +0 -0
  190. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/requirements/quality.txt +0 -0
  191. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/requirements/reporting.in +0 -0
  192. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/requirements/test-master.txt +0 -0
  193. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/requirements/test-reporting.txt +0 -0
  194. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/requirements/test.txt +0 -0
  195. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/setup.cfg +0 -0
  196. {edx_enterprise_data-9.2.1 → edx_enterprise_data-9.3.0}/setup.py +0 -0
@@ -16,6 +16,14 @@ Unreleased
16
16
 
17
17
  =========================
18
18
 
19
+ [9.3.0] - 2024-09-30
20
+ ---------------------
21
+ * refactor: Further improvement in SQL queries for leaderboard API endpoint.
22
+
23
+ [9.2.2] - 2024-09-27
24
+ ---------------------
25
+ * fix: remove the cache logging on EnterpriseLearnerEnrollmentViewSet.
26
+
19
27
  [9.2.1] - 2024-09-25
20
28
  ---------------------
21
29
  * fix: Added temporary cache logging on EnterpriseLearnerEnrollmentViewSet.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edx-enterprise-data
3
- Version: 9.2.1
3
+ Version: 9.3.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: 9.2.1
3
+ Version: 9.3.0
4
4
  Summary: Enterprise Reporting
5
5
  Home-page: https://github.com/openedx/edx-enterprise-data
6
6
  Author: edX
@@ -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__ = "9.2.1"
5
+ __version__ = "9.3.0"
@@ -111,59 +111,62 @@ class FactEngagementAdminDashQueries:
111
111
  """
112
112
 
113
113
  @staticmethod
114
- def get_all_leaderboard_data_query():
114
+ def get_engagement_data_for_leaderboard_query():
115
115
  """
116
- Get the query to fetch the leaderboard data.
116
+ Get the query to fetch the engagement data for leaderboard.
117
117
 
118
- Query should fetch the leaderboard data for the enterprise customer to show in the data table.
118
+ Query should fetch the engagement data for like learning time, session length of
119
+ the enterprise learners to show in the leaderboard.
119
120
 
120
121
  Returns:
121
- (str): Query to fetch the leaderboard data.
122
+ (str): Query to fetch the engagement data for leaderboard.
122
123
  """
123
124
  return """
124
- WITH Engagement AS (
125
- SELECT
126
- email,
127
- ROUND(SUM(learning_time_seconds) / 3600, 1) as learning_time_hours,
128
- SUM(is_engaged) as session_count,
129
- CASE
130
- WHEN SUM(is_engaged) = 0 THEN 0.0
131
- ELSE ROUND(SUM(learning_time_seconds) / 3600 / SUM(is_engaged), 1)
132
- END AS average_session_length
133
- FROM fact_enrollment_engagement_day_admin_dash
134
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
135
- (activity_date BETWEEN %(start_date)s AND %(end_date)s) AND
136
- is_engaged = 1
137
- GROUP BY email
138
- ),
139
- Completions AS (
140
- SELECT email, count(course_key) as course_completion_count
141
- FROM fact_enrollment_admin_dash
142
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
143
- (passed_date BETWEEN %(start_date)s AND %(end_date)s) AND
144
- has_passed = 1
145
- GROUP BY email
146
- )
147
125
  SELECT
148
- Engagement.email,
149
- Engagement.learning_time_hours,
150
- Engagement.session_count,
151
- Engagement.average_session_length,
152
- Completions.course_completion_count
153
- FROM Engagement
154
- LEFT JOIN Completions
155
- ON Engagement.email = Completions.email
156
- ORDER BY
157
- Engagement.learning_time_hours DESC,
158
- Engagement.session_count DESC,
159
- Completions.course_completion_count DESC
126
+ email,
127
+ ROUND(SUM(learning_time_seconds) / 3600, 1) as learning_time_hours,
128
+ SUM(is_engaged) as session_count,
129
+ CASE
130
+ WHEN SUM(is_engaged) = 0 THEN 0.0
131
+ ELSE ROUND(SUM(learning_time_seconds) / 3600 / SUM(is_engaged), 1)
132
+ END AS average_session_length
133
+ FROM fact_enrollment_engagement_day_admin_dash
134
+ WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
135
+ (activity_date BETWEEN %(start_date)s AND %(end_date)s) AND
136
+ is_engaged = 1
137
+ GROUP BY email
138
+ ORDER BY learning_time_hours DESC
160
139
  LIMIT %(limit)s OFFSET %(offset)s;
161
140
  """
162
141
 
142
+ @staticmethod
143
+ def get_completion_data_for_leaderboard_query(email_list: list):
144
+ """
145
+ Get the query to fetch the completions data for leaderboard.
146
+
147
+ Query should fetch the completion data for like course completion count of
148
+ the enterprise learners to show in the leaderboard.
149
+
150
+ Arguments:
151
+ email_list (str): List of emails to filter the completions data.
152
+
153
+ Returns:
154
+ (list<str>): Query to fetch the completions data for leaderboard.
155
+ """
156
+ return f"""
157
+ SELECT email, count(course_key) as course_completion_count
158
+ FROM fact_enrollment_admin_dash
159
+ WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
160
+ (passed_date BETWEEN %(start_date)s AND %(end_date)s) AND
161
+ has_passed = 1 AND
162
+ email IN {str(tuple(email_list))}
163
+ GROUP BY email;
164
+ """
165
+
163
166
  @staticmethod
164
167
  def get_leaderboard_data_count_query():
165
168
  """
166
- Get the query to fetch the leaderboard row count.
169
+ Get the query to fetch the leaderboard row count and null email counter.
167
170
 
168
171
  Query should fetch the count of rows for the leaderboard data for the enterprise customer.
169
172
 
@@ -171,26 +174,13 @@ class FactEngagementAdminDashQueries:
171
174
  (str): Query to fetch the leaderboard row count.
172
175
  """
173
176
  return """
174
- WITH Engagement AS (
175
- SELECT
176
- email
177
- FROM fact_enrollment_engagement_day_admin_dash
178
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
179
- (activity_date BETWEEN %(start_date)s AND %(end_date)s) AND
180
- is_engaged = 1
181
- GROUP BY email
182
- ),
183
- Completions AS (
184
- SELECT email, count(course_key) as course_completion_count
185
- FROM fact_enrollment_admin_dash
186
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
187
- (passed_date BETWEEN %(start_date)s AND %(end_date)s) AND
188
- has_passed = 1
189
- GROUP BY email
190
- )
191
177
  SELECT
192
- count(*)
193
- FROM Engagement
194
- LEFT JOIN Completions
195
- ON Engagement.email = Completions.email
178
+ COUNT(*) OVER () AS record_count,
179
+ sum(case when email is null then 1 else 0 end) null_count
180
+ FROM fact_enrollment_engagement_day_admin_dash
181
+ WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
182
+ (activity_date BETWEEN %(start_date)s AND %(end_date)s) AND
183
+ is_engaged = 1
184
+ GROUP BY email
185
+ LIMIT 1;
196
186
  """
@@ -153,11 +153,14 @@ class FactEngagementAdminDashTable(BaseTable):
153
153
  as_dict=True,
154
154
  )
155
155
 
156
- def get_all_leaderboard_data(
156
+ def _get_engagement_data_for_leaderboard(
157
157
  self, enterprise_customer_uuid: UUID, start_date: date, end_date: date, limit: int, offset: int
158
158
  ):
159
159
  """
160
- Get the leaderboard data for the given enterprise customer.
160
+ Get the engagement data for leaderboard.
161
+
162
+ The engagement data would include fields like learning time, session length of
163
+ the enterprise learners to show in the leaderboard.
161
164
 
162
165
  Arguments:
163
166
  enterprise_customer_uuid (UUID): The UUID of the enterprise customer.
@@ -167,10 +170,10 @@ class FactEngagementAdminDashTable(BaseTable):
167
170
  offset (int): The number of records to skip.
168
171
 
169
172
  Returns:
170
- list[dict]: The leaderboard data.
173
+ list[dict]: The engagement data for leaderboard.
171
174
  """
172
175
  return run_query(
173
- query=self.queries.get_all_leaderboard_data_query(),
176
+ query=self.queries.get_engagement_data_for_leaderboard_query(),
174
177
  params={
175
178
  'enterprise_customer_uuid': enterprise_customer_uuid,
176
179
  'start_date': start_date,
@@ -181,6 +184,70 @@ class FactEngagementAdminDashTable(BaseTable):
181
184
  as_dict=True,
182
185
  )
183
186
 
187
+ def _get_completion_data_for_leaderboard_query(
188
+ self, enterprise_customer_uuid: UUID, start_date: date, end_date: date, email_list: list
189
+ ):
190
+ """
191
+ Get the completion data for leaderboard.
192
+
193
+ The completion data would include fields like course completion count of enterprise learners of the
194
+ given enterprise customer.
195
+
196
+ Arguments:
197
+ enterprise_customer_uuid (UUID): The UUID of the enterprise customer.
198
+ start_date (date): The start date.
199
+ end_date (date): The end date.
200
+ email_list (list<str>): List of emails of the enterprise learners.
201
+
202
+ Returns:
203
+ list[dict]: The engagement data for leaderboard.
204
+ """
205
+ return run_query(
206
+ query=self.queries.get_completion_data_for_leaderboard_query(email_list),
207
+ params={
208
+ 'enterprise_customer_uuid': enterprise_customer_uuid,
209
+ 'start_date': start_date,
210
+ 'end_date': end_date,
211
+ },
212
+ as_dict=True,
213
+ )
214
+
215
+ def get_all_leaderboard_data(
216
+ self, enterprise_customer_uuid: UUID, start_date: date, end_date: date, limit: int, offset: int
217
+ ):
218
+ """
219
+ Get the leaderboard data for the given enterprise customer.
220
+
221
+ Arguments:
222
+ enterprise_customer_uuid (UUID): The UUID of the enterprise customer.
223
+ start_date (date): The start date.
224
+ end_date (date): The end date.
225
+ limit (int): The maximum number of records to return.
226
+ offset (int): The number of records to skip.
227
+
228
+ Returns:
229
+ list[dict]: The leaderboard data.
230
+ """
231
+ engagement_data = self._get_engagement_data_for_leaderboard(
232
+ enterprise_customer_uuid=enterprise_customer_uuid,
233
+ start_date=start_date,
234
+ end_date=end_date,
235
+ limit=limit,
236
+ offset=offset,
237
+ )
238
+ engagement_data_dict = {engagement['email']: engagement for engagement in engagement_data}
239
+ completion_data = self._get_completion_data_for_leaderboard_query(
240
+ enterprise_customer_uuid=enterprise_customer_uuid,
241
+ start_date=start_date,
242
+ end_date=end_date,
243
+ email_list=list(engagement_data_dict.keys()),
244
+ )
245
+ for completion in completion_data:
246
+ email = completion['email']
247
+ engagement_data_dict[email]['course_completion_count'] = completion['course_completion_count']
248
+
249
+ return list(engagement_data_dict.values())
250
+
184
251
  def get_leaderboard_data_count(self, enterprise_customer_uuid: UUID, start_date: date, end_date: date):
185
252
  """
186
253
  Get the total number of leaderboard records for the given enterprise customer.
@@ -6,7 +6,6 @@ from datetime import date, timedelta
6
6
  from logging import getLogger
7
7
  from uuid import UUID
8
8
 
9
- from edx_django_utils.cache import TieredCache
10
9
  from rest_framework import filters, viewsets
11
10
  from rest_framework.decorators import action
12
11
  from rest_framework.response import Response
@@ -25,7 +24,7 @@ from enterprise_data.filters import AuditEnrollmentsFilterBackend, AuditUsersEnr
25
24
  from enterprise_data.models import EnterpriseLearner, EnterpriseLearnerEnrollment
26
25
  from enterprise_data.paginators import EnterpriseEnrollmentsPagination
27
26
  from enterprise_data.renderers import EnrollmentsCSVRenderer
28
- from enterprise_data.utils import get_cache_key, subtract_one_month
27
+ from enterprise_data.utils import subtract_one_month
29
28
 
30
29
  from .base import EnterpriseViewSetMixin
31
30
 
@@ -83,23 +82,7 @@ class EnterpriseLearnerEnrollmentViewSet(EnterpriseViewSetMixin, viewsets.ReadOn
83
82
 
84
83
  enterprise_customer_uuid = self.kwargs['enterprise_id']
85
84
 
86
- # TODO: Created a ticket ENT0-9531 to fix the cache issue
87
- # Temporary logging to test cache issue
88
- try:
89
- LOGGER.info("Trying to get Learner Enrollment data from Cache")
90
- cache_key = get_cache_key(
91
- resource='enterprise-learner',
92
- enterprise_customer=enterprise_customer_uuid,
93
- )
94
- cached_response = TieredCache.get_cached_response(cache_key)
95
- if cached_response.is_found:
96
- LOGGER.info("Learner Enrollment data found in Cache for Enterprise: [%s]", enterprise_customer_uuid)
97
- else:
98
- LOGGER.info("Learner Enrollment data not found in Cache for Enterprise: [%s]", enterprise_customer_uuid)
99
- TieredCache.set_all_tiers(cache_key, 'dummy_enrollments', DEFAULT_LEARNER_CACHE_TIMEOUT)
100
- LOGGER.info("Cache set for Enterprise: [%s] whose key is: [%s]", enterprise_customer_uuid, cache_key)
101
- except Exception as e:
102
- LOGGER.error("Memcached connection test failed: %s", e)
85
+ # TODO: Created a ticket ENT0-9531 to add the cache on this viewset
103
86
 
104
87
  enrollments = EnterpriseLearnerEnrollment.objects.filter(enterprise_customer_uuid=enterprise_customer_uuid)
105
88
  enrollments = self.apply_filters(enrollments)