edx-enterprise-data 8.4.0__tar.gz → 8.5.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 (177) hide show
  1. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/CHANGELOG.rst +5 -0
  2. {edx_enterprise_data-8.4.0/edx_enterprise_data.egg-info → edx_enterprise_data-8.5.0}/PKG-INFO +1 -1
  3. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0/edx_enterprise_data.egg-info}/PKG-INFO +1 -1
  4. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/edx_enterprise_data.egg-info/SOURCES.txt +1 -0
  5. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/__init__.py +1 -1
  6. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/api/v1/serializers.py +11 -0
  7. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/api/v1/urls.py +5 -0
  8. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/api/v1/views/enterprise_admin.py +43 -15
  9. edx_enterprise_data-8.5.0/enterprise_data/migrations/0044_enterpriseexecedlcmoduleperformance.py +87 -0
  10. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/models.py +94 -0
  11. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/LICENSE +0 -0
  12. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/MANIFEST.in +0 -0
  13. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/README.md +0 -0
  14. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/edx_enterprise_data.egg-info/dependency_links.txt +0 -0
  15. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/edx_enterprise_data.egg-info/not-zip-safe +0 -0
  16. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/edx_enterprise_data.egg-info/requires.txt +0 -0
  17. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/edx_enterprise_data.egg-info/top_level.txt +0 -0
  18. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/admin_analytics/__init__.py +0 -0
  19. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/admin_analytics/data_loaders.py +0 -0
  20. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/admin_analytics/database.py +0 -0
  21. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/admin_analytics/utils.py +0 -0
  22. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/api/__init__.py +0 -0
  23. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/api/urls.py +0 -0
  24. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/api/v0/__init__.py +0 -0
  25. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/api/v0/serializers.py +0 -0
  26. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/api/v0/urls.py +0 -0
  27. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/api/v0/views.py +0 -0
  28. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/api/v1/__init__.py +0 -0
  29. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/api/v1/views/__init__.py +0 -0
  30. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/api/v1/views/base.py +0 -0
  31. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/api/v1/views/enterprise_learner.py +0 -0
  32. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/api/v1/views/enterprise_offers.py +0 -0
  33. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/apps.py +0 -0
  34. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/clients.py +0 -0
  35. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/constants.py +0 -0
  36. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/filters.py +0 -0
  37. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/fixtures/enterprise_enrollment.json +0 -0
  38. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/fixtures/enterprise_user.json +0 -0
  39. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/management/__init__.py +0 -0
  40. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/management/commands/__init__.py +0 -0
  41. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/management/commands/create_dummy_data.py +0 -0
  42. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/management/commands/create_dummy_data_lpr_v1.py +0 -0
  43. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/management/commands/create_enterprise_enrollment.py +0 -0
  44. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/management/commands/create_enterprise_learner_enrollment_lpr_v1.py +0 -0
  45. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py +0 -0
  46. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/management/commands/create_enterprise_offer.py +0 -0
  47. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/management/commands/create_enterprise_user.py +0 -0
  48. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/management/commands/tests/__init__.py +0 -0
  49. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/management/commands/tests/test_create_dummy_data_lpr_v1.py +0 -0
  50. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/management/commands/tests/test_create_enterprise_enrollment.py +0 -0
  51. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py +0 -0
  52. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py +0 -0
  53. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/management/commands/tests/test_create_enterprise_user.py +0 -0
  54. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0001_initial.py +0 -0
  55. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0002_auto_20180430_1358.py +0 -0
  56. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0003_auto_20180501_0603.py +0 -0
  57. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0004_auto_20180501_0928.py +0 -0
  58. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0004_auto_20180508_1652.py +0 -0
  59. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0005_auto_20180524_2204.py +0 -0
  60. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0006_auto_20180612_0336.py +0 -0
  61. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0007_auto_20180612_0534.py +0 -0
  62. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0008_auto_20180614_0108.py +0 -0
  63. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0009_auto_20180628_1152.py +0 -0
  64. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0010_enterpriseenrollment_created.py +0 -0
  65. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0011_enterpriseuser.py +0 -0
  66. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0012_auto_20180831_1930.py +0 -0
  67. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0013_auto_20180831_1931.py +0 -0
  68. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0014_enterpriseuser_created.py +0 -0
  69. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0015_auto_20180907_1757.py +0 -0
  70. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0016_auto_20180924_2138.py +0 -0
  71. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0017_enterpriseenrollment_unenrollment_timestamp.py +0 -0
  72. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0018_enterprisedatafeaturerole_enterprisedataroleassignment.py +0 -0
  73. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0019_add_enterprise_data_feature_roles.py +0 -0
  74. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0020_add_role_based_access_control_switch.py +0 -0
  75. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0021_auto_20190329_1241.py +0 -0
  76. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0022_remove_role_based_access_control_switch.py +0 -0
  77. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0023_enterpriselearner_enterpriselearnerenrollment.py +0 -0
  78. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0024_auto_20210602_1811.py +0 -0
  79. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0025_auto_20210703_1854.py +0 -0
  80. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0026_auto_20210916_0414.py +0 -0
  81. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0027_enterpriselearnerenrollment_total_learning_time_seconds.py +0 -0
  82. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0028_enterpriselearnerenrollment_offer_id.py +0 -0
  83. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0029_enterpriseoffer.py +0 -0
  84. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0030_auto_20230609_1353.py +0 -0
  85. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0031_auto_20230615_0705.py +0 -0
  86. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0032_auto_20230704_0818.py +0 -0
  87. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0033_enterpriseadminlearnerprogress_enterpriseadminsummarizeinsights.py +0 -0
  88. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0034_auto_20230907_0834.py +0 -0
  89. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0035_auto_20230907_1154.py +0 -0
  90. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0036_enterprisesubsidybudget_subsidy_access_policy_display_name.py +0 -0
  91. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0037_alter_enterpriseenrollment_consent_granted.py +0 -0
  92. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0038_enterpriseoffer_export_timestamp.py +0 -0
  93. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0039_auto_20240212_1403.py +0 -0
  94. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/0040_auto_20240718_0536_squashed_0043_alter_enterpriselearnerenrollment_enterprise_enrollment_id.py +0 -0
  95. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/migrations/__init__.py +0 -0
  96. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/paginators.py +0 -0
  97. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/renderers.py +0 -0
  98. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/settings/__init__.py +0 -0
  99. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/settings/test.py +0 -0
  100. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/signals.py +0 -0
  101. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/__init__.py +0 -0
  102. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/admin_analytics/__init__.py +0 -0
  103. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/admin_analytics/test_data_loaders.py +0 -0
  104. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/admin_analytics/test_utils.py +0 -0
  105. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/api/__init__.py +0 -0
  106. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/api/v0/__init__.py +0 -0
  107. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/api/v0/test_serializers.py +0 -0
  108. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/api/v1/__init__.py +0 -0
  109. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/api/v1/test_serializers.py +0 -0
  110. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/api/v1/test_views.py +0 -0
  111. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/api/v1/views/__init__.py +0 -0
  112. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/api/v1/views/test_enterprise_admin.py +0 -0
  113. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/factories.py +0 -0
  114. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/mixins.py +0 -0
  115. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/test_clients.py +0 -0
  116. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/test_filters.py +0 -0
  117. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/test_models.py +0 -0
  118. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/test_utils.py +0 -0
  119. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/tests/test_views.py +0 -0
  120. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/urls.py +0 -0
  121. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data/utils.py +0 -0
  122. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/__init__.py +0 -0
  123. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/admin.py +0 -0
  124. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/apps.py +0 -0
  125. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/constants.py +0 -0
  126. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/migrations/0001_initial.py +0 -0
  127. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/migrations/0002_add_enterprise_data_feature_roles.py +0 -0
  128. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/migrations/0003_add_role_based_access_control_switch.py +0 -0
  129. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/migrations/0004_enterprisedataroleassignment_enterprise_id.py +0 -0
  130. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/migrations/0005_turn_on_role_based_access_control_switch.py +0 -0
  131. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/migrations/0006_remove_role_based_access_control_switch.py +0 -0
  132. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/migrations/0007_enterprisedataroleassignment_applies_to_all_contexts.py +0 -0
  133. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/migrations/__init__.py +0 -0
  134. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/models.py +0 -0
  135. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/rules.py +0 -0
  136. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/tests/__init__.py +0 -0
  137. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/tests/factories.py +0 -0
  138. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_data_roles/tests/test_models.py +0 -0
  139. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/__init__.py +0 -0
  140. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/clients/__init__.py +0 -0
  141. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/clients/enterprise.py +0 -0
  142. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/clients/s3.py +0 -0
  143. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/clients/snowflake.py +0 -0
  144. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/clients/vertica.py +0 -0
  145. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/delivery_method.py +0 -0
  146. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/external_resource_link_report.py +0 -0
  147. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/fixtures/__init__.py +0 -0
  148. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/fixtures/enterprise_customer_reporting.json +0 -0
  149. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/reporter.py +0 -0
  150. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/send_enterprise_reports.py +0 -0
  151. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/tests/__init__.py +0 -0
  152. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/tests/test_clients.py +0 -0
  153. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/tests/test_delivery_method.py +0 -0
  154. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/tests/test_enterprise_client.py +0 -0
  155. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/tests/test_external_link_report.py +0 -0
  156. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/tests/test_reporter.py +0 -0
  157. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/tests/test_send_enterprise_reports.py +0 -0
  158. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/tests/test_utils.py +0 -0
  159. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/tests/test_vertica_client.py +0 -0
  160. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/tests/utils.py +0 -0
  161. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/enterprise_reporting/utils.py +0 -0
  162. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/requirements/base.in +0 -0
  163. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/requirements/base.txt +0 -0
  164. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/requirements/ci.txt +0 -0
  165. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/requirements/common_constraints.txt +0 -0
  166. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/requirements/constraints.txt +0 -0
  167. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/requirements/dev.txt +0 -0
  168. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/requirements/django.txt +0 -0
  169. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/requirements/pip.txt +0 -0
  170. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/requirements/pip_tools.txt +0 -0
  171. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/requirements/quality.txt +0 -0
  172. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/requirements/reporting.in +0 -0
  173. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/requirements/test-master.txt +0 -0
  174. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/requirements/test-reporting.txt +0 -0
  175. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/requirements/test.txt +0 -0
  176. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/setup.cfg +0 -0
  177. {edx_enterprise_data-8.4.0 → edx_enterprise_data-8.5.0}/setup.py +0 -0
