edx-enterprise-data 9.7.1__tar.gz → 10.2.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 (200) hide show
  1. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/CHANGELOG.rst +19 -0
  2. {edx_enterprise_data-9.7.1/edx_enterprise_data.egg-info → edx_enterprise_data-10.2.0}/PKG-INFO +3 -4
  3. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0/edx_enterprise_data.egg-info}/PKG-INFO +3 -4
  4. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/edx_enterprise_data.egg-info/requires.txt +2 -2
  5. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/__init__.py +1 -1
  6. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py +49 -0
  7. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py +71 -6
  8. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/analytics_leaderboard.py +6 -4
  9. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/pre_warm_analytics_cache.py +5 -4
  10. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/tests/test_pre_warm_analytics_cache.py +14 -5
  11. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/utils.py +17 -0
  12. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/rules.py +1 -1
  13. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/base.in +2 -2
  14. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/base.txt +24 -26
  15. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/ci.txt +5 -5
  16. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/common_constraints.txt +4 -0
  17. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/constraints.txt +0 -15
  18. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/dev.txt +37 -45
  19. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/pip.txt +5 -3
  20. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/pip_tools.txt +2 -2
  21. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/quality.txt +39 -47
  22. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/test-master.txt +26 -28
  23. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/test-reporting.txt +16 -16
  24. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/test.txt +26 -28
  25. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/setup.py +0 -1
  26. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/LICENSE +0 -0
  27. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/MANIFEST.in +0 -0
  28. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/README.md +0 -0
  29. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/edx_enterprise_data.egg-info/SOURCES.txt +0 -0
  30. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/edx_enterprise_data.egg-info/dependency_links.txt +0 -0
  31. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/edx_enterprise_data.egg-info/not-zip-safe +0 -0
  32. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/edx_enterprise_data.egg-info/top_level.txt +0 -0
  33. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/__init__.py +0 -0
  34. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/constants.py +0 -0
  35. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/data_loaders.py +0 -0
  36. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/__init__.py +0 -0
  37. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/queries/__init__.py +0 -0
  38. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py +0 -0
  39. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/queries/skills_daily_rollup_admin_dash.py +0 -0
  40. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/tables/__init__.py +0 -0
  41. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/tables/base.py +0 -0
  42. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py +0 -0
  43. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/tables/skills_daily_rollup_admin_dash.py +0 -0
  44. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/admin_analytics/database/utils.py +0 -0
  45. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/__init__.py +0 -0
  46. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/urls.py +0 -0
  47. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v0/__init__.py +0 -0
  48. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v0/serializers.py +0 -0
  49. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v0/urls.py +0 -0
  50. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v0/views.py +0 -0
  51. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/__init__.py +0 -0
  52. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/serializers.py +0 -0
  53. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/urls.py +0 -0
  54. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/__init__.py +0 -0
  55. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/analytics_completions.py +0 -0
  56. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/analytics_engagements.py +0 -0
  57. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/analytics_enrollments.py +0 -0
  58. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/base.py +0 -0
  59. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/enterprise_admin.py +0 -0
  60. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/enterprise_learner.py +0 -0
  61. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/api/v1/views/enterprise_offers.py +0 -0
  62. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/apps.py +0 -0
  63. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/cache/__init__.py +0 -0
  64. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/cache/decorators.py +0 -0
  65. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/clients.py +0 -0
  66. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/constants.py +0 -0
  67. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/filters.py +0 -0
  68. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/fixtures/enterprise_enrollment.json +0 -0
  69. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/fixtures/enterprise_user.json +0 -0
  70. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/__init__.py +0 -0
  71. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/__init__.py +0 -0
  72. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/create_dummy_data.py +0 -0
  73. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/create_dummy_data_lpr_v1.py +0 -0
  74. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/create_enterprise_enrollment.py +0 -0
  75. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/create_enterprise_learner_enrollment_lpr_v1.py +0 -0
  76. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py +0 -0
  77. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/create_enterprise_offer.py +0 -0
  78. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/create_enterprise_user.py +0 -0
  79. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/tests/__init__.py +0 -0
  80. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/tests/test_create_dummy_data_lpr_v1.py +0 -0
  81. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/tests/test_create_enterprise_enrollment.py +0 -0
  82. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py +0 -0
  83. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py +0 -0
  84. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/management/commands/tests/test_create_enterprise_user.py +0 -0
  85. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0001_initial.py +0 -0
  86. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0002_auto_20180430_1358.py +0 -0
  87. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0003_auto_20180501_0603.py +0 -0
  88. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0004_auto_20180501_0928.py +0 -0
  89. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0004_auto_20180508_1652.py +0 -0
  90. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0005_auto_20180524_2204.py +0 -0
  91. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0006_auto_20180612_0336.py +0 -0
  92. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0007_auto_20180612_0534.py +0 -0
  93. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0008_auto_20180614_0108.py +0 -0
  94. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0009_auto_20180628_1152.py +0 -0
  95. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0010_enterpriseenrollment_created.py +0 -0
  96. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0011_enterpriseuser.py +0 -0
  97. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0012_auto_20180831_1930.py +0 -0
  98. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0013_auto_20180831_1931.py +0 -0
  99. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0014_enterpriseuser_created.py +0 -0
  100. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0015_auto_20180907_1757.py +0 -0
  101. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0016_auto_20180924_2138.py +0 -0
  102. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0017_enterpriseenrollment_unenrollment_timestamp.py +0 -0
  103. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0018_enterprisedatafeaturerole_enterprisedataroleassignment.py +0 -0
  104. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0019_add_enterprise_data_feature_roles.py +0 -0
  105. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0020_add_role_based_access_control_switch.py +0 -0
  106. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0021_auto_20190329_1241.py +0 -0
  107. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0022_remove_role_based_access_control_switch.py +0 -0
  108. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0023_enterpriselearner_enterpriselearnerenrollment.py +0 -0
  109. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0024_auto_20210602_1811.py +0 -0
  110. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0025_auto_20210703_1854.py +0 -0
  111. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0026_auto_20210916_0414.py +0 -0
  112. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0027_enterpriselearnerenrollment_total_learning_time_seconds.py +0 -0
  113. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0028_enterpriselearnerenrollment_offer_id.py +0 -0
  114. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0029_enterpriseoffer.py +0 -0
  115. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0030_auto_20230609_1353.py +0 -0
  116. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0031_auto_20230615_0705.py +0 -0
  117. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0032_auto_20230704_0818.py +0 -0
  118. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0033_enterpriseadminlearnerprogress_enterpriseadminsummarizeinsights.py +0 -0
  119. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0034_auto_20230907_0834.py +0 -0
  120. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0035_auto_20230907_1154.py +0 -0
  121. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0036_enterprisesubsidybudget_subsidy_access_policy_display_name.py +0 -0
  122. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0037_alter_enterpriseenrollment_consent_granted.py +0 -0
  123. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0038_enterpriseoffer_export_timestamp.py +0 -0
  124. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0039_auto_20240212_1403.py +0 -0
  125. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0040_auto_20240718_0536_squashed_0043_alter_enterpriselearnerenrollment_enterprise_enrollment_id.py +0 -0
  126. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/0044_enterpriseexecedlcmoduleperformance.py +0 -0
  127. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/migrations/__init__.py +0 -0
  128. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/models.py +0 -0
  129. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/paginators.py +0 -0
  130. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/renderers.py +0 -0
  131. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/settings/__init__.py +0 -0
  132. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/settings/test.py +0 -0
  133. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/signals.py +0 -0
  134. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/__init__.py +0 -0
  135. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/__init__.py +0 -0
  136. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/mock_analytics_data.py +0 -0
  137. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/mock_enrollments.py +0 -0
  138. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/test_analytics_engagements.py +0 -0
  139. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/test_analytics_enrollments.py +0 -0
  140. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/test_analytics_leaderboard.py +0 -0
  141. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/test_data_loaders.py +0 -0
  142. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/admin_analytics/test_enterprise_completions.py +0 -0
  143. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/__init__.py +0 -0
  144. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/v0/__init__.py +0 -0
  145. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/v0/test_serializers.py +0 -0
  146. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/v1/__init__.py +0 -0
  147. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/v1/test_serializers.py +0 -0
  148. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/v1/test_views.py +0 -0
  149. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/v1/views/__init__.py +0 -0
  150. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/api/v1/views/test_enterprise_admin.py +0 -0
  151. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/factories.py +0 -0
  152. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/mixins.py +0 -0
  153. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/test_clients.py +0 -0
  154. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/test_filters.py +0 -0
  155. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/test_models.py +0 -0
  156. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/test_utils.py +0 -0
  157. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/tests/test_views.py +0 -0
  158. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data/urls.py +0 -0
  159. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/__init__.py +0 -0
  160. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/admin.py +0 -0
  161. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/apps.py +0 -0
  162. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/constants.py +0 -0
  163. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/0001_initial.py +0 -0
  164. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/0002_add_enterprise_data_feature_roles.py +0 -0
  165. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/0003_add_role_based_access_control_switch.py +0 -0
  166. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/0004_enterprisedataroleassignment_enterprise_id.py +0 -0
  167. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/0005_turn_on_role_based_access_control_switch.py +0 -0
  168. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/0006_remove_role_based_access_control_switch.py +0 -0
  169. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/0007_enterprisedataroleassignment_applies_to_all_contexts.py +0 -0
  170. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/migrations/__init__.py +0 -0
  171. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/models.py +0 -0
  172. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/tests/__init__.py +0 -0
  173. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/tests/factories.py +0 -0
  174. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_data_roles/tests/test_models.py +0 -0
  175. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/__init__.py +0 -0
  176. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/clients/__init__.py +0 -0
  177. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/clients/enterprise.py +0 -0
  178. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/clients/s3.py +0 -0
  179. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/clients/snowflake.py +0 -0
  180. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/clients/vertica.py +0 -0
  181. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/delivery_method.py +0 -0
  182. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/external_resource_link_report.py +0 -0
  183. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/fixtures/__init__.py +0 -0
  184. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/fixtures/enterprise_customer_reporting.json +0 -0
  185. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/reporter.py +0 -0
  186. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/send_enterprise_reports.py +0 -0
  187. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/__init__.py +0 -0
  188. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_clients.py +0 -0
  189. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_delivery_method.py +0 -0
  190. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_enterprise_client.py +0 -0
  191. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_external_link_report.py +0 -0
  192. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_reporter.py +0 -0
  193. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_send_enterprise_reports.py +0 -0
  194. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_utils.py +0 -0
  195. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/test_vertica_client.py +0 -0
  196. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/tests/utils.py +0 -0
  197. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/enterprise_reporting/utils.py +0 -0
  198. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/django.txt +0 -0
  199. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/requirements/reporting.in +0 -0
  200. {edx_enterprise_data-9.7.1 → edx_enterprise_data-10.2.0}/setup.cfg +0 -0
