edx-enterprise-data 10.16.11__tar.gz → 10.17.1__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 (217) hide show
  1. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/CHANGELOG.rst +8 -0
  2. {edx_enterprise_data-10.16.11/edx_enterprise_data.egg-info → edx_enterprise_data-10.17.1}/PKG-INFO +1 -3
  3. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1/edx_enterprise_data.egg-info}/PKG-INFO +1 -3
  4. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/edx_enterprise_data.egg-info/requires.txt +0 -2
  5. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/__init__.py +1 -1
  6. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/constants.py +6 -0
  7. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/data_loaders.py +2 -3
  8. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/queries/skills_daily_rollup_admin_dash.py +46 -40
  9. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/tables/skills_daily_rollup_admin_dash.py +101 -59
  10. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v1/serializers.py +7 -1
  11. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v1/views/enterprise_admin.py +11 -3
  12. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/admin_analytics/test_data_loaders.py +3 -1
  13. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/requirements/base.in +0 -2
  14. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/requirements/base.txt +14 -24
  15. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/requirements/ci.txt +4 -4
  16. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/requirements/common_constraints.txt +0 -12
  17. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/requirements/dev.txt +22 -38
  18. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/requirements/pip.txt +2 -2
  19. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/requirements/pip_tools.txt +1 -1
  20. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/requirements/quality.txt +24 -40
  21. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/requirements/test-master.txt +17 -27
  22. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/requirements/test-reporting.txt +25 -25
  23. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/requirements/test.txt +17 -27
  24. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/LICENSE +0 -0
  25. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/MANIFEST.in +0 -0
  26. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/README.md +0 -0
  27. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/edx_enterprise_data.egg-info/SOURCES.txt +0 -0
  28. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/edx_enterprise_data.egg-info/dependency_links.txt +0 -0
  29. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/edx_enterprise_data.egg-info/not-zip-safe +0 -0
  30. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/edx_enterprise_data.egg-info/top_level.txt +0 -0
  31. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/__init__.py +0 -0
  32. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/__init__.py +0 -0
  33. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/filters/__init__.py +0 -0
  34. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/filters/base.py +0 -0
  35. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/filters/fact_completion_admin_dash.py +0 -0
  36. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/filters/fact_engagement_admin_dash.py +0 -0
  37. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/filters/fact_enrollment_admin_dash.py +0 -0
  38. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/filters/mixins.py +0 -0
  39. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/queries/__init__.py +0 -0
  40. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py +0 -0
  41. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py +0 -0
  42. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/query_filters/__init__.py +0 -0
  43. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/query_filters/base.py +0 -0
  44. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/query_filters/between.py +0 -0
  45. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/query_filters/equal.py +0 -0
  46. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/query_filters/in_.py +0 -0
  47. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/tables/__init__.py +0 -0
  48. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/tables/base.py +0 -0
  49. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py +0 -0
  50. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py +0 -0
  51. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/admin_analytics/database/utils.py +0 -0
  52. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/__init__.py +0 -0
  53. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/urls.py +0 -0
  54. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v0/__init__.py +0 -0
  55. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v0/serializers.py +0 -0
  56. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v0/urls.py +0 -0
  57. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v0/views.py +0 -0
  58. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v1/__init__.py +0 -0
  59. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v1/urls.py +0 -0
  60. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v1/views/__init__.py +0 -0
  61. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v1/views/analytics_completions.py +0 -0
  62. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v1/views/analytics_engagements.py +0 -0
  63. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v1/views/analytics_enrollments.py +0 -0
  64. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v1/views/analytics_leaderboard.py +0 -0
  65. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v1/views/base.py +0 -0
  66. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v1/views/enterprise_learner.py +0 -0
  67. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/api/v1/views/enterprise_offers.py +0 -0
  68. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/apps.py +0 -0
  69. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/cache/__init__.py +0 -0
  70. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/cache/decorators.py +0 -0
  71. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/clients.py +0 -0
  72. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/constants.py +0 -0
  73. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/exceptions.py +0 -0
  74. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/filters.py +0 -0
  75. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/fixtures/enterprise_enrollment.json +0 -0
  76. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/fixtures/enterprise_user.json +0 -0
  77. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/__init__.py +0 -0
  78. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/__init__.py +0 -0
  79. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/create_dummy_data.py +0 -0
  80. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/create_dummy_data_lpr_v1.py +0 -0
  81. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/create_enterprise_enrollment.py +0 -0
  82. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/create_enterprise_learner_enrollment_lpr_v1.py +0 -0
  83. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py +0 -0
  84. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/create_enterprise_offer.py +0 -0
  85. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/create_enterprise_user.py +0 -0
  86. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/pre_warm_analytics_cache.py +0 -0
  87. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/tests/__init__.py +0 -0
  88. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/tests/test_create_dummy_data_lpr_v1.py +0 -0
  89. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/tests/test_create_enterprise_enrollment.py +0 -0
  90. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py +0 -0
  91. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py +0 -0
  92. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/tests/test_create_enterprise_user.py +0 -0
  93. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/management/commands/tests/test_pre_warm_analytics_cache.py +0 -0
  94. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0001_initial.py +0 -0
  95. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0002_auto_20180430_1358.py +0 -0
  96. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0003_auto_20180501_0603.py +0 -0
  97. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0004_auto_20180501_0928.py +0 -0
  98. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0004_auto_20180508_1652.py +0 -0
  99. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0005_auto_20180524_2204.py +0 -0
  100. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0006_auto_20180612_0336.py +0 -0
  101. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0007_auto_20180612_0534.py +0 -0
  102. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0008_auto_20180614_0108.py +0 -0
  103. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0009_auto_20180628_1152.py +0 -0
  104. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0010_enterpriseenrollment_created.py +0 -0
  105. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0011_enterpriseuser.py +0 -0
  106. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0012_auto_20180831_1930.py +0 -0
  107. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0013_auto_20180831_1931.py +0 -0
  108. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0014_enterpriseuser_created.py +0 -0
  109. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0015_auto_20180907_1757.py +0 -0
  110. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0016_auto_20180924_2138.py +0 -0
  111. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0017_enterpriseenrollment_unenrollment_timestamp.py +0 -0
  112. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0018_enterprisedatafeaturerole_enterprisedataroleassignment.py +0 -0
  113. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0019_add_enterprise_data_feature_roles.py +0 -0
  114. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0020_add_role_based_access_control_switch.py +0 -0
  115. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0021_auto_20190329_1241.py +0 -0
  116. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0022_remove_role_based_access_control_switch.py +0 -0
  117. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0023_enterpriselearner_enterpriselearnerenrollment.py +0 -0
  118. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0024_auto_20210602_1811.py +0 -0
  119. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0025_auto_20210703_1854.py +0 -0
  120. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0026_auto_20210916_0414.py +0 -0
  121. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0027_enterpriselearnerenrollment_total_learning_time_seconds.py +0 -0
  122. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0028_enterpriselearnerenrollment_offer_id.py +0 -0
  123. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0029_enterpriseoffer.py +0 -0
  124. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0030_auto_20230609_1353.py +0 -0
  125. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0031_auto_20230615_0705.py +0 -0
  126. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0032_auto_20230704_0818.py +0 -0
  127. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0033_enterpriseadminlearnerprogress_enterpriseadminsummarizeinsights.py +0 -0
  128. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0034_auto_20230907_0834.py +0 -0
  129. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0035_auto_20230907_1154.py +0 -0
  130. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0036_enterprisesubsidybudget_subsidy_access_policy_display_name.py +0 -0
  131. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0037_alter_enterpriseenrollment_consent_granted.py +0 -0
  132. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0038_enterpriseoffer_export_timestamp.py +0 -0
  133. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0039_auto_20240212_1403.py +0 -0
  134. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0040_auto_20240718_0536_squashed_0043_alter_enterpriselearnerenrollment_enterprise_enrollment_id.py +0 -0
  135. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0044_enterpriseexecedlcmoduleperformance.py +0 -0
  136. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0045_alter_enterpriseexecedlcmoduleperformance_options_and_more.py +0 -0
  137. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0046_enterprisegroupmembership.py +0 -0
  138. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0047_enterpriseexecedlcmoduleperformance_avg_after_lo_score_and_more.py +0 -0
  139. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/0048_alter_enterpriseexecedlcmoduleperformance_avg_after_lo_score_and_more.py +0 -0
  140. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/migrations/__init__.py +0 -0
  141. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/models.py +0 -0
  142. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/paginators.py +0 -0
  143. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/renderers.py +0 -0
  144. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/settings/__init__.py +0 -0
  145. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/settings/test.py +0 -0
  146. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/signals.py +0 -0
  147. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/__init__.py +0 -0
  148. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/admin_analytics/__init__.py +0 -0
  149. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/admin_analytics/mock_analytics_data.py +0 -0
  150. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/admin_analytics/mock_enrollments.py +0 -0
  151. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/admin_analytics/test_analytics_engagements.py +0 -0
  152. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/admin_analytics/test_analytics_enrollments.py +0 -0
  153. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/admin_analytics/test_analytics_leaderboard.py +0 -0
  154. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/admin_analytics/test_enterprise_completions.py +0 -0
  155. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/api/__init__.py +0 -0
  156. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/api/v0/__init__.py +0 -0
  157. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/api/v0/test_serializers.py +0 -0
  158. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/api/v1/__init__.py +0 -0
  159. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/api/v1/test_serializers.py +0 -0
  160. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/api/v1/test_views.py +0 -0
  161. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/api/v1/views/__init__.py +0 -0
  162. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/api/v1/views/test_enterprise_admin.py +0 -0
  163. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/factories.py +0 -0
  164. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/mixins.py +0 -0
  165. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/test_clients.py +0 -0
  166. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/test_filters.py +0 -0
  167. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/test_models.py +0 -0
  168. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/test_utils.py +0 -0
  169. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/tests/test_views.py +0 -0
  170. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/urls.py +0 -0
  171. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data/utils.py +0 -0
  172. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/__init__.py +0 -0
  173. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/admin.py +0 -0
  174. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/apps.py +0 -0
  175. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/constants.py +0 -0
  176. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/migrations/0001_initial.py +0 -0
  177. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/migrations/0002_add_enterprise_data_feature_roles.py +0 -0
  178. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/migrations/0003_add_role_based_access_control_switch.py +0 -0
  179. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/migrations/0004_enterprisedataroleassignment_enterprise_id.py +0 -0
  180. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/migrations/0005_turn_on_role_based_access_control_switch.py +0 -0
  181. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/migrations/0006_remove_role_based_access_control_switch.py +0 -0
  182. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/migrations/0007_enterprisedataroleassignment_applies_to_all_contexts.py +0 -0
  183. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/migrations/__init__.py +0 -0
  184. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/models.py +0 -0
  185. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/rules.py +0 -0
  186. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/tests/__init__.py +0 -0
  187. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/tests/factories.py +0 -0
  188. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_data_roles/tests/test_models.py +0 -0
  189. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/__init__.py +0 -0
  190. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/clients/__init__.py +0 -0
  191. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/clients/enterprise.py +0 -0
  192. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/clients/s3.py +0 -0
  193. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/clients/snowflake.py +0 -0
  194. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/clients/vertica.py +0 -0
  195. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/constants.py +0 -0
  196. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/delivery_method.py +0 -0
  197. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/external_resource_link_report.py +0 -0
  198. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/fixtures/__init__.py +0 -0
  199. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/fixtures/enterprise_customer_reporting.json +0 -0
  200. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/reporter.py +0 -0
  201. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/send_enterprise_reports.py +0 -0
  202. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/tests/__init__.py +0 -0
  203. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/tests/test_clients.py +0 -0
  204. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/tests/test_delivery_method.py +0 -0
  205. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/tests/test_enterprise_client.py +0 -0
  206. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/tests/test_external_link_report.py +0 -0
  207. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/tests/test_reporter.py +0 -0
  208. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/tests/test_send_enterprise_reports.py +0 -0
  209. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/tests/test_utils.py +0 -0
  210. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/tests/test_vertica_client.py +0 -0
  211. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/tests/utils.py +0 -0
  212. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/enterprise_reporting/utils.py +0 -0
  213. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/requirements/constraints.txt +0 -0
  214. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/requirements/django.txt +0 -0
  215. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/requirements/reporting.in +0 -0
  216. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/setup.cfg +0 -0
  217. {edx_enterprise_data-10.16.11 → edx_enterprise_data-10.17.1}/setup.py +0 -0
