edx-enterprise-data 10.11.1__tar.gz → 10.13.0__tar.gz

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