@@ -16,6 +16,25 @@ Unreleased
16
16
 
17
17
  =========================
18
18
 
19
+ [10.2.0] - 2024-11-12
20
+ ---------------------
21
+ * Fixed null email issue for leaderboard.
22
+
23
+
24
+ [10.1.0] - 2024-10-29
25
+ ---------------------
26
+ * Added management command to pre-warm analytics data.
27
+
28
+ [10.0.1] - 2024-10-25
29
+ ---------------------
30
+ * Same as ``10.0.0``
31
+ * Bumping the version so a new tag can be created in the GitHub
32
+
33
+ [10.0.0] - 2024-10-25
34
+ ---------------------
35
+ * feat!: Python 3.12 Upgrade
36
+ * Dropped support for ``Python<3.12``
37
+
19
38
  [9.7.0] - 2024-10-23
20
39
  ---------------------
21
40
  * feat: Add API to fetch enterprise budgets information
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edx-enterprise-data
3
- Version: 9.7.1
3
+ Version: 10.2.0
4
4
  Summary: Enterprise Reporting
5
5
  Home-page: https://github.com/openedx/edx-enterprise-data
6
6
  Author: edX
@@ -9,7 +9,6 @@ License: AGPL 3.0
9
9
  Classifier: Framework :: Django
10
10
  Classifier: Framework :: Django :: 4.2