@@ -15,6 +15,11 @@ Unreleased
15
15
  ----------
16
16
 
17
17
  =========================
18
+
19
+ [8.5.0] - 2024-08-12
20
+ ---------------------
21
+ * Added a new model and REST endpoint to get Exec Ed LC Module Performance data.
22
+
18
23
  [8.4.0] - 2024-08-09
19
24
  ---------------------
20
25
  * feat: endpoint to get skills aggregated data for an enterprise customer
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edx-enterprise-data
3
- Version: 8.4.0
3
+ Version: 8.5.0
4
4
  Summary: Enterprise Reporting
5
5
  Home-page: https://github.com/openedx/edx-enterprise-data
6
6
  Author: edX
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edx-enterprise-data
3
- Version: 8.4.0
3
+ Version: 8.5.0
4
4
  Summary: Enterprise Reporting
5
5
  Home-page: https://github.com/openedx/edx-enterprise-data
6
6
  Author: edX
@@ -96,6 +96,7 @@ enterprise_data/migrations/0037_alter_enterpriseenrollment_consent_granted.py
96
96
  enterprise_data/migrations/0038_enterpriseoffer_export_timestamp.py
97
97
  enterprise_data/migrations/0039_auto_20240212_1403.py
98
98
  enterprise_data/migrations/0040_auto_20240718_0536_squashed_0043_alter_enterpriselearnerenrollment_enterprise_enrollment_id.py