@@ -16,6 +16,14 @@ Unreleased
16
16
 
17
17
  =========================
18
18
 
19
+ [10.17.1] - 2025-07-11
20
+ ---------------------
21
+ * feat: add course type filtering for skills api
22
+
23
+ [10.17.0] - 2025-07-07
24
+ ---------------------
25
+ * chore: remove pandas and numpy from requirements
26
+
19
27
  [10.16.11] - 2025-07-03
20
28
  ---------------------
21
29
  * chore: upgrade package version
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edx-enterprise-data
3
- Version: 10.16.11
3
+ Version: 10.17.1
4
4
  Summary: Enterprise Reporting
5
5
  Home-page: https://github.com/openedx/edx-enterprise-data
6
6
  Author: edX
@@ -24,8 +24,6 @@ Requires-Dist: edx-rbac
24
24
  Requires-Dist: edx-rest-api-client
25
25
  Requires-Dist: factory_boy
26
26
  Requires-Dist: mysql-connector-python
27
- Requires-Dist: numpy
28
- Requires-Dist: pandas
29
27
  Requires-Dist: requests
30
28
  Requires-Dist: rules
31
29
  Provides-Extra: reporting
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edx-enterprise-data
3
- Version: 10.16.11
3
+ Version: 10.17.1
4
4
  Summary: Enterprise Reporting