11
11
  Classifier: Programming Language :: Python :: 3
12
- Classifier: Programming Language :: Python :: 3.8
13
12
  Classifier: Programming Language :: Python :: 3.12
14
13
  License-File: LICENSE
15
14
  Requires-Dist: Django
@@ -24,8 +23,8 @@ Requires-Dist: edx-rbac
24
23
  Requires-Dist: edx-rest-api-client
25
24
  Requires-Dist: factory_boy
26
25
  Requires-Dist: mysql-connector-python
27
- Requires-Dist: numpy<=1.24.4
28
- Requires-Dist: pandas<=2.0.3
26
+ Requires-Dist: numpy
27
+ Requires-Dist: pandas
29
28
  Requires-Dist: requests
30
29
  Requires-Dist: rules
31
30
  Provides-Extra: reporting
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edx-enterprise-data
3
- Version: 9.7.1
3
+ Version: 10.2.0
4
4
  Summary: Enterprise Reporting
5
5
  Home-page: https://github.com/openedx/edx-enterprise-data
6
6
  Author: edX
@@ -9,7 +9,6 @@ License: AGPL 3.0
9
9
  Classifier: Framework :: Django
10
10
  Classifier: Framework :: Django :: 4.2
11
11
  Classifier: Programming Language :: Python :: 3
12
- Classifier: Programming Language :: Python :: 3.8
13
12
  Classifier: Programming Language :: Python :: 3.12
14
13
  License-File: LICENSE
15
14
  Requires-Dist: Django
@@ -24,8 +23,8 @@ Requires-Dist: edx-rbac
24
23
  Requires-Dist: edx-rest-api-client
25
24
  Requires-Dist: factory_boy
26
25
  Requires-Dist: mysql-connector-python
27
- Requires-Dist: numpy<=1.24.4
28
- Requires-Dist: pandas<=2.0.3
26
+ Requires-Dist: numpy
27
+ Requires-Dist: pandas
29
28
  Requires-Dist: requests
30
29
  Requires-Dist: rules
31
30
  Provides-Extra: reporting
