edx-enterprise-data 9.7.7__tar.gz → 9.7.9__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 (202) hide show
  1. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/CHANGELOG.rst +9 -0
  2. {edx_enterprise_data-9.7.7/edx_enterprise_data.egg-info → edx_enterprise_data-9.7.9}/PKG-INFO +1 -1
  3. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9/edx_enterprise_data.egg-info}/PKG-INFO +1 -1
  4. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/edx_enterprise_data.egg-info/SOURCES.txt +1 -0
  5. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/__init__.py +1 -1
  6. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v1/serializers.py +14 -0
  7. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v1/urls.py +5 -0
  8. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v1/views/enterprise_admin.py +22 -0
  9. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v1/views/enterprise_learner.py +11 -2
  10. edx_enterprise_data-9.7.9/enterprise_data/migrations/0046_enterprisegroupmembership.py +36 -0
  11. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/models.py +44 -0
  12. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/test_models.py +27 -0
  13. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/test_utils.py +22 -0
  14. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/LICENSE +0 -0
  15. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/MANIFEST.in +0 -0
  16. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/README.md +0 -0
  17. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/edx_enterprise_data.egg-info/dependency_links.txt +0 -0
  18. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/edx_enterprise_data.egg-info/not-zip-safe +0 -0
  19. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/edx_enterprise_data.egg-info/requires.txt +0 -0
  20. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/edx_enterprise_data.egg-info/top_level.txt +0 -0
  21. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/admin_analytics/__init__.py +0 -0
  22. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/admin_analytics/constants.py +0 -0
  23. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/admin_analytics/data_loaders.py +0 -0
  24. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/admin_analytics/database/__init__.py +0 -0
  25. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/admin_analytics/database/queries/__init__.py +0 -0
  26. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py +0 -0
  27. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py +0 -0
  28. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/admin_analytics/database/queries/skills_daily_rollup_admin_dash.py +0 -0
  29. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/admin_analytics/database/tables/__init__.py +0 -0
  30. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/admin_analytics/database/tables/base.py +0 -0
  31. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py +0 -0
  32. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py +0 -0
  33. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/admin_analytics/database/tables/skills_daily_rollup_admin_dash.py +0 -0
  34. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/admin_analytics/database/utils.py +0 -0
  35. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/__init__.py +0 -0
  36. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/urls.py +0 -0
  37. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v0/__init__.py +0 -0
  38. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v0/serializers.py +0 -0
  39. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v0/urls.py +0 -0
  40. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v0/views.py +0 -0
  41. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v1/__init__.py +0 -0
  42. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v1/views/__init__.py +0 -0
  43. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v1/views/analytics_completions.py +0 -0
  44. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v1/views/analytics_engagements.py +0 -0
  45. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v1/views/analytics_enrollments.py +0 -0
  46. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v1/views/analytics_leaderboard.py +0 -0
  47. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v1/views/base.py +0 -0
  48. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/api/v1/views/enterprise_offers.py +0 -0
  49. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/apps.py +0 -0
  50. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/cache/__init__.py +0 -0
  51. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/cache/decorators.py +0 -0
  52. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/clients.py +0 -0
  53. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/constants.py +0 -0
  54. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/filters.py +0 -0
  55. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/fixtures/enterprise_enrollment.json +0 -0
  56. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/fixtures/enterprise_user.json +0 -0
  57. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/__init__.py +0 -0
  58. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/__init__.py +0 -0
  59. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/create_dummy_data.py +0 -0
  60. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/create_dummy_data_lpr_v1.py +0 -0
  61. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/create_enterprise_enrollment.py +0 -0
  62. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/create_enterprise_learner_enrollment_lpr_v1.py +0 -0
  63. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py +0 -0
  64. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/create_enterprise_offer.py +0 -0
  65. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/create_enterprise_user.py +0 -0
  66. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/pre_warm_analytics_cache.py +0 -0
  67. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/tests/__init__.py +0 -0
  68. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/tests/test_create_dummy_data_lpr_v1.py +0 -0
  69. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/tests/test_create_enterprise_enrollment.py +0 -0
  70. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py +0 -0
  71. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py +0 -0
  72. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/tests/test_create_enterprise_user.py +0 -0
  73. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/management/commands/tests/test_pre_warm_analytics_cache.py +0 -0
  74. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0001_initial.py +0 -0
  75. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0002_auto_20180430_1358.py +0 -0
  76. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0003_auto_20180501_0603.py +0 -0
  77. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0004_auto_20180501_0928.py +0 -0
  78. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0004_auto_20180508_1652.py +0 -0
  79. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0005_auto_20180524_2204.py +0 -0
  80. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0006_auto_20180612_0336.py +0 -0
  81. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0007_auto_20180612_0534.py +0 -0
  82. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0008_auto_20180614_0108.py +0 -0
  83. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0009_auto_20180628_1152.py +0 -0
  84. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0010_enterpriseenrollment_created.py +0 -0
  85. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0011_enterpriseuser.py +0 -0
  86. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0012_auto_20180831_1930.py +0 -0
  87. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0013_auto_20180831_1931.py +0 -0
  88. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0014_enterpriseuser_created.py +0 -0
  89. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0015_auto_20180907_1757.py +0 -0
  90. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0016_auto_20180924_2138.py +0 -0
  91. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0017_enterpriseenrollment_unenrollment_timestamp.py +0 -0
  92. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0018_enterprisedatafeaturerole_enterprisedataroleassignment.py +0 -0
  93. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0019_add_enterprise_data_feature_roles.py +0 -0
  94. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0020_add_role_based_access_control_switch.py +0 -0
  95. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0021_auto_20190329_1241.py +0 -0
  96. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0022_remove_role_based_access_control_switch.py +0 -0
  97. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0023_enterpriselearner_enterpriselearnerenrollment.py +0 -0
  98. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0024_auto_20210602_1811.py +0 -0
  99. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0025_auto_20210703_1854.py +0 -0
  100. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0026_auto_20210916_0414.py +0 -0
  101. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0027_enterpriselearnerenrollment_total_learning_time_seconds.py +0 -0
  102. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0028_enterpriselearnerenrollment_offer_id.py +0 -0
  103. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0029_enterpriseoffer.py +0 -0
  104. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0030_auto_20230609_1353.py +0 -0
  105. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0031_auto_20230615_0705.py +0 -0
  106. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0032_auto_20230704_0818.py +0 -0
  107. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0033_enterpriseadminlearnerprogress_enterpriseadminsummarizeinsights.py +0 -0
  108. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0034_auto_20230907_0834.py +0 -0
  109. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0035_auto_20230907_1154.py +0 -0
  110. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0036_enterprisesubsidybudget_subsidy_access_policy_display_name.py +0 -0
  111. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0037_alter_enterpriseenrollment_consent_granted.py +0 -0
  112. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0038_enterpriseoffer_export_timestamp.py +0 -0
  113. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0039_auto_20240212_1403.py +0 -0
  114. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0040_auto_20240718_0536_squashed_0043_alter_enterpriselearnerenrollment_enterprise_enrollment_id.py +0 -0
  115. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0044_enterpriseexecedlcmoduleperformance.py +0 -0
  116. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/0045_alter_enterpriseexecedlcmoduleperformance_options_and_more.py +0 -0
  117. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/migrations/__init__.py +0 -0
  118. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/paginators.py +0 -0
  119. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/renderers.py +0 -0
  120. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/settings/__init__.py +0 -0
  121. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/settings/test.py +0 -0
  122. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/signals.py +0 -0
  123. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/__init__.py +0 -0
  124. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/admin_analytics/__init__.py +0 -0
  125. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/admin_analytics/mock_analytics_data.py +0 -0
  126. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/admin_analytics/mock_enrollments.py +0 -0
  127. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/admin_analytics/test_analytics_engagements.py +0 -0
  128. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/admin_analytics/test_analytics_enrollments.py +0 -0
  129. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/admin_analytics/test_analytics_leaderboard.py +0 -0
  130. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/admin_analytics/test_data_loaders.py +0 -0
  131. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/admin_analytics/test_enterprise_completions.py +0 -0
  132. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/api/__init__.py +0 -0
  133. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/api/v0/__init__.py +0 -0
  134. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/api/v0/test_serializers.py +0 -0
  135. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/api/v1/__init__.py +0 -0
  136. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/api/v1/test_serializers.py +0 -0
  137. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/api/v1/test_views.py +0 -0
  138. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/api/v1/views/__init__.py +0 -0
  139. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/api/v1/views/test_enterprise_admin.py +0 -0
  140. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/factories.py +0 -0
  141. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/mixins.py +0 -0
  142. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/test_clients.py +0 -0
  143. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/test_filters.py +0 -0
  144. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/tests/test_views.py +0 -0
  145. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/urls.py +0 -0
  146. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data/utils.py +0 -0
  147. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/__init__.py +0 -0
  148. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/admin.py +0 -0
  149. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/apps.py +0 -0
  150. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/constants.py +0 -0
  151. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/migrations/0001_initial.py +0 -0
  152. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/migrations/0002_add_enterprise_data_feature_roles.py +0 -0
  153. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/migrations/0003_add_role_based_access_control_switch.py +0 -0
  154. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/migrations/0004_enterprisedataroleassignment_enterprise_id.py +0 -0
  155. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/migrations/0005_turn_on_role_based_access_control_switch.py +0 -0
  156. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/migrations/0006_remove_role_based_access_control_switch.py +0 -0
  157. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/migrations/0007_enterprisedataroleassignment_applies_to_all_contexts.py +0 -0
  158. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/migrations/__init__.py +0 -0
  159. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/models.py +0 -0
  160. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/rules.py +0 -0
  161. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/tests/__init__.py +0 -0
  162. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/tests/factories.py +0 -0
  163. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_data_roles/tests/test_models.py +0 -0
  164. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/__init__.py +0 -0
  165. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/clients/__init__.py +0 -0
  166. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/clients/enterprise.py +0 -0
  167. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/clients/s3.py +0 -0
  168. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/clients/snowflake.py +0 -0
  169. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/clients/vertica.py +0 -0
  170. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/delivery_method.py +0 -0
  171. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/external_resource_link_report.py +0 -0
  172. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/fixtures/__init__.py +0 -0
  173. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/fixtures/enterprise_customer_reporting.json +0 -0
  174. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/reporter.py +0 -0
  175. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/send_enterprise_reports.py +0 -0
  176. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/tests/__init__.py +0 -0
  177. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/tests/test_clients.py +0 -0
  178. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/tests/test_delivery_method.py +0 -0
  179. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/tests/test_enterprise_client.py +0 -0
  180. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/tests/test_external_link_report.py +0 -0
  181. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/tests/test_reporter.py +0 -0
  182. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/tests/test_send_enterprise_reports.py +0 -0
  183. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/tests/test_utils.py +0 -0
  184. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/tests/test_vertica_client.py +0 -0
  185. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/tests/utils.py +0 -0
  186. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/enterprise_reporting/utils.py +0 -0
  187. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/requirements/base.in +0 -0
  188. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/requirements/base.txt +0 -0
  189. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/requirements/ci.txt +0 -0
  190. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/requirements/common_constraints.txt +0 -0
  191. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/requirements/constraints.txt +0 -0
  192. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/requirements/dev.txt +0 -0
  193. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/requirements/django.txt +0 -0
  194. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/requirements/pip.txt +0 -0
  195. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/requirements/pip_tools.txt +0 -0
  196. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/requirements/quality.txt +0 -0
  197. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/requirements/reporting.in +0 -0
  198. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/requirements/test-master.txt +0 -0
  199. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/requirements/test-reporting.txt +0 -0
  200. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/requirements/test.txt +0 -0
  201. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/setup.cfg +0 -0
  202. {edx_enterprise_data-9.7.7 → edx_enterprise_data-9.7.9}/setup.py +0 -0