5
5
  Home-page: https://github.com/openedx/edx-enterprise-data
6
6
  Author: edX
@@ -24,8 +24,6 @@ Requires-Dist: edx-rbac
24
24
  Requires-Dist: edx-rest-api-client
25
25
  Requires-Dist: factory_boy
26
26
  Requires-Dist: mysql-connector-python
27
- Requires-Dist: numpy
28
- Requires-Dist: pandas
29
27
  Requires-Dist: requests
30
28
  Requires-Dist: rules
31
29
  Provides-Extra: reporting
@@ -10,8 +10,6 @@ edx-rbac
10
10
  edx-rest-api-client
11
11
  factory_boy
12
12
  mysql-connector-python
13
- numpy
14
- pandas
15
13
  requests
16
14
  rules
17
15
 
@@ -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.16.11"
5
+ __version__ = "10.17.1"
@@ -5,6 +5,12 @@ Constants for admin analytics app.
5
5
  from enum import Enum
6
6
 
7
7
 
8
+ class CourseType(Enum):
9
+ """Course type choices"""
10
+ OCM = "OCM"
11
+ EXECUTIVE_EDUCATION = "Executive Education"
12
+
13
+
8
14
  class ResponseType(Enum):
9
15
  """Response type choices"""
10
16
  JSON = 'json'