@@ -10,8 +10,8 @@ edx-rbac
10
10
  edx-rest-api-client
11
11
  factory_boy
12
12
  mysql-connector-python
13
- numpy<=1.24.4
14
- pandas<=2.0.3
13
+ numpy
14
+ pandas
15
15
  requests
16
16
  rules
17
17
 
@@ -2,4 +2,4 @@
2
2
  Enterprise data api application. This Django app exposes API endpoints used by enterprises.
3
3
  """
4
4
 
5
- __version__ = "9.7.1"
5
+ __version__ = "10.2.0"
@@ -163,6 +163,55 @@ class FactEngagementAdminDashQueries:
163
163
  GROUP BY email;
164
164
  """
165
165
 
166
+ @staticmethod
167
+ def get_engagement_data_for_leaderboard_null_email_only_query():
168
+ """
169
+ Get the query to fetch the engagement data for leaderboard for NULL emails only.
170
+
171
+ Query should fetch the engagement data for like learning time, session length of
172
+ the enterprise learners to show in the leaderboard.
173
+
174
+ Returns:
175
+ (str): Query to fetch the engagement data for leaderboard.
176
+ """
177
+ return """
178
+ SELECT
179
+ email,
180
+ ROUND(SUM(learning_time_seconds) / 3600, 1) as learning_time_hours,
181
+ SUM(is_engaged) as session_count,
182
+ CASE
183
+ WHEN SUM(is_engaged) = 0 THEN 0.0
184
+ ELSE ROUND(SUM(learning_time_seconds) / 3600 / SUM(is_engaged), 1)
185
+ END AS average_session_length
186
+ FROM fact_enrollment_engagement_day_admin_dash
187
+ WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
188
+ (activity_date BETWEEN %(start_date)s AND %(end_date)s) AND
189
+ is_engaged = 1 AND
190
+ email is NULL
191
+ GROUP BY email;
192
+ """
193
+
194
+ @staticmethod
195
+ def get_completion_data_for_leaderboard_null_email_only_query():
196
+ """
197
+ Get the query to fetch the completions data for leaderboard for NULL emails.
198
+
199
+ Query should fetch the completion data for like course completion count of
200
+ the enterprise learners to show in the leaderboard.
201
+
202
+ Returns:
203
+ (list<str>): Query to fetch the completions data for leaderboard.
204
+ """
205
+ return """
206
+ SELECT email, count(course_key) as course_completion_count
207
+ FROM fact_enrollment_admin_dash
208
+ WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
209
+ (passed_date BETWEEN %(start_date)s AND %(end_date)s) AND
210
+ has_passed = 1 AND
211
+ email is NULL
212
+ GROUP BY email;
213
+ """
214
+
166
215
  @staticmethod
167
216
  def get_leaderboard_data_count_query():
168
217
  """
@@ -5,6 +5,7 @@ from datetime import date
5
5
  from uuid import UUID
6
6
 
7
7
  from enterprise_data.cache.decorators import cache_it
8
+ from enterprise_data.utils import find_first
8
9
 
9
10
  from ..queries import FactEngagementAdminDashQueries
10
11
  from ..utils import run_query
@@ -168,7 +169,14 @@ class FactEngagementAdminDashTable(BaseTable):
168
169
 
169
170
  @cache_it()
170
171
  def _get_engagement_data_for_leaderboard(
171
- self, enterprise_customer_uuid: UUID, start_date: date, end_date: date, limit: int, offset: int
172
+ self,
173
+ enterprise_customer_uuid: UUID,
174
+ start_date: date,
175
+ end_date: date,
176
+ limit: int,
177
+ offset: int,
178
+ include_null_email: bool,
179
+
172
180
  ):
173
181
  """
174
182
  Get the engagement data for leaderboard.
@@ -182,11 +190,12 @@ class FactEngagementAdminDashTable(BaseTable):
182
190
  end_date (date): The end date.
183
191
  limit (int): The maximum number of records to return.
184
192
  offset (int): The number of records to skip.
193
+ include_null_email (bool): If True, only fetch data for NULL emails.
185
194
 
186
195
  Returns:
187
196
  list[dict]: The engagement data for leaderboard.
188
197
  """
189
- return run_query(
198
+ engagements = run_query(
190
199
  query=self.queries.get_engagement_data_for_leaderboard_query(),
191
200
  params={
192
201
  'enterprise_customer_uuid': enterprise_customer_uuid,
@@ -198,9 +207,27 @@ class FactEngagementAdminDashTable(BaseTable):
198
207
  as_dict=True,
199
208
  )
200
209
 
210
+ if include_null_email:
211
+ engagement_for_null_email = run_query(
212
+ query=self.queries.get_engagement_data_for_leaderboard_null_email_only_query(),
213
+ params={
214
+ 'enterprise_customer_uuid': enterprise_customer_uuid,
215
+ 'start_date': start_date,
216
+ 'end_date': end_date,
217
+ },
218
+ as_dict=True,
219
+ )
220
+ engagements += engagement_for_null_email
221
+ return engagements
222
+
201
223
  @cache_it()
202
224
  def _get_completion_data_for_leaderboard_query(
203
- self, enterprise_customer_uuid: UUID, start_date: date, end_date: date, email_list: list
225
+ self,
226
+ enterprise_customer_uuid: UUID,
227
+ start_date: date,
228
+ end_date: date,
229
+ email_list: list,
230
+ include_null_email: bool,
204
231
  ):
205
232
  """