@@ -16,6 +16,15 @@ Unreleased
16
16
 
17
17
  =========================
18
18
 
19
+ [10.7.2] - 2025-01-16
20
+ ---------------------
21
+ * Fixed duplicate entries for groups in enterprise groups API
22
+
23
+ [10.7.1] - 2025-01-07
24
+ ---------------------
25
+ * feat: add group_membership table
26
+ * feat: add APIs to support LPR filtering for enterprise groups
27
+
19
28
  [10.7.0] - 2024-12-24
20
29
  ---------------------
21
30
  * feat: Added user's first and last name in the enterprise enrollments API and related DB table.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edx-enterprise-data
3
- Version: 9.7.7
3
+ Version: 9.7.9
4
4
  Summary: Enterprise Reporting
5
5
  Home-page: https://github.com/openedx/edx-enterprise-data
6
6
  Author: edX
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edx-enterprise-data
3
- Version: 9.7.7
3
+ Version: 9.7.9
4
4
  Summary: Enterprise Reporting
5
5
  Home-page: https://github.com/openedx/edx-enterprise-data
6
6
  Author: edX
@@ -116,6 +116,7 @@ enterprise_data/migrations/0039_auto_20240212_1403.py
116
116
  enterprise_data/migrations/0040_auto_20240718_0536_squashed_0043_alter_enterpriselearnerenrollment_enterprise_enrollment_id.py