@@ -1,10 +1,9 @@
1
1
  """
2
2
  Utility functions for fetching data from the database.
3
3
  """
4
+ from datetime import timezone
4
5
  from logging import getLogger
5
6
 
6
- import pandas
7
-
8
7
  from enterprise_data.admin_analytics.database import run_query
9
8
 
10
9
  LOGGER = getLogger(__name__)
@@ -21,4 +20,4 @@ def fetch_max_enrollment_datetime():
21
20
  results = run_query(query)
22
21
  if not results:
23
22
  return None
24
- return pandas.to_datetime(results[0][0], utc=True)
23
+ return results[0][0].astimezone(timezone.utc)
@@ -9,11 +9,11 @@ class SkillsDailyRollupAdminDashQueries:
9
9
  Queries related to the skills_daily_rollup_admin_dash table.
10
10
  """
11
11
  @staticmethod
12
- def get_top_skills():
12
+ def get_top_skills(query_filters: QueryFilters):
13
13
  """
14
14
  Get the query to fetch the top skills for an enterprise customer.
15
15
  """
16
- return """
16
+ return f"""
17
17
  SELECT
18
18
  skill_name,
19
19
  skill_type,
@@ -22,8 +22,7 @@ class SkillsDailyRollupAdminDashQueries:
22
22
  FROM
23
23
  skills_daily_rollup_admin_dash
24
24
  WHERE
25
- enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
26
- date BETWEEN %(start_date)s AND %(end_date)s
25
+ {query_filters.to_sql()}
27
26
  GROUP BY
28
27
  skill_name, skill_type
29
28
  ORDER BY
@@ -31,21 +30,27 @@ class SkillsDailyRollupAdminDashQueries:
31
30
  """
32
31
 
33
32
  @staticmethod
34
- def get_top_skills_by_enrollment():
33
+ def get_top_skills_by_enrollment(query_filters: QueryFilters):
35
34
  """
36
35
  Get the query to fetch the top skills by enrollment for an enterprise customer.
37
36
  """