99
+ enterprise_data/migrations/0044_enterpriseexecedlcmoduleperformance.py
99
100
  enterprise_data/migrations/__init__.py
100
101
  enterprise_data/settings/__init__.py
101
102
  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__ = "8.4.0"
5
+ __version__ = "8.5.0"
@@ -8,6 +8,7 @@ from rest_framework import serializers
8
8
  from enterprise_data.models import (
9
9
  EnterpriseAdminLearnerProgress,
10
10
  EnterpriseAdminSummarizeInsights,
11
+ EnterpriseExecEdLCModulePerformance,
11
12
  EnterpriseLearner,
12
13
  EnterpriseLearnerEnrollment,
13
14
  EnterpriseOffer,
@@ -216,3 +217,13 @@ class AdminAnalyticsAggregatesQueryParamsSerializer(serializers.Serializer): #
216
217
  if attrs['start_date'] > attrs['end_date']:
217
218
  raise serializers.ValidationError("start_date should be less than or equal to end_date.")
218
219
  return attrs
220
+
221
+
222
+ class EnterpriseExecEdLCModulePerformanceSerializer(serializers.ModelSerializer):
223
+ """
224
+ Serializer for EnterpriseExecEdLCModulePerformance model.
225
+ """
226
+
227
+ class Meta:
228
+ model = EnterpriseExecEdLCModulePerformance
229
+ fields = '__all__'
@@ -35,6 +35,11 @@ router.register(
35
35
  enterprise_learner_views.EnterpriseLearnerCompletedCoursesViewSet,
36
36
  'enterprise-learner-completed-courses',
37
37
  )
38
+ router.register(
39
+ r'enterprise/(?P<enterprise_id>.+)/module-performance',
40
+ enterprise_admin_views.EnterpriseExecEdLCModulePerformanceViewSet,
41
+ 'enterprise-admin-module-performance',
42
+ )
38
43
 
39
44
  urlpatterns = [
40
45
  re_path(
@@ -1,11 +1,11 @@
1
1
  """
2
2
  Views for enterprise admin api v1.
3
3
  """
4
-
5
4
  from datetime import datetime, timedelta
6
5
 
7
6
  from edx_rbac.decorators import permission_required
8
7
  from edx_rest_framework_extensions.auth.jwt.authentication import JwtAuthentication
8
+ from rest_framework import filters, viewsets
9
9
  from rest_framework.response import Response
10
10
  from rest_framework.status import HTTP_200_OK, HTTP_404_NOT_FOUND
11
11
  from rest_framework.views import APIView
@@ -22,9 +22,15 @@ from enterprise_data.admin_analytics.utils import (
22
22
  get_top_skills_csv_data,
23
23
  )
24
24
  from enterprise_data.api.v1 import serializers
25
- from enterprise_data.models import EnterpriseAdminLearnerProgress, EnterpriseAdminSummarizeInsights
25
+ from enterprise_data.models import (
26
+ EnterpriseAdminLearnerProgress,
27
+ EnterpriseAdminSummarizeInsights,
28
+ EnterpriseExecEdLCModulePerformance,
29
+ )
26
30
  from enterprise_data.utils import date_filter
27
31
 
32
+ from .base import EnterpriseViewSetMixin
33
+
28
34
 
29
35
  class EnterpriseAdminInsightsView(APIView):
30
36
  """
@@ -109,16 +115,16 @@ class EnterpriseAdminAnalyticsAggregatesView(APIView):
109
115
  # 1. minimum enrollment date from the data as the start_date
110
116
  # 2. today's date as the end_date
111
117
  start_date = serializer.data.get(
112
- "start_date", enrollment.enterprise_enrollment_date.min()
118
+ 'start_date', enrollment.enterprise_enrollment_date.min()
113
119
  )
114
- end_date = serializer.data.get("end_date", datetime.now())
120
+ end_date = serializer.data.get('end_date', datetime.now())
115
121
 
116
122
  # Date filtering.
117
123
  dff = date_filter(
118
124
  start=start_date,
119
125
  end=end_date,
120
126
  data_frame=enrollment.copy(),
121
- date_column="enterprise_enrollment_date",
127
+ date_column='enterprise_enrollment_date',
122
128
  )
123
129
 
124
130
  enrolls = len(dff)
@@ -128,7 +134,7 @@ class EnterpriseAdminAnalyticsAggregatesView(APIView):
128
134
  start=start_date,
129
135
  end=end_date,
130
136
  data_frame=enrollment.copy(),
131
- date_column="passed_date",
137
+ date_column='passed_date',
132
138
  )
133
139
 
134
140
  completions = dff.has_passed.sum()
@@ -138,7 +144,7 @@ class EnterpriseAdminAnalyticsAggregatesView(APIView):
138
144
  start=start_date,
139
145
  end=end_date,
140
146
  data_frame=engagement.copy(),
141
- date_column="activity_date",
147
+ date_column='activity_date',
142
148
  )
143
149
 
144
150
  hours = round(dff.learning_time_seconds.sum() / 60 / 60, 1)
@@ -146,14 +152,14 @@ class EnterpriseAdminAnalyticsAggregatesView(APIView):
146
152
 
147
153
  return Response(
148
154
  data={
149
- "enrolls": enrolls,
150
- "courses": courses,
151
- "completions": completions,
152
- "hours": hours,
153
- "sessions": sessions,
154
- "last_updated_at": last_updated_at.date() if last_updated_at else None,
155
- "min_enrollment_date": enrollment.enterprise_enrollment_date.min().date(),
156
- "max_enrollment_date": enrollment.enterprise_enrollment_date.max().date(),
155
+ 'enrolls': enrolls,
156
+ 'courses': courses,
157
+ 'completions': completions,
158
+ 'hours': hours,
159
+ 'sessions': sessions,
160
+ 'last_updated_at': last_updated_at.date() if last_updated_at else None,
161
+ 'min_enrollment_date': enrollment.enterprise_enrollment_date.min().date(),
162
+ 'max_enrollment_date': enrollment.enterprise_enrollment_date.max().date(),
157
163
  },
158
164
  status=HTTP_200_OK,
159
165
  )
@@ -231,3 +237,25 @@ class EnterpriseAdminAnalyticsSkillsView(APIView):
231
237
  }
232
238
 
233
239
  return Response(data=response_data, status=HTTP_200_OK)
240
+
241
+
242
+ class EnterpriseExecEdLCModulePerformanceViewSet(EnterpriseViewSetMixin, viewsets.ReadOnlyModelViewSet):
243
+ """
244
+ View to for getting enterprise exec ed learner module performance records.
245
+ """
246
+ serializer_class = serializers.EnterpriseExecEdLCModulePerformanceSerializer
247
+ filter_backends = (filters.OrderingFilter, filters.SearchFilter)
248
+ ordering_fields = '__all__'
249
+ ordering = ('last_access',)
250
+ search_fields = (
251
+ 'username',
252
+ 'course_name'
253
+ )
254
+
255
+ def get_queryset(self):
256
+ """
257
+ Return the queryset of EnterpriseExecEdLCModulePerformance objects.
258
+ """
259
+ return EnterpriseExecEdLCModulePerformance.objects.filter(
260
+ enterprise_customer_uuid=self.kwargs['enterprise_id'],
261
+ )
@@ -0,0 +1,87 @@
1
+ # Generated by Django 4.2.14 on 2024-08-08 07:43
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('enterprise_data', '0040_auto_20240718_0536_squashed_0043_alter_enterpriselearnerenrollment_enterprise_enrollment_id'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.CreateModel(
14
+ name='EnterpriseExecEdLCModulePerformance',
15
+ fields=[
16
+ ('module_performance_unique_id', models.CharField(max_length=350, primary_key=True, serialize=False)),
17
+ ('registration_id', models.PositiveIntegerField(null=True)),
18
+ ('subsidy_transaction_id', models.UUIDField(null=True)),
19
+ ('enterprise_customer_uuid', models.UUIDField(db_index=True, null=True)),
20
+ ('ocm_lms_user_id', models.PositiveIntegerField(null=True)),
21
+ ('is_internal_subsidy', models.BooleanField(null=True)),
22
+ ('ocm_enrollment_id', models.PositiveIntegerField(null=True)),
23
+ ('ocm_courserun_key', models.CharField(max_length=255, null=True)),
24
+ ('university_name', models.CharField(max_length=500, null=True)),
25
+ ('university_abbreviation', models.CharField(max_length=255, null=True)),
26
+ ('partner_short_name', models.CharField(max_length=255, null=True)),
27
+ ('university_country', models.CharField(max_length=255, null=True)),
28
+ ('school', models.CharField(max_length=500, null=True)),
29
+ ('faculty', models.CharField(max_length=500, null=True)),
30
+ ('department', models.CharField(max_length=500, null=True)),
31
+ ('course_code', models.PositiveIntegerField(null=True)),
32
+ ('course_name', models.CharField(db_index=True, max_length=500)),
33
+ ('course_abbreviation', models.CharField(max_length=128, null=True)),
34
+ ('course_abbreviation_short', models.CharField(max_length=64, null=True)),
35
+ ('course_type', models.CharField(max_length=128, null=True)),
36
+ ('subject_vertical', models.CharField(max_length=128, null=True)),
37
+ ('presentation_abbreviation', models.CharField(max_length=128, null=True)),
38
+ ('presentation_name', models.CharField(max_length=500, null=True)),
39
+ ('presentation_code', models.PositiveIntegerField(null=True)),
40
+ ('presentation_close_date', models.DateField(null=True)),
41
+ ('presentation_start_date', models.DateField(null=True)),
42
+ ('promotion_code', models.CharField(max_length=255, null=True)),
43
+ ('promotion_category_name', models.CharField(max_length=255, null=True)),
44
+ ('product_type', models.CharField(max_length=128, null=True)),
45
+ ('product_life_cycle_status', models.CharField(max_length=128, null=True)),
46
+ ('enrolment_id', models.PositiveIntegerField(null=True)),
47
+ ('olc_user_id', models.PositiveIntegerField(null=True)),
48
+ ('first_name', models.CharField(max_length=255, null=True)),
49
+ ('last_name', models.CharField(max_length=255, null=True)),
50
+ ('username', models.CharField(db_index=True, max_length=255)),
51
+ ('status', models.CharField(max_length=128, null=True)),
52
+ ('company_name', models.CharField(max_length=255, null=True)),
53
+ ('module_number', models.PositiveIntegerField(null=True)),
54
+ ('module_name', models.CharField(max_length=255, null=True)),
55
+ ('module_1_release_date', models.DateField(null=True)),
56
+ ('last_module_release_date', models.DateField(null=True)),
57
+ ('last_module_end_date', models.DateField(null=True)),
58
+ ('final_mark', models.DecimalField(decimal_places=2, max_digits=38, null=True)),
59
+ ('assign_grade', models.DecimalField(decimal_places=2, max_digits=38, null=True)),
60
+ ('last_access', models.DateField(null=True)),
61
+ ('all_activities_completed_count', models.PositiveIntegerField(null=True)),
62
+ ('all_activities_total_count', models.PositiveIntegerField(null=True)),
63
+ ('percentage_completed_activities', models.DecimalField(decimal_places=2, max_digits=38, null=True)),
64
+ ('extensions_requested', models.PositiveIntegerField(null=True)),
65
+ ('module_grade', models.DecimalField(decimal_places=2, max_digits=38, null=True)),
66
+ ('log_viewed', models.PositiveIntegerField(null=True)),
67
+ ('hours_online', models.DecimalField(decimal_places=2, max_digits=38, null=True)),
68
+ ('orientation_module_accessed', models.CharField(max_length=128, null=True)),
69
+ ('graded_activities_completed_count', models.PositiveIntegerField(null=True)),
70
+ ('graded_activities_total_count', models.PositiveIntegerField(null=True)),
71
+ ('percentage_completed_graded_activities', models.DecimalField(decimal_places=2, max_digits=38, null=True)),
72
+ ('assessment_activities_completed_count', models.PositiveIntegerField(null=True)),
73
+ ('assessment_activities_total_count', models.PositiveIntegerField(null=True)),
74
+ ('course_material_activities_completed_count', models.PositiveIntegerField(null=True)),
75
+ ('course_material_activities_total_count', models.PositiveIntegerField(null=True)),
76
+ ('discussion_forum_activities_completed_count', models.PositiveIntegerField(null=True)),
77
+ ('discussion_forum_activities_total_count', models.PositiveIntegerField(null=True)),
78
+ ('pass_grade', models.DecimalField(decimal_places=2, max_digits=38, null=True)),
79
+ ],
80
+ options={
81
+ 'verbose_name': 'Exec Ed LC Module Performance',
82
+ 'verbose_name_plural': 'Exec Ed LC Module Performance',
83
+ 'db_table': 'exec_ed_lc_module_performance',
84
+ 'ordering': ['last_access'],
85
+ },
86
+ ),
87
+ ]
@@ -434,3 +434,97 @@ class EnterpriseUser(models.Model):
434
434
  Return uniquely identifying string representation.
435
435
  """
436
436
  return self.__str__()
437
+
438
+
439
+ class EnterpriseExecEdLCModulePerformance(models.Model):
440
+ """
441
+ Model for Exec Ed LC Module Performance.
442
+ """
443
+
444
+ objects = EnterpriseReportingModelManager()
445
+
446
+ class Meta:
447
+ app_label = 'enterprise_data'
448
+ db_table = 'exec_ed_lc_module_performance'
449
+ verbose_name = _("Exec Ed LC Module Performance")
450
+ verbose_name_plural = _("Exec Ed LC Module Performance")
451
+
452
+ module_performance_unique_id = models.CharField(max_length=350, primary_key=True)
453
+ registration_id = models.PositiveIntegerField(null=True)
454
+ subsidy_transaction_id = models.UUIDField(null=True)
455
+ enterprise_customer_uuid = models.UUIDField(db_index=True, null=True)
456
+ ocm_lms_user_id = models.PositiveIntegerField(null=True)
457
+ is_internal_subsidy = models.BooleanField(null=True)
458
+ ocm_enrollment_id = models.PositiveIntegerField(null=True)
459
+ ocm_courserun_key = models.CharField(max_length=255, null=True)
460
+ university_name = models.CharField(max_length=500, null=True)
461
+ university_abbreviation = models.CharField(max_length=255, null=True)
462
+ partner_short_name = models.CharField(max_length=255, null=True)
463
+ university_country = models.CharField(max_length=255, null=True)
464
+ school = models.CharField(max_length=500, null=True)
465
+ faculty = models.CharField(max_length=500, null=True)
466
+ department = models.CharField(max_length=500, null=True)
467
+ course_code = models.PositiveIntegerField(null=True)
468
+ course_name = models.CharField(max_length=500, db_index=True)
469
+ course_abbreviation = models.CharField(max_length=128, null=True)
470
+ course_abbreviation_short = models.CharField(max_length=64, null=True)
471
+ course_type = models.CharField(max_length=128, null=True)
472
+ subject_vertical = models.CharField(max_length=128, null=True)
473
+ presentation_abbreviation = models.CharField(max_length=128, null=True)
474
+ presentation_name = models.CharField(max_length=500, null=True)
475
+ presentation_code = models.PositiveIntegerField(null=True)
476
+ presentation_close_date = models.DateField(null=True)
477
+ presentation_start_date = models.DateField(null=True)
478
+ promotion_code = models.CharField(max_length=255, null=True)
479
+ promotion_category_name = models.CharField(max_length=255, null=True)
480
+ product_type = models.CharField(max_length=128, null=True)
481
+ product_life_cycle_status = models.CharField(max_length=128, null=True)
482
+ enrolment_id = models.PositiveIntegerField(null=True)
483
+ olc_user_id = models.PositiveIntegerField(null=True)
484
+ first_name = models.CharField(max_length=255, null=True)
485
+ last_name = models.CharField(max_length=255, null=True)
486
+ username = models.CharField(max_length=255, db_index=True)
487
+ status = models.CharField(max_length=128, null=True)
488
+ company_name = models.CharField(max_length=255, null=True)
489
+ module_number = models.PositiveIntegerField(null=True)
490
+ module_name = models.CharField(max_length=255, null=True)
491
+ module_1_release_date = models.DateField(null=True)
492
+ last_module_release_date = models.DateField(null=True)
493
+ last_module_end_date = models.DateField(null=True)
494
+ final_mark = models.DecimalField(max_digits=38, decimal_places=2, null=True)
495
+ assign_grade = models.DecimalField(max_digits=38, decimal_places=2, null=True)
496
+ last_access = models.DateField(null=True)
497
+ all_activities_completed_count = models.PositiveIntegerField(null=True)
498
+ all_activities_total_count = models.PositiveIntegerField(null=True)
499
+ percentage_completed_activities = models.DecimalField(max_digits=38, decimal_places=2, null=True)
500
+ extensions_requested = models.PositiveIntegerField(null=True)
501
+ module_grade = models.DecimalField(max_digits=38, decimal_places=2, null=True)
502
+ log_viewed = models.PositiveIntegerField(null=True)
503
+ hours_online = models.DecimalField(max_digits=38, decimal_places=2, null=True)
504
+ orientation_module_accessed = models.CharField(max_length=128, null=True)
505
+ graded_activities_completed_count = models.PositiveIntegerField(null=True)
506
+ graded_activities_total_count = models.PositiveIntegerField(null=True)
507
+ percentage_completed_graded_activities = models.DecimalField(max_digits=38, decimal_places=2, null=True)
508
+ assessment_activities_completed_count = models.PositiveIntegerField(null=True)
509
+ assessment_activities_total_count = models.PositiveIntegerField(null=True)
510
+ course_material_activities_completed_count = models.PositiveIntegerField(null=True)
511
+ course_material_activities_total_count = models.PositiveIntegerField(null=True)
512
+ discussion_forum_activities_completed_count = models.PositiveIntegerField(null=True)
513
+ discussion_forum_activities_total_count = models.PositiveIntegerField(null=True)
514
+ pass_grade = models.DecimalField(max_digits=38, decimal_places=2, null=True)
515
+
516
+ def __str__(self):
517
+ """
518
+ Return a human-readable string representation of the object.
519
+ """
520
+ return "<EnterpriseExecEdLCModulePerformance User {user} of {enterprise} in module {module}>".format(
521
+ user=self.ocm_lms_user_id,
522
+ enterprise=self.enterprise_customer_uuid,
523
+ module=self.module_number,
524
+ )
525
+
526
+ def __repr__(self):
527
+ """
528
+ Return uniquely identifying string representation.
529
+ """
530
+ return self.__str__()