117
117
  enterprise_data/migrations/0044_enterpriseexecedlcmoduleperformance.py
118
118
  enterprise_data/migrations/0045_alter_enterpriseexecedlcmoduleperformance_options_and_more.py
119
+ enterprise_data/migrations/0046_enterprisegroupmembership.py
119
120
  enterprise_data/migrations/__init__.py
120
121
  enterprise_data/settings/__init__.py
121
122
  enterprise_data/settings/test.py
@@ -2,4 +2,4 @@
2
2
  Enterprise data api application. This Django app exposes API endpoints used by enterprises.
3
3
  """
4
4
 
5
- __version__ = "9.7.7"
5
+ __version__ = "9.7.9"
@@ -10,6 +10,7 @@ from enterprise_data.models import (
10
10
  EnterpriseAdminLearnerProgress,
11
11
  EnterpriseAdminSummarizeInsights,
12
12
  EnterpriseExecEdLCModulePerformance,
13
+ EnterpriseGroupMembership,
13
14
  EnterpriseLearner,
14
15
  EnterpriseLearnerEnrollment,
15
16
  EnterpriseOffer,
@@ -253,6 +254,19 @@ class EnterpriseBudgetSerializer(serializers.ModelSerializer):
253
254
  )
254
255
 
255
256
 
257
+ class EnterpriseGroupMembershipSerializer(serializers.ModelSerializer):
258
+ """
259
+ Serializer for EnterpriseGroupMembership model.
260
+ """
261
+
262
+ class Meta:
263
+ model = EnterpriseGroupMembership
264
+ fields = (
265
+ 'enterprise_group_uuid',
266
+ 'enterprise_group_name',
267
+ )
268
+
269
+
256
270
  class AdvanceAnalyticsQueryParamSerializer(serializers.Serializer): # pylint: disable=abstract-method
257
271
  """Serializer for validating query params"""
258
272
  RESPONSE_TYPES = [
@@ -101,6 +101,11 @@ urlpatterns = [
101
101
  enterprise_admin_views.EnterpriseBudgetView.as_view(),
102
102
  name='enterprise-budgets'
103
103
  ),
104
+ re_path(
105
+ fr'^enterprise/(?P<enterprise_uuid>{UUID4_REGEX})/groups',
106
+ enterprise_admin_views.EnterpriseGroupMembershipView.as_view(),
107
+ name='enterprise-groups'
108
+ ),
104
109
  ]
105
110
 
106
111
  urlpatterns += router.urls
@@ -21,6 +21,7 @@ from enterprise_data.models import (
21
21
  EnterpriseAdminLearnerProgress,
22
22
  EnterpriseAdminSummarizeInsights,
23
23
  EnterpriseExecEdLCModulePerformance,
24
+ EnterpriseGroupMembership,
24
25
  EnterpriseSubsidyBudget,
25
26
  )
26
27
  from enterprise_data.utils import timer
@@ -230,3 +231,24 @@ class EnterpriseBudgetView(APIView):
230
231
 
231
232
  serializer = serializers.EnterpriseBudgetSerializer(budgets, many=True)
232
233
  return Response(serializer.data)
234
+
235
+
236
+ class EnterpriseGroupMembershipView(APIView):
237
+ """
238
+ View for getting Group Memberships information for an enterprise.
239
+ """
240
+ authentication_classes = (JwtAuthentication,)
241
+ http_method_names = ["get"]
242
+
243
+ @permission_required("can_access_enterprise", fn=lambda request, enterprise_uuid: enterprise_uuid)
244
+ def get(self, request, enterprise_uuid):
245
+ """
246
+ Returns the groups and budgets for an enterprise.
247
+ """
248
+ groups = EnterpriseGroupMembership.objects.filter(
249
+ enterprise_customer_id=enterprise_uuid,
250
+ group_type='flex',
251
+ ).values('enterprise_group_uuid', 'enterprise_group_name').distinct()
252
+
253
+ serializer = serializers.EnterpriseGroupMembershipSerializer(groups, many=True)
254
+ return Response(serializer.data)
@@ -12,7 +12,7 @@ from rest_framework.response import Response
12
12
 
13
13
  from django.conf import settings
14
14
  from django.core.paginator import Paginator
15
- from django.db.models import Count, Max, OuterRef, Prefetch, Q, Subquery, Value
15
+ from django.db.models import Count, Exists, Max, OuterRef, Prefetch, Q, Subquery, Value
16
16
  from django.db.models.fields import IntegerField
17
17
  from django.db.models.functions import Coalesce
18
18
  from django.http import StreamingHttpResponse
@@ -20,7 +20,7 @@ from django.utils import timezone
20
20
 
21
21
  from enterprise_data.admin_analytics.database.utils import LOGGER
22
22
  from enterprise_data.api.v1 import serializers
23
- from enterprise_data.models import EnterpriseLearner, EnterpriseLearnerEnrollment
23
+ from enterprise_data.models import EnterpriseGroupMembership, EnterpriseLearner, EnterpriseLearnerEnrollment
24
24
  from enterprise_data.paginators import EnterpriseEnrollmentsPagination
25
25
  from enterprise_data.renderers import EnrollmentsCSVRenderer
26
26
  from enterprise_data.utils import subtract_one_month
@@ -174,6 +174,15 @@ class EnterpriseLearnerEnrollmentViewSet(EnterpriseViewSetMixin, viewsets.ReadOn
174
174
  if is_subsidy:
175
175
  queryset = queryset.filter(is_subsidy=is_subsidy)
176
176
 
177
+ group_uuid = query_filters.get('group_uuid')
178
+ if group_uuid:
179
+ flex_group_exists = EnterpriseGroupMembership.objects.filter(
180
+ enterprise_customer_user_id=OuterRef('enterprise_user_id'),
181
+ enterprise_group_uuid=group_uuid,
182
+ group_type='flex'
183
+ )
184
+ queryset = queryset.filter(Exists(flex_group_exists))
185
+
177
186
  return queryset
178
187
 
179
188
  def filter_by_offer_id(self, queryset, offer_id):
@@ -0,0 +1,36 @@
1
+ # Generated by Django 4.2.16 on 2025-01-08 07:31
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('enterprise_data', '0045_alter_enterpriseexecedlcmoduleperformance_options_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.CreateModel(
14
+ name='EnterpriseGroupMembership',
15
+ fields=[
16
+ ('group_membership_unique_id', models.CharField(max_length=64, primary_key=True, serialize=False)),
17
+ ('is_applies_to_all_contexts', models.BooleanField(default=False)),
18
+ ('enterprise_customer_id', models.UUIDField(db_index=True, null=True)),
19
+ ('enterprise_group_name', models.CharField(max_length=255, null=True)),
20
+ ('enterprise_group_uuid', models.UUIDField(null=True)),
21
+ ('group_is_removed', models.BooleanField(default=False)),
22
+ ('group_type', models.CharField(max_length=128, null=True)),
23
+ ('activated_at', models.DateTimeField(null=True)),
24
+ ('enterprise_customer_user_id', models.PositiveIntegerField(null=True)),
25
+ ('membership_is_removed', models.BooleanField(default=False)),
26
+ ('membership_status', models.CharField(max_length=128, null=True)),
27
+ ('enterprise_group_membership_uuid', models.UUIDField(null=True)),
28
+ ],
29
+ options={
30
+ 'verbose_name': 'Group Membership',
31
+ 'verbose_name_plural': 'Group Memberships',
32
+ 'db_table': 'group_membership',
33
+ 'indexes': [models.Index(fields=['enterprise_group_uuid', 'group_type', 'enterprise_customer_user_id'], name='group_membe_enterpr_796f48_idx')],
34
+ },
35
+ ),
36
+ ]
@@ -398,6 +398,50 @@ class EnterpriseSubsidyBudget(models.Model):
398
398
  return self.__str__()
399
399
 
400
400
 
401
+ class EnterpriseGroupMembership(models.Model):
402
+ """
403
+ Details of group memberships in enterprise reports.
404
+ """
405
+
406
+ objects = EnterpriseReportingModelManager()
407
+
408
+ class Meta:
409
+ app_label = 'enterprise_data'
410
+ db_table = 'group_membership'
411
+ verbose_name = _("Group Membership")
412
+ verbose_name_plural = _("Group Memberships")
413
+ indexes = [
414
+ models.Index(fields=['enterprise_group_uuid', 'group_type', 'enterprise_customer_user_id']),
415
+ ]
416
+
417
+ group_membership_unique_id = models.CharField(max_length=64, primary_key=True)
418
+ is_applies_to_all_contexts = models.BooleanField(default=False)
419
+ enterprise_customer_id = models.UUIDField(db_index=True, null=True)
420
+ enterprise_group_name = models.CharField(max_length=255, null=True)
421
+ enterprise_group_uuid = models.UUIDField(null=True)
422
+ group_is_removed = models.BooleanField(default=False)
423
+ group_type = models.CharField(max_length=128, null=True)
424
+ activated_at = models.DateTimeField(null=True)
425
+ enterprise_customer_user_id = models.PositiveIntegerField(null=True)
426
+ membership_is_removed = models.BooleanField(default=False)
427
+ membership_status = models.CharField(max_length=128, null=True)
428
+ enterprise_group_membership_uuid = models.UUIDField(null=True)
429
+
430
+ def __str__(self):
431
+ """
432
+ Return a human-readable string representation of the object.
433
+ """
434
+ return (f'<Enterprise Group Membership: {self.enterprise_group_name} '
435
+ f'(Group UUID: {self.enterprise_group_uuid}) '
436
+ f'for Customer ID {self.enterprise_customer_id}>')
437
+
438
+ def __repr__(self):
439
+ """
440
+ Return uniquely identifying string representation.
441
+ """
442
+ return self.__str__()
443
+
444
+
401
445
  class EnterpriseUser(models.Model):
402
446
  """Information includes a mix of the user's meta data.