38
- return """
39
- WITH TopSkills AS (
40
- -- Get top 10 skills by total enrollments
37
+ return f"""
38
+ WITH FilteredData AS (
41
39
  SELECT
42
40
  skill_name,
43
- SUM(enrolls) AS total_enrollment_count
41
+ primary_subject_name,
42
+ enrolls
44
43
  FROM
45
44
  skills_daily_rollup_admin_dash
46
45
  WHERE
47
- enterprise_customer_uuid=%(enterprise_customer_uuid)s
48
- AND date BETWEEN %(start_date)s AND %(end_date)s
46
+ {query_filters.to_sql()}
47
+ ),
48
+ TopSkills AS (
49
+ SELECT
50
+ skill_name,
51
+ SUM(enrolls) AS total_enrollment_count
52
+ FROM
53
+ FilteredData
49
54
  GROUP BY
50
55
  skill_name
51
56
  ORDER BY
@@ -53,44 +58,48 @@ class SkillsDailyRollupAdminDashQueries:
53
58
  LIMIT 10
54
59
  )
55
60
  SELECT
56
- sd.skill_name,
61
+ fd.skill_name,
57
62
  CASE
58
- WHEN sd.primary_subject_name IN (
63
+ WHEN fd.primary_subject_name IN (
59
64
  'business-management', 'computer-science',
60
65
  'data-analysis-statistics', 'engineering', 'communication'
61
- ) THEN sd.primary_subject_name
66
+ ) THEN fd.primary_subject_name
62
67
  ELSE 'other'
63
68
  END AS subject_name,
64
- SUM(sd.enrolls) AS count
69
+ SUM(fd.enrolls) AS count
65
70
  FROM
66
- skills_daily_rollup_admin_dash AS sd
71
+ FilteredData fd
67
72
  JOIN
68
- TopSkills AS ts ON sd.skill_name = ts.skill_name
69
- WHERE
70
- sd.enterprise_customer_uuid=%(enterprise_customer_uuid)s
71
- AND date BETWEEN %(start_date)s AND %(end_date)s
73
+ TopSkills ts ON fd.skill_name = ts.skill_name
72
74
  GROUP BY
73
- sd.skill_name, subject_name
75
+ fd.skill_name, subject_name
74
76
  ORDER BY
75
- total_enrollment_count DESC;
77
+ ts.total_enrollment_count DESC;
76
78
  """
77
79
 
78
80
  @staticmethod
79
- def get_top_skills_by_completion():
81
+ def get_top_skills_by_completion(query_filters: QueryFilters):
80
82
  """
81
83
  Get the query to fetch the top skills by completion for an enterprise customer.