206
233
  Get the completion data for leaderboard.
@@ -213,11 +240,13 @@ class FactEngagementAdminDashTable(BaseTable):
213
240
  start_date (date): The start date.
214
241
  end_date (date): The end date.
215
242
  email_list (list<str>): List of emails of the enterprise learners.
243
+ include_null_email (bool): If True, only fetch data for NULL emails.
216
244
 
217
245
  Returns:
218
246
  list[dict]: The engagement data for leaderboard.
219
247
  """
220
- return run_query(
248
+
249
+ completions = run_query(
221
250
  query=self.queries.get_completion_data_for_leaderboard_query(email_list),
222
251
  params={
223
252
  'enterprise_customer_uuid': enterprise_customer_uuid,
@@ -227,8 +256,28 @@ class FactEngagementAdminDashTable(BaseTable):
227
256
  as_dict=True,
228
257
  )
229
258
 
259
+ if include_null_email:
260
+ completions_for_null_email = run_query(
261
+ query=self.queries.get_completion_data_for_leaderboard_null_email_only_query(),
262
+ params={
263
+ 'enterprise_customer_uuid': enterprise_customer_uuid,
264
+ 'start_date': start_date,
265
+ 'end_date': end_date,
266
+ },
267
+ as_dict=True,
268
+ )
269
+ completions += completions_for_null_email
270
+
271
+ return completions
272
+
230
273
  def get_all_leaderboard_data(
231
- self, enterprise_customer_uuid: UUID, start_date: date, end_date: date, limit: int, offset: int
274
+ self,
275
+ enterprise_customer_uuid: UUID,
276
+ start_date: date,
277
+ end_date: date,
278
+ limit: int,
279
+ offset: int,
280
+ total_count: int,
232
281
  ):
233
282
  """
234
283
  Get the leaderboard data for the given enterprise customer.
@@ -239,32 +288,48 @@ class FactEngagementAdminDashTable(BaseTable):
239
288
  end_date (date): The end date.
240
289
  limit (int): The maximum number of records to return.
241
290
  offset (int): The number of records to skip.
291
+ total_count (int): The total number of records.
242
292
 
243
293
  Returns:
244
294
  list[dict]: The leaderboard data.