403
447
 
@@ -10,6 +10,7 @@ from pytest import mark
10
10
 
11
11
  from enterprise_data.tests.test_utils import (
12
12
  EnterpriseEnrollmentFactory,
13
+ EnterpriseGroupMembershipFactory,
13
14
  EnterpriseOfferFactory,
14
15
  EnterpriseSubsidyBudgetFactory,
15
16
  EnterpriseUserFactory,
@@ -91,6 +92,32 @@ class TestEnterpriseSubsidyBudget(unittest.TestCase):
91
92
  assert expected_str == method(self.enterprise_subsidy_budget)
92
93
 
93
94
 
95
+ @mark.django_db
96
+ @ddt.ddt
97
+ class TestEnterpriseGroupMembership(unittest.TestCase):
98
+ """
99
+ Tests for Enterprise Group Membership model
100
+ """
101
+
102
+ def setUp(self):
103
+ self.enterprise_group_membership = EnterpriseGroupMembershipFactory(
104
+ enterprise_customer_id='ee5e6b3a-069a-4947-bb8d-d2dbc323396c',
105
+ enterprise_group_name='Test Group',
106
+ enterprise_group_uuid='ee5e6b3a-069a-4947-bb8d-d2dbc323396d',
107
+ )
108
+ super().setUp()
109
+
110
+ @ddt.data(str, repr)
111
+ def test_string_conversion(self, method):
112
+ """
113
+ Test conversion to string.
114
+ """
115
+ expected_str = ('<Enterprise Group Membership: Test Group '
116
+ '(Group UUID: ee5e6b3a-069a-4947-bb8d-d2dbc323396d) '
117
+ 'for Customer ID ee5e6b3a-069a-4947-bb8d-d2dbc323396c>')
118
+ assert expected_str == method(self.enterprise_group_membership)
119
+
120
+
94
121
  @mark.django_db
95
122
  @ddt.ddt
96
123
  class TestEnterpriseUser(unittest.TestCase):
@@ -14,6 +14,7 @@ from django.contrib.auth import get_user_model
14
14
 
15
15
  from enterprise_data.models import (
16
16
  EnterpriseEnrollment,
17
+ EnterpriseGroupMembership,
17
18
  EnterpriseLearner,
18
19
  EnterpriseLearnerEnrollment,
19
20
  EnterpriseOffer,
@@ -288,6 +289,27 @@ class EnterpriseSubsidyBudgetFactory(factory.django.DjangoModelFactory):
288
289
  )
289
290
 
290
291
 
292
+ class EnterpriseGroupMembershipFactory(factory.django.DjangoModelFactory):
293
+ """
294
+ EnterpriseGroupMembership model Factory.
295
+ """
296
+ class Meta:
297
+ model = EnterpriseGroupMembership
298
+
299
+ enterprise_customer_id = factory.LazyAttribute(lambda _: FAKER.uuid4())
300
+ enterprise_group_name = factory.LazyAttribute(lambda _: ' '.join(FAKER.words(nb=2)).title())
301
+ enterprise_group_uuid = factory.LazyAttribute(lambda _: FAKER.uuid4())
302
+ group_is_removed = factory.LazyAttribute(lambda _: FAKER.boolean())
303
+ group_type = factory.LazyAttribute(lambda _: 'budget')
304
+ activated_at = factory.LazyAttribute(lambda _: FAKER.date_time_this_decade(tzinfo=pytz.UTC))
305
+ enterprise_customer_user_id = factory.LazyAttribute(lambda _: FAKER.random_int(min=1, max=10000))
306
+ membership_is_removed = factory.LazyAttribute(lambda _: FAKER.boolean())
307
+ membership_status = factory.LazyAttribute(lambda _: FAKER.word())
308
+ enterprise_group_membership_uuid = factory.LazyAttribute(lambda _: FAKER.uuid4())
309
+
310
+ is_applies_to_all_contexts = factory.LazyAttribute(lambda _: FAKER.boolean())
311
+
312
+
291
313
  class EnterpriseOfferFactory(factory.django.DjangoModelFactory):
292
314
  """
293
315
  EnterpriseLearner model Factory.