82
84
  """
83
- return """
84
- WITH TopSkills AS (
85
- -- Get top 10 skills by total completions
85
+ return f"""
86
+ WITH FilteredData AS (
86
87
  SELECT
87
88
  skill_name,
88
- SUM(completions) AS total_completion_count
89
+ primary_subject_name,
90
+ completions
89
91
  FROM
90
92
  skills_daily_rollup_admin_dash
91
93
  WHERE
92
- enterprise_customer_uuid=%(enterprise_customer_uuid)s
93
- AND date BETWEEN %(start_date)s AND %(end_date)s
94
+ {query_filters.to_sql()}
95
+ ),
96
+ TopSkills AS (
97
+ -- Get top 10 skills by total completions
98
+ SELECT
99
+ skill_name,
100
+ SUM(completions) AS total_completion_count
101
+ FROM
102
+ FilteredData
94
103
  GROUP BY
95
104
  skill_name
96
105
  ORDER BY
@@ -98,26 +107,23 @@ class SkillsDailyRollupAdminDashQueries:
98
107
  LIMIT 10
99
108
  )
100
109
  SELECT
101
- sd.skill_name,
110
+ fd.skill_name,
102
111
  CASE
103
- WHEN sd.primary_subject_name IN (
112
+ WHEN fd.primary_subject_name IN (
104
113
  'business-management', 'computer-science',
105
114
  'data-analysis-statistics', 'engineering', 'communication'
106
- ) THEN sd.primary_subject_name
115
+ ) THEN fd.primary_subject_name
107
116
  ELSE 'other'
108
117
  END AS subject_name,
109
- SUM(sd.completions) AS count
118
+ SUM(fd.completions) AS count
110
119
  FROM
111
- skills_daily_rollup_admin_dash AS sd
120
+ FilteredData AS fd
112
121
  JOIN
113
- TopSkills AS ts ON sd.skill_name = ts.skill_name
114
- WHERE
115
- sd.enterprise_customer_uuid=%(enterprise_customer_uuid)s
116
- AND date BETWEEN %(start_date)s AND %(end_date)s
122
+ TopSkills AS ts ON fd.skill_name = ts.skill_name
117
123
  GROUP BY
118
- sd.skill_name, subject_name
124
+ fd.skill_name, subject_name
119
125
  ORDER BY
120
- total_completion_count DESC;
126
+ ts.total_completion_count DESC;
121
127
  """
122
128
 
123
129
  @staticmethod
@@ -22,8 +22,70 @@ class SkillsDailyRollupAdminDashTable(CommonFiltersMixin, BaseTable):
22
22
  """
23
23
  queries = SkillsDailyRollupAdminDashQueries()
24
24
 
25
+ def build_query_filters(
26
+ self,
27
+ enterprise_customer_uuid: UUID,
28
+ start_date: date,
29
+ end_date: date,
30
+ course_type: str = None,
31
+ course_key: str = None,
32
+ ):
33
+ """
34
+ Build query filters and parameters for enterprise analytics queries.
35
+
36
+ Arguments:
37
+ enterprise_customer_uuid (UUID): The UUID of the enterprise customer.
38
+ start_date (date): The start date for the query.
39
+ end_date (date): The end date for the query.
40
+ course_type (str, optional): The course type to filter by (e.g., 'OCM', 'Executive Education').
41
+ course_key (str, optional): The course key to filter by.
42
+
43
+ Returns:
44
+ tuple: A tuple containing:
45
+ - QueryFilters: The filters to apply to the query.
46
+ - dict: The parameters to use in the query.
47
+ """
48
+ optional_params = {}
49
+ default_params = {
50
+ 'enterprise_customer_uuid': enterprise_customer_uuid,
51
+ 'start_date': start_date,
52
+ 'end_date': end_date,
53
+ }
54
+
55
+ query_filters = QueryFilters([
56
+ self.enterprise_customer_uuid_filter('enterprise_customer_uuid'),
57
+ self.date_range_filter(
58
+ column='date',
59
+ start_date_params_key='start_date',
60
+ end_date_params_key='end_date',
61
+ ),
62
+ ])
63
+
64
+ if course_key:
65
+ query_filters.append(EqualQueryFilter(
66
+ column='course_key',
67
+ value_placeholder='course_key',
68
+ ))
69
+ optional_params['course_key'] = course_key
70
+
71
+ if course_type:
72
+ query_filters.append(EqualQueryFilter(
73
+ column='course_product_line',
74
+ value_placeholder='course_type',
75
+ ))
76
+ optional_params['course_type'] = course_type
77
+
78
+ params = {**default_params, **optional_params}
79
+ return query_filters, params
80
+
25
81
  @cache_it()
26
- def get_top_skills(self, enterprise_customer_uuid: UUID, start_date: date, end_date: date):
82
+ def get_top_skills(
83
+ self,
84
+ enterprise_customer_uuid: UUID,
85
+ start_date: date,
86
+ end_date: date,
87
+ course_type: str = None,
88
+ ):
27
89
  """
28
90
  Get the top skills for the given enterprise customer.
29
91
 
@@ -31,17 +93,20 @@ class SkillsDailyRollupAdminDashTable(CommonFiltersMixin, BaseTable):
31
93
  enterprise_customer_uuid (UUID): The UUID of the enterprise customer.
32
94
  start_date (date): The start date.
33
95
  end_date (date): The end date.
96
+ course_type (str): The course type (OCM or Executive Education) to filter by (optional).
34
97
 
35
98
  Returns:
36
99
  list<dict>: A list of dictionaries containing the skill_name, skill_type, enrolls and completions.
37
100
  """
101
+ query_filters, params = self.build_query_filters(
102
+ enterprise_customer_uuid=enterprise_customer_uuid,
103
+ start_date=start_date,
104
+ end_date=end_date,
105
+ course_type=course_type,
106
+ )
38
107
  return run_query(
39
- query=self.queries.get_top_skills(),
40
- params={
41
- 'enterprise_customer_uuid': enterprise_customer_uuid,
42
- 'start_date': start_date,
43
- 'end_date': end_date,
44
- },
108
+ query=self.queries.get_top_skills(query_filters),
109
+ params=params,
45
110
  as_dict=True,
46
111
  )
47
112
 
@@ -50,7 +115,8 @@ class SkillsDailyRollupAdminDashTable(CommonFiltersMixin, BaseTable):
50
115
  self,
51
116
  enterprise_customer_uuid: UUID,
52
117
  start_date: date,
53
- end_date: date
118
+ end_date: date,
119
+ course_type: str = None,
54
120
  ):
55
121
  """
56
122
  Get the top skills by enrollments for the given enterprise customer.
@@ -59,17 +125,20 @@ class SkillsDailyRollupAdminDashTable(CommonFiltersMixin, BaseTable):
59
125
  enterprise_customer_uuid (UUID): The UUID of the enterprise customer.
60
126
  start_date (date): The start date.
61
127
  end_date (date): The end date.
128
+ course_type (str): The course type (OCM or Executive Education) to filter by (optional).
62
129
 
63
130
  Returns:
64
131
  list<dict>: A list of dictionaries containing the skill_name, subject_name, count.
65
132
  """
133
+ query_filters, params = self.build_query_filters(
134
+ enterprise_customer_uuid=enterprise_customer_uuid,
135
+ start_date=start_date,
136
+ end_date=end_date,
137
+ course_type=course_type,
138
+ )
66
139
  return run_query(
67
- query=self.queries.get_top_skills_by_enrollment(),
68
- params={
69
- 'enterprise_customer_uuid': enterprise_customer_uuid,
70
- 'start_date': start_date,
71
- 'end_date': end_date,
72
- },
140
+ query=self.queries.get_top_skills_by_enrollment(query_filters),
141
+ params=params,
73
142
  as_dict=True,
74
143
  )
75
144
 
@@ -78,7 +147,8 @@ class SkillsDailyRollupAdminDashTable(CommonFiltersMixin, BaseTable):
78
147
  self,
79
148
  enterprise_customer_uuid: UUID,
80
149
  start_date: date,
81
- end_date: date
150
+ end_date: date,
151
+ course_type: str = None,
82
152
  ):
83
153
  """
84
154
  Get the top skills by completion for the given enterprise customer.
@@ -87,17 +157,20 @@ class SkillsDailyRollupAdminDashTable(CommonFiltersMixin, BaseTable):
87
157
  enterprise_customer_uuid (UUID): The UUID of the enterprise customer.
88
158
  start_date (date): The start date.
89
159
  end_date (date): The end date.
160
+ course_type (str): The course type (OCM or Executive Education) to filter by (optional).
90
161
 
91
162
  Returns:
92
163
  list<dict>: A list of dictionaries containing the skill_name, subject_name, count.
93
164
  """
165
+ query_filters, params = self.build_query_filters(
166
+ enterprise_customer_uuid=enterprise_customer_uuid,
167
+ start_date=start_date,
168
+ end_date=end_date,
169
+ course_type=course_type,
170
+ )
94
171
  return run_query(
95
- query=self.queries.get_top_skills_by_completion(),
96
- params={
97
- 'enterprise_customer_uuid': enterprise_customer_uuid,
98
- 'start_date': start_date,
99
- 'end_date': end_date,
100
- },
172
+ query=self.queries.get_top_skills_by_completion(query_filters),
173
+ params=params,
101
174
  as_dict=True,
102
175
  )
103
176
 
@@ -122,44 +195,13 @@ class SkillsDailyRollupAdminDashTable(CommonFiltersMixin, BaseTable):
122
195
  Returns:
123
196
  list<dict>: A list of dictionaries containing the skill_name, subject_name, count.
124
197
  """
125
- optional_params = {}
126
- course_key_filter = None
127
- course_type_filter = None
128
-
129
- default_params = {
130
- 'enterprise_customer_uuid': enterprise_customer_uuid,
131
- 'start_date': start_date,
132
- 'end_date': end_date,
133
- }
134
- query_filters = QueryFilters([
135
- self.enterprise_customer_uuid_filter('enterprise_customer_uuid'),
136
- self.date_range_filter(
137
- column='date',
138
- start_date_params_key='start_date',
139
- end_date_params_key='end_date',
140
- ),
141
- ])
142
-
143
- if course_key:
144
- course_key_filter = EqualQueryFilter(
145
- column='course_key',
146
- value_placeholder='course_key',
147
- )
148
-
149
- optional_params['course_key'] = course_key
150
- query_filters.append(course_key_filter)
151
-
152
- if course_type:
153
- course_type_filter = EqualQueryFilter(
154
- column='course_product_line',
155
- value_placeholder='course_type',
156
- )
157
-
158
- optional_params['course_type'] = course_type
159
- query_filters.append(course_type_filter)
160
-
161
- params = {**default_params, **optional_params}
162
-
198
+ query_filters, params = self.build_query_filters(
199
+ enterprise_customer_uuid=enterprise_customer_uuid,
200
+ start_date=start_date,
201
+ end_date=end_date,
202
+ course_key=course_key,
203
+ course_type=course_type,
204
+ )
163
205
  return run_query(
164
206
  query=self.queries.get_skills_by_learning_hours(query_filters),
165
207
  params=params,
@@ -5,7 +5,7 @@ from uuid import UUID
5
5
 
6
6
  from rest_framework import serializers
7
7
 
8
- from enterprise_data.admin_analytics.constants import ResponseType
8
+ from enterprise_data.admin_analytics.constants import CourseType, ResponseType
9
9
  from enterprise_data.cache.decorators import cache_it
10
10
  from enterprise_data.models import (
11
11
  EnterpriseAdminLearnerProgress,
@@ -343,6 +343,12 @@ class AdvanceAnalyticsQueryParamSerializer(serializers.Serializer): # pylint: d
343
343
  page = serializers.IntegerField(required=False, min_value=1)
344
344
  page_size = serializers.IntegerField(required=False, min_value=2)
345
345
  group_uuid = serializers.UUIDField(required=False)
346
+ course_type = serializers.ChoiceField(
347
+ choices=[course_type.value for course_type in CourseType],
348
+ required=False,
349
+ allow_blank=False,
350
+ allow_null=False,
351
+ )
346
352
 
347
353
  def validate(self, attrs):
348
354
  """
@@ -163,21 +163,29 @@ class EnterpriseAdminAnalyticsSkillsView(APIView):
163
163
  start_date, _ = FactEnrollmentAdminDashTable().get_enrollment_date_range(enterprise_id)
164
164
 
165
165
  end_date = serializer.data.get('end_date', date.today())
166
+ course_type = serializer.data.get('course_type')
166
167
 
167
168
  with timer('top_skills'):
168
- skills = SkillsDailyRollupAdminDashTable().get_top_skills(enterprise_id, start_date, end_date)
169
+ skills = SkillsDailyRollupAdminDashTable().get_top_skills(
170
+ enterprise_id,
171
+ start_date,
172
+ end_date,
173
+ course_type
174
+ )
169
175
 
170
176
  with timer('top_skills_by_enrollments'):
171
177
  top_skills_by_enrollments = SkillsDailyRollupAdminDashTable().get_top_skills_by_enrollment(
172
178
  enterprise_id,
173
179
  start_date,
174
- end_date
180
+ end_date,
181
+ course_type
175
182
  )
176
183
  with timer('top_skills_by_completions'):
177
184
  top_skills_by_completions = SkillsDailyRollupAdminDashTable().get_top_skills_by_completion(
178
185
  enterprise_id,
179
186
  start_date,
180
- end_date
187
+ end_date,
188
+ course_type
181
189
  )
182
190
 
183
191
  # TODO: Handle course_key and course_type when they are provided in the request.
@@ -1,6 +1,8 @@
1
1
  """
2
2
  Test the utility functions in the admin_analytics app for data loading operations.
3
3
  """
4
+ from datetime import datetime
5
+
4
6
  from mock import patch
5
7
 
6
8
  from django.test import TestCase
@@ -18,7 +20,7 @@ class TestDataLoaders(TestCase):
18
20
  Validate the fetch_max_enrollment_datetime function.
19
21
  """
20
22
  with patch('enterprise_data.admin_analytics.data_loaders.run_query') as mock_run_query:
21
- mock_run_query.return_value = [['2024-07-26']]
23
+ mock_run_query.return_value = [[datetime(2024, 7, 26, 21, 38, 48, 298000)]]
22
24
 
23
25
  max_enrollment_date = fetch_max_enrollment_datetime()
24
26
  self.assertEqual(max_enrollment_date.strftime('%Y-%m-%d'), '2024-07-26')
@@ -13,6 +13,4 @@ django-model-utils
13
13
  edx-rbac
14
14
  rules
15
15
  factory_boy
16
- numpy
17
- pandas
18
16
  mysql-connector-python