245
295
  """
296
+ include_null_email = False
297
+ # If this is the last or only page, we need to include NULL emails record.
298
+ if total_count <= offset + limit:
299
+ include_null_email = True
300
+
246
301
  engagement_data = self._get_engagement_data_for_leaderboard(
247
302
  enterprise_customer_uuid=enterprise_customer_uuid,
248
303
  start_date=start_date,
249
304
  end_date=end_date,
250
305
  limit=limit,
251
306
  offset=offset,
307
+ include_null_email=include_null_email,
252
308
  )
253
309
  # If there is no data, no need to proceed.
254
310
  if not engagement_data:
255
311
  return []
256
312
 
257
- engagement_data_dict = {engagement['email']: engagement for engagement in engagement_data}
313
+ engagement_data_dict = {
314
+ engagement['email']: engagement for engagement in engagement_data if engagement['email']
315
+ }
258
316
  completion_data = self._get_completion_data_for_leaderboard_query(
259
317
  enterprise_customer_uuid=enterprise_customer_uuid,
260
318
  start_date=start_date,
261
319
  end_date=end_date,
262
320
  email_list=list(engagement_data_dict.keys()),
321
+ include_null_email=include_null_email,
263
322
  )
264
323
  for completion in completion_data:
265
324
  email = completion['email']
266
325
  engagement_data_dict[email]['course_completion_count'] = completion['course_completion_count']
267
326
 
327
+ if include_null_email:
328
+ engagement_data_dict['None'] = find_first(engagement_data, lambda x: x['email'] is None) or {}
329
+ completion = find_first(completion_data, lambda x: x['email'] is None) or \
330
+ {'course_completion_count': 'Unknown'}
331
+ engagement_data_dict['None']['course_completion_count'] = completion['course_completion_count']
332
+
268
333
  return list(engagement_data_dict.values())
269
334
 
270
335
  @cache_it()
@@ -49,17 +49,18 @@ class AdvanceAnalyticsLeaderboardView(AnalyticsPaginationMixin, ViewSet):
49
49
  end_date = serializer.data.get('end_date', date.today())
50
50
  page = serializer.data.get('page', 1)
51
51
  page_size = serializer.data.get('page_size', 100)
52
- leaderboard = FactEngagementAdminDashTable().get_all_leaderboard_data(
52
+ total_count = FactEngagementAdminDashTable().get_leaderboard_data_count(
53
53
  enterprise_customer_uuid=enterprise_uuid,
54
54
  start_date=start_date,
55
55
  end_date=end_date,
56
- limit=page_size,
57
- offset=(page - 1) * page_size,
58
56
  )
59
- total_count = FactEngagementAdminDashTable().get_leaderboard_data_count(
57
+ leaderboard = FactEngagementAdminDashTable().get_all_leaderboard_data(
60
58
  enterprise_customer_uuid=enterprise_uuid,
61
59
  start_date=start_date,
62
60
  end_date=end_date,
61
+ limit=page_size,
62
+ offset=(page - 1) * page_size,
63
+ total_count=total_count,
63
64
  )
64
65
  response_type = request.query_params.get('response_type', ResponseType.JSON.value)
65
66
 
@@ -102,6 +103,7 @@ class AdvanceAnalyticsLeaderboardView(AnalyticsPaginationMixin, ViewSet):
102
103
  end_date=end_date,
103
104
  limit=page_size,
104
105
  offset=offset,
106
+ total_count=total_count,
105
107
  )
106
108
  yield from leaderboard
107
109
  offset += page_size
@@ -161,17 +161,18 @@ class Command(BaseCommand):
161
161
  start_date=start_date,
162
162
  end_date=end_date,
163
163
  )
164
- enterprise_engagement_table.get_all_leaderboard_data(
164
+ total_count = enterprise_engagement_table.get_leaderboard_data_count(
165
165
  enterprise_customer_uuid=enterprise_customer_uuid,
166
166
  start_date=start_date,
167
167
  end_date=end_date,
168
- limit=page_size,
169
- offset=0,
170
168
  )
171
- enterprise_engagement_table.get_leaderboard_data_count(
169
+ enterprise_engagement_table.get_all_leaderboard_data(
172
170
  enterprise_customer_uuid=enterprise_customer_uuid,
173
171
  start_date=start_date,
174
172
  end_date=end_date,
173
+ limit=page_size,
174
+ offset=0,
175
+ total_count=total_count,
175
176
  )
176
177
 
177
178
  @staticmethod
@@ -30,9 +30,18 @@ class Test(TestCase):
30
30
  get_enrollment_date_range_patcher.start()
31
31
  self.addCleanup(get_enrollment_date_range_patcher.stop)
32
32
 
33
- @patch('enterprise_data.admin_analytics.database.tables.fact_engagement_admin_dash.run_query', MagicMock())
34
- @patch('enterprise_data.admin_analytics.database.tables.fact_enrollment_admin_dash.run_query', MagicMock())
35
- @patch('enterprise_data.admin_analytics.database.tables.skills_daily_rollup_admin_dash.run_query', MagicMock())
33
+ @patch(
34
+ 'enterprise_data.admin_analytics.database.tables.fact_engagement_admin_dash.run_query',
35
+ MagicMock(return_value=[])
36
+ )
37
+ @patch(
38
+ 'enterprise_data.admin_analytics.database.tables.fact_enrollment_admin_dash.run_query',
39
+ MagicMock(return_value=[])
40
+ )
41
+ @patch(
42
+ 'enterprise_data.admin_analytics.database.tables.skills_daily_rollup_admin_dash.run_query',
43
+ MagicMock(return_value=[])
44
+ )
36
45
  @patch('enterprise_data.api.v1.views.analytics_enrollments.FactEnrollmentAdminDashTable.get_top_enterprises')
37
46
  @patch('enterprise_data.cache.decorators.cache.set')
38
47
  @patch('enterprise_data.cache.decorators.cache.get')
@@ -47,5 +56,5 @@ class Test(TestCase):
47
56
 
48
57
  call_command('pre_warm_analytics_cache')
49
58
 
50
- assert mock_get_cache.call_count == 24
51
- assert mock_set_cache.call_count == 24
59
+ assert mock_get_cache.call_count == 23
60
+ assert mock_set_cache.call_count == 23
@@ -97,3 +97,20 @@ def primary_subject_truncate(x):
97
97
  return x
98
98
  else:
99
99
  return "other"
100
+
101
+
102
+ def find_first(iterable, condition):
103
+ """
104
+ Find the first item in an iterable that satisfies the condition.
105
+
106
+ Arguments:
107
+ iterable (iterable): The iterable to search.
108
+ condition (function): The condition to satisfy.
109
+
110
+ Returns:
111
+ The first item that satisfies the condition, or None if no item satisfies the condition.
112
+ """
113
+ try:
114
+ return next(item for item in iterable if condition(item))
115
+ except StopIteration:
116
+ return None
@@ -57,5 +57,5 @@ def request_user_has_explicit_access(*args, **kwargs):
57
57
 
58
58
  rules.add_perm(
59
59
  'can_access_enterprise',
60
- request_user_has_implicit_access | request_user_has_explicit_access # pylint: disable=unsupported-binary-operation
60
+ request_user_has_implicit_access | request_user_has_explicit_access
61
61
  )
@@ -13,6 +13,6 @@ django-model-utils
13
13
  edx-rbac
14
14
  rules
15
15
  factory_boy
16
- numpy<=1.24.4
17
- pandas<=2.0.3
16
+ numpy
17
+ pandas
18
18
  mysql-connector-python
@@ -1,5 +1,5 @@
1
1
  #
2
- # This file is autogenerated by pip-compile with Python 3.11
2
+ # This file is autogenerated by pip-compile with Python 3.12
3
3
  # by the following command:
4
4
  #
5
5
  # make upgrade
@@ -10,15 +10,15 @@ asgiref==3.8.1
10
10
  # via django
11
11
  asn1crypto==1.5.1
12
12
  # via snowflake-connector-python
13
- awscli==1.34.29
13
+ awscli==1.35.20
14
14
  # via -r requirements/reporting.in
15
15
  bcrypt==4.2.0
16
16
  # via paramiko
17
17
  billiard==4.2.1
18
18
  # via celery
19
- boto3==1.35.29
19
+ boto3==1.35.54
20
20
  # via -r requirements/reporting.in
21
- botocore==1.35.29
21
+ botocore==1.35.54
22
22
  # via
23
23
  # awscli
24
24
  # boto3
@@ -35,7 +35,7 @@ cffi==1.17.1
35
35
  # cryptography
36
36
  # pynacl
37
37
  # snowflake-connector-python
38
- charset-normalizer==3.3.2
38
+ charset-normalizer==3.4.0
39
39
  # via
40
40
  # requests
41
41
  # snowflake-connector-python
@@ -54,7 +54,7 @@ click-repl==0.3.0
54
54
  # via celery
55
55
  colorama==0.4.6
56
56
  # via awscli
57
- cryptography==43.0.1
57
+ cryptography==43.0.3
58
58
  # via
59
59
  # -r requirements/reporting.in
60
60
  # django-fernet-fields-v2
@@ -100,18 +100,18 @@ djangorestframework==3.15.2
100
100
  # edx-drf-extensions
101
101
  djangorestframework-csv==3.0.2
102
102
  # via -r requirements/base.in
103
- dnspython==2.6.1
103
+ dnspython==2.7.0
104
104
  # via pymongo
105
105
  docutils==0.16
106
106
  # via awscli
107
107
  drf-jwt==1.19.2
108
108
  # via edx-drf-extensions
109
- edx-django-utils==5.15.0
109
+ edx-django-utils==7.0.0
110
110
  # via
111
111
  # -r requirements/base.in
112
112
  # edx-drf-extensions
113
113
  # edx-rest-api-client
114
- edx-drf-extensions==10.4.0
114
+ edx-drf-extensions==10.5.0
115
115
  # via
116
116
  # -r requirements/base.in
117
117
  # edx-rbac
@@ -125,7 +125,7 @@ edx-rest-api-client==6.0.0
125
125
  # via -r requirements/base.in
126
126
  factory-boy==3.3.1
127
127
  # via -r requirements/base.in
128
- faker==30.0.0
128
+ faker==30.8.2
129
129
  # via factory-boy
130
130
  filelock==3.16.1
131
131
  # via snowflake-connector-python
@@ -143,24 +143,21 @@ kombu==5.4.2
143
143
  # via celery
144
144
  monotonic==1.6
145
145
  # via py2neo
146
- mysql-connector-python==9.0.0
146
+ mysql-connector-python==9.1.0
147
147
  # via -r requirements/base.in
148
- newrelic==10.0.0
148
+ newrelic==10.2.0
149
149
  # via edx-django-utils
150
- numpy==1.24.4
150
+ numpy==2.1.3
151
151
  # via
152
- # -c requirements/constraints.txt
153
152
  # -r requirements/base.in
154
153
  # pandas
155
154
  packaging==24.1
156
155
  # via
157
156
  # py2neo
158
157
  # snowflake-connector-python
159
- pandas==2.0.3
160
- # via
161
- # -c requirements/constraints.txt
162
- # -r requirements/base.in
163
- pansi==2020.7.3
158
+ pandas==2.2.3
159
+ # via -r requirements/base.in
160
+ pansi==2024.11.0
164
161
  # via py2neo
165
162
  paramiko==3.5.0
166
163
  # via -r requirements/reporting.in
@@ -168,11 +165,13 @@ pbr==6.1.0
168
165
  # via stevedore
169
166
  pgpy==0.6.0
170
167
  # via -r requirements/reporting.in
168
+ pillow==11.0.0
169
+ # via pansi
171
170
  platformdirs==4.3.6
172
171
  # via snowflake-connector-python
173
172
  prompt-toolkit==3.0.48
174
173
  # via click-repl
175
- psutil==6.0.0
174
+ psutil==6.1.0
176
175
  # via edx-django-utils
177
176
  py2neo @ https://github.com/overhangio/py2neo/releases/download/2021.2.3/py2neo-2021.2.3.tar.gz
178
177
  # via -r requirements/reporting.in
@@ -192,7 +191,7 @@ pyjwt[crypto]==2.9.0
192
191
  # snowflake-connector-python
193
192
  pyminizip==0.2.6
194
193
  # via -r requirements/reporting.in
195
- pymongo==4.9.1
194
+ pymongo==4.10.1
196
195
  # via edx-opaque-keys
197
196
  pynacl==1.5.0
198
197
  # via
@@ -224,7 +223,7 @@ rsa==4.7.2
224
223
  # via awscli
225
224
  rules==3.5
226
225
  # via -r requirements/base.in
227
- s3transfer==0.10.2
226
+ s3transfer==0.10.3
228
227
  # via
229
228
  # awscli
230
229
  # boto3
@@ -234,11 +233,10 @@ six==1.16.0
234
233
  # via
235
234
  # edx-rbac
236
235
  # interchange
237
- # pansi
238
236
  # py2neo
239
237
  # python-dateutil
240
238
  # vertica-python
241
- snowflake-connector-python==3.12.2
239
+ snowflake-connector-python==3.12.3
242
240
  # via -r requirements/reporting.in
243
241
  sortedcontainers==2.4.0
244
242
  # via snowflake-connector-python
@@ -253,6 +251,7 @@ tomlkit==0.13.2
253
251
  typing-extensions==4.12.2
254
252
  # via
255
253
  # edx-opaque-keys
254
+ # faker
256
255
  # snowflake-connector-python
257
256
  tzdata==2024.2
258
257
  # via
@@ -261,9 +260,8 @@ tzdata==2024.2
261
260
  # pandas
262
261
  unicodecsv==0.14.1
263
262
  # via -r requirements/reporting.in
264
- urllib3==1.26.20
263
+ urllib3==2.2.3
265
264
  # via
266
- # -c requirements/constraints.txt
267
265
  # botocore
268
266
  # py2neo
269
267
  # requests
@@ -1,5 +1,5 @@
1
1
  #
2
- # This file is autogenerated by pip-compile with Python 3.11
2
+ # This file is autogenerated by pip-compile with Python 3.12
3
3
  # by the following command:
4
4
  #
5
5
  # make upgrade
@@ -10,9 +10,9 @@ chardet==5.2.0
10
10
  # via tox
11
11
  colorama==0.4.6
12
12
  # via tox
13
- coverage==7.6.1
13
+ coverage==7.6.4
14
14
  # via -r requirements/ci.in
15
- distlib==0.3.8
15
+ distlib==0.3.9
16
16
  # via virtualenv
17
17
  filelock==3.16.1
18
18
  # via
@@ -30,7 +30,7 @@ pluggy==1.5.0
30
30
  # via tox
31
31
  pyproject-api==1.8.0
32
32
  # via tox
33
- tox==4.20.0
33
+ tox==4.23.2
34
34
  # via -r requirements/ci.in
35
- virtualenv==20.26.6
35
+ virtualenv==20.27.1
36
36
  # via tox
@@ -30,3 +30,7 @@ django-simple-history==3.0.0
30
30
  # This can be unpinned once https://github.com/openedx/edx-platform/issues/34586
31
31
  # has been resolved and edx-platform is running with pymongo>=4.4.0
32
32
  event-tracking<2.4.1
33
+
34
+ # Cause: https://github.com/openedx/edx-lint/issues/458
35
+ # This can be unpinned once https://github.com/openedx/edx-lint/issues/459 has been resolved.
36
+ pip<24.3
@@ -12,18 +12,3 @@
12
12
 
13
13
  # Common constraints for edx repos
14
14
  -c common_constraints.txt
15
-
16
- # Needed for Django 4.2 + Python 3.12 compatibility
17
- backports.zoneinfo; python_version<"3.9"
18
-
19
- # botocore 1.34.145 depends on urllib3<1.27 and >=1.25.4; python_version < "3.10"
20
- urllib3<2.0.0
21
-
22
- numpy<=1.24.4
23
- pandas<=2.0.3
24
-
25
- # this is the last supported version for python 3.8.x
26
- astroid<=3.2.4
27
-
28
- # upgrade to 5.4.0 causes issues with `importlib`
29
- edx-lint<=5.3.7