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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/CHANGELOG.rst +9 -0
  2. {edx_enterprise_data-10.10.1/edx_enterprise_data.egg-info → edx_enterprise_data-10.11.1}/PKG-INFO +3 -2
  3. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1/edx_enterprise_data.egg-info}/PKG-INFO +3 -2
  4. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/edx_enterprise_data.egg-info/SOURCES.txt +9 -0
  5. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/__init__.py +1 -1
  6. edx_enterprise_data-10.11.1/enterprise_data/admin_analytics/database/filters/__init__.py +5 -0
  7. edx_enterprise_data-10.11.1/enterprise_data/admin_analytics/database/filters/base.py +7 -0
  8. edx_enterprise_data-10.11.1/enterprise_data/admin_analytics/database/filters/fact_enrollment_admin_dash.py +51 -0
  9. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py +19 -18
  10. edx_enterprise_data-10.11.1/enterprise_data/admin_analytics/database/query_filters/__init__.py +7 -0
  11. edx_enterprise_data-10.11.1/enterprise_data/admin_analytics/database/query_filters/base.py +68 -0
  12. edx_enterprise_data-10.11.1/enterprise_data/admin_analytics/database/query_filters/between.py +30 -0
  13. edx_enterprise_data-10.11.1/enterprise_data/admin_analytics/database/query_filters/equal.py +27 -0
  14. edx_enterprise_data-10.11.1/enterprise_data/admin_analytics/database/query_filters/in_.py +28 -0
  15. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py +144 -34
  16. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/api/v1/serializers.py +1 -0
  17. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/api/v1/views/analytics_enrollments.py +12 -5
  18. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/api/v1/views/enterprise_learner.py +13 -22
  19. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/clients.py +39 -7
  20. edx_enterprise_data-10.11.1/enterprise_data/exceptions.py +21 -0
  21. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/management/commands/pre_warm_analytics_cache.py +14 -8
  22. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/admin_analytics/mock_enrollments.py +5 -0
  23. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data_roles/tests/test_models.py +0 -1
  24. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/requirements/base.txt +15 -15
  25. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/requirements/ci.txt +4 -4
  26. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/requirements/dev.txt +20 -20
  27. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/requirements/pip.txt +1 -1
  28. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/requirements/quality.txt +23 -23
  29. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/requirements/test-master.txt +18 -18
  30. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/requirements/test-reporting.txt +13 -13
  31. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/requirements/test.txt +18 -18
  32. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/LICENSE +0 -0
  33. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/MANIFEST.in +0 -0
  34. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/README.md +0 -0
  35. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/edx_enterprise_data.egg-info/dependency_links.txt +0 -0
  36. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/edx_enterprise_data.egg-info/not-zip-safe +0 -0
  37. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/edx_enterprise_data.egg-info/requires.txt +0 -0
  38. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/edx_enterprise_data.egg-info/top_level.txt +0 -0
  39. {edx_enterprise_data-10.10.1/enterprise_reporting/tests → edx_enterprise_data-10.11.1/enterprise_data/admin_analytics}/__init__.py +0 -0
  40. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/admin_analytics/constants.py +0 -0
  41. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/admin_analytics/data_loaders.py +0 -0
  42. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/admin_analytics/database/__init__.py +0 -0
  43. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/admin_analytics/database/queries/__init__.py +0 -0
  44. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py +0 -0
  45. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/admin_analytics/database/queries/skills_daily_rollup_admin_dash.py +0 -0
  46. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/admin_analytics/database/tables/__init__.py +0 -0
  47. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/admin_analytics/database/tables/base.py +0 -0
  48. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py +0 -0
  49. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/admin_analytics/database/tables/skills_daily_rollup_admin_dash.py +0 -0
  50. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/admin_analytics/database/utils.py +0 -0
  51. {edx_enterprise_data-10.10.1/enterprise_reporting/fixtures → edx_enterprise_data-10.11.1/enterprise_data/api}/__init__.py +0 -0
  52. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/api/urls.py +0 -0
  53. {edx_enterprise_data-10.10.1/enterprise_data/api/v1 → edx_enterprise_data-10.11.1/enterprise_data/api/v0}/__init__.py +0 -0
  54. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/api/v0/serializers.py +0 -0
  55. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/api/v0/urls.py +0 -0
  56. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/api/v0/views.py +0 -0
  57. {edx_enterprise_data-10.10.1/enterprise_data/api/v0 → edx_enterprise_data-10.11.1/enterprise_data/api/v1}/__init__.py +0 -0
  58. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/api/v1/urls.py +0 -0
  59. {edx_enterprise_data-10.10.1/enterprise_data_roles/tests → edx_enterprise_data-10.11.1/enterprise_data/api/v1/views}/__init__.py +0 -0
  60. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/api/v1/views/analytics_completions.py +0 -0
  61. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/api/v1/views/analytics_engagements.py +0 -0
  62. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/api/v1/views/analytics_leaderboard.py +0 -0
  63. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/api/v1/views/base.py +0 -0
  64. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/api/v1/views/enterprise_admin.py +0 -0
  65. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/api/v1/views/enterprise_offers.py +0 -0
  66. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/apps.py +0 -0
  67. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/cache/__init__.py +0 -0
  68. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/cache/decorators.py +0 -0
  69. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/constants.py +0 -0
  70. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/filters.py +0 -0
  71. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/fixtures/enterprise_enrollment.json +0 -0
  72. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/fixtures/enterprise_user.json +0 -0
  73. {edx_enterprise_data-10.10.1/enterprise_data_roles/migrations → edx_enterprise_data-10.11.1/enterprise_data/management}/__init__.py +0 -0
  74. {edx_enterprise_data-10.10.1/enterprise_data/tests/api/v1/views → edx_enterprise_data-10.11.1/enterprise_data/management/commands}/__init__.py +0 -0
  75. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/management/commands/create_dummy_data.py +0 -0
  76. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/management/commands/create_dummy_data_lpr_v1.py +0 -0
  77. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/management/commands/create_enterprise_enrollment.py +0 -0
  78. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/management/commands/create_enterprise_learner_enrollment_lpr_v1.py +0 -0
  79. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py +0 -0
  80. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/management/commands/create_enterprise_offer.py +0 -0
  81. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/management/commands/create_enterprise_user.py +0 -0
  82. {edx_enterprise_data-10.10.1/enterprise_data/tests/api/v1 → edx_enterprise_data-10.11.1/enterprise_data/management/commands/tests}/__init__.py +0 -0
  83. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/management/commands/tests/test_create_dummy_data_lpr_v1.py +0 -0
  84. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/management/commands/tests/test_create_enterprise_enrollment.py +0 -0
  85. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py +0 -0
  86. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py +0 -0
  87. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/management/commands/tests/test_create_enterprise_user.py +0 -0
  88. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/management/commands/tests/test_pre_warm_analytics_cache.py +0 -0
  89. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0001_initial.py +0 -0
  90. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0002_auto_20180430_1358.py +0 -0
  91. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0003_auto_20180501_0603.py +0 -0
  92. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0004_auto_20180501_0928.py +0 -0
  93. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0004_auto_20180508_1652.py +0 -0
  94. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0005_auto_20180524_2204.py +0 -0
  95. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0006_auto_20180612_0336.py +0 -0
  96. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0007_auto_20180612_0534.py +0 -0
  97. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0008_auto_20180614_0108.py +0 -0
  98. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0009_auto_20180628_1152.py +0 -0
  99. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0010_enterpriseenrollment_created.py +0 -0
  100. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0011_enterpriseuser.py +0 -0
  101. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0012_auto_20180831_1930.py +0 -0
  102. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0013_auto_20180831_1931.py +0 -0
  103. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0014_enterpriseuser_created.py +0 -0
  104. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0015_auto_20180907_1757.py +0 -0
  105. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0016_auto_20180924_2138.py +0 -0
  106. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0017_enterpriseenrollment_unenrollment_timestamp.py +0 -0
  107. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0018_enterprisedatafeaturerole_enterprisedataroleassignment.py +0 -0
  108. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0019_add_enterprise_data_feature_roles.py +0 -0
  109. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0020_add_role_based_access_control_switch.py +0 -0
  110. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0021_auto_20190329_1241.py +0 -0
  111. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0022_remove_role_based_access_control_switch.py +0 -0
  112. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0023_enterpriselearner_enterpriselearnerenrollment.py +0 -0
  113. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0024_auto_20210602_1811.py +0 -0
  114. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0025_auto_20210703_1854.py +0 -0
  115. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0026_auto_20210916_0414.py +0 -0
  116. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0027_enterpriselearnerenrollment_total_learning_time_seconds.py +0 -0
  117. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0028_enterpriselearnerenrollment_offer_id.py +0 -0
  118. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0029_enterpriseoffer.py +0 -0
  119. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0030_auto_20230609_1353.py +0 -0
  120. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0031_auto_20230615_0705.py +0 -0
  121. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0032_auto_20230704_0818.py +0 -0
  122. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0033_enterpriseadminlearnerprogress_enterpriseadminsummarizeinsights.py +0 -0
  123. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0034_auto_20230907_0834.py +0 -0
  124. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0035_auto_20230907_1154.py +0 -0
  125. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0036_enterprisesubsidybudget_subsidy_access_policy_display_name.py +0 -0
  126. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0037_alter_enterpriseenrollment_consent_granted.py +0 -0
  127. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0038_enterpriseoffer_export_timestamp.py +0 -0
  128. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0039_auto_20240212_1403.py +0 -0
  129. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0040_auto_20240718_0536_squashed_0043_alter_enterpriselearnerenrollment_enterprise_enrollment_id.py +0 -0
  130. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0044_enterpriseexecedlcmoduleperformance.py +0 -0
  131. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0045_alter_enterpriseexecedlcmoduleperformance_options_and_more.py +0 -0
  132. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0046_enterprisegroupmembership.py +0 -0
  133. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0047_enterpriseexecedlcmoduleperformance_avg_after_lo_score_and_more.py +0 -0
  134. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/migrations/0048_alter_enterpriseexecedlcmoduleperformance_avg_after_lo_score_and_more.py +0 -0
  135. {edx_enterprise_data-10.10.1/enterprise_data/tests/api/v0 → edx_enterprise_data-10.11.1/enterprise_data/migrations}/__init__.py +0 -0
  136. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/models.py +0 -0
  137. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/paginators.py +0 -0
  138. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/renderers.py +0 -0
  139. {edx_enterprise_data-10.10.1/enterprise_data/tests/api → edx_enterprise_data-10.11.1/enterprise_data/settings}/__init__.py +0 -0
  140. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/settings/test.py +0 -0
  141. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/signals.py +0 -0
  142. {edx_enterprise_data-10.10.1/enterprise_data/tests/admin_analytics → edx_enterprise_data-10.11.1/enterprise_data/tests}/__init__.py +0 -0
  143. {edx_enterprise_data-10.10.1/enterprise_data/tests → edx_enterprise_data-10.11.1/enterprise_data/tests/admin_analytics}/__init__.py +0 -0
  144. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/admin_analytics/mock_analytics_data.py +0 -0
  145. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/admin_analytics/test_analytics_engagements.py +0 -0
  146. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/admin_analytics/test_analytics_enrollments.py +0 -0
  147. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/admin_analytics/test_analytics_leaderboard.py +0 -0
  148. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/admin_analytics/test_data_loaders.py +0 -0
  149. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/admin_analytics/test_enterprise_completions.py +0 -0
  150. {edx_enterprise_data-10.10.1/enterprise_data/settings → edx_enterprise_data-10.11.1/enterprise_data/tests/api}/__init__.py +0 -0
  151. {edx_enterprise_data-10.10.1/enterprise_data/migrations → edx_enterprise_data-10.11.1/enterprise_data/tests/api/v0}/__init__.py +0 -0
  152. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/api/v0/test_serializers.py +0 -0
  153. {edx_enterprise_data-10.10.1/enterprise_data/management/commands/tests → edx_enterprise_data-10.11.1/enterprise_data/tests/api/v1}/__init__.py +0 -0
  154. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/api/v1/test_serializers.py +0 -0
  155. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/api/v1/test_views.py +0 -0
  156. {edx_enterprise_data-10.10.1/enterprise_data/management/commands → edx_enterprise_data-10.11.1/enterprise_data/tests/api/v1/views}/__init__.py +0 -0
  157. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/api/v1/views/test_enterprise_admin.py +0 -0
  158. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/factories.py +0 -0
  159. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/mixins.py +0 -0
  160. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/test_clients.py +0 -0
  161. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/test_filters.py +0 -0
  162. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/test_models.py +0 -0
  163. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/test_utils.py +0 -0
  164. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/tests/test_views.py +0 -0
  165. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/urls.py +0 -0
  166. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data/utils.py +0 -0
  167. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data_roles/__init__.py +0 -0
  168. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data_roles/admin.py +0 -0
  169. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data_roles/apps.py +0 -0
  170. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data_roles/constants.py +0 -0
  171. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data_roles/migrations/0001_initial.py +0 -0
  172. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data_roles/migrations/0002_add_enterprise_data_feature_roles.py +0 -0
  173. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data_roles/migrations/0003_add_role_based_access_control_switch.py +0 -0
  174. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data_roles/migrations/0004_enterprisedataroleassignment_enterprise_id.py +0 -0
  175. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data_roles/migrations/0005_turn_on_role_based_access_control_switch.py +0 -0
  176. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data_roles/migrations/0006_remove_role_based_access_control_switch.py +0 -0
  177. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data_roles/migrations/0007_enterprisedataroleassignment_applies_to_all_contexts.py +0 -0
  178. {edx_enterprise_data-10.10.1/enterprise_data/management → edx_enterprise_data-10.11.1/enterprise_data_roles/migrations}/__init__.py +0 -0
  179. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data_roles/models.py +0 -0
  180. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data_roles/rules.py +0 -0
  181. {edx_enterprise_data-10.10.1/enterprise_data/api/v1/views → edx_enterprise_data-10.11.1/enterprise_data_roles/tests}/__init__.py +0 -0
  182. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_data_roles/tests/factories.py +0 -0
  183. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/__init__.py +0 -0
  184. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/clients/__init__.py +0 -0
  185. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/clients/enterprise.py +0 -0
  186. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/clients/s3.py +0 -0
  187. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/clients/snowflake.py +0 -0
  188. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/clients/vertica.py +0 -0
  189. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/constants.py +0 -0
  190. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/delivery_method.py +0 -0
  191. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/external_resource_link_report.py +0 -0
  192. {edx_enterprise_data-10.10.1/enterprise_data/api → edx_enterprise_data-10.11.1/enterprise_reporting/fixtures}/__init__.py +0 -0
  193. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/fixtures/enterprise_customer_reporting.json +0 -0
  194. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/reporter.py +0 -0
  195. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/send_enterprise_reports.py +0 -0
  196. {edx_enterprise_data-10.10.1/enterprise_data/admin_analytics → edx_enterprise_data-10.11.1/enterprise_reporting/tests}/__init__.py +0 -0
  197. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/tests/test_clients.py +0 -0
  198. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/tests/test_delivery_method.py +0 -0
  199. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/tests/test_enterprise_client.py +0 -0
  200. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/tests/test_external_link_report.py +0 -0
  201. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/tests/test_reporter.py +0 -0
  202. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/tests/test_send_enterprise_reports.py +0 -0
  203. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/tests/test_utils.py +0 -0
  204. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/tests/test_vertica_client.py +0 -0
  205. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/tests/utils.py +0 -0
  206. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/enterprise_reporting/utils.py +0 -0
  207. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/requirements/base.in +0 -0
  208. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/requirements/common_constraints.txt +0 -0
  209. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/requirements/constraints.txt +0 -0
  210. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/requirements/django.txt +0 -0
  211. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/requirements/pip_tools.txt +0 -0
  212. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/requirements/reporting.in +0 -0
  213. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/setup.cfg +0 -0
  214. {edx_enterprise_data-10.10.1 → edx_enterprise_data-10.11.1}/setup.py +0 -0
@@ -15,6 +15,15 @@ Unreleased
15
15
  ----------
16
16
 
17
17
  =========================
18
+ [10.11.1] - 2025-04-08
19
+ ---------------------
20
+ * fix: Fixed a bug in group_uuid based filtering.
21
+
22
+
23
+ [10.11.0] - 2025-03-25
24
+ ---------------------
25
+ * feat: Added the ability to filter enrollments by group_uuid in the enterprise enrollments API.
26
+
18
27
  [10.10.1] - 2025-03-18
19
28
  ---------------------
20
29
  * fix: Updated FROM email address to a provisioned email address.
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: edx-enterprise-data
3
- Version: 10.10.1
3
+ Version: 10.11.1
4
4
  Summary: Enterprise Reporting
5
5
  Home-page: https://github.com/openedx/edx-enterprise-data
6
6
  Author: edX
@@ -45,6 +45,7 @@ Dynamic: classifier
45
45
  Dynamic: description
46
46
  Dynamic: home-page
47
47
  Dynamic: license
48
+ Dynamic: license-file
48
49
  Dynamic: provides-extra
49
50
  Dynamic: requires-dist
50
51
  Dynamic: summary
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: edx-enterprise-data
3
- Version: 10.10.1
3
+ Version: 10.11.1
4
4
  Summary: Enterprise Reporting
5
5
  Home-page: https://github.com/openedx/edx-enterprise-data
6
6
  Author: edX
@@ -45,6 +45,7 @@ Dynamic: classifier
45
45
  Dynamic: description
46
46
  Dynamic: home-page
47
47
  Dynamic: license
48
+ Dynamic: license-file
48
49
  Dynamic: provides-extra
49
50
  Dynamic: requires-dist
50
51
  Dynamic: summary
@@ -13,6 +13,7 @@ enterprise_data/__init__.py
13
13
  enterprise_data/apps.py
14
14
  enterprise_data/clients.py
15
15
  enterprise_data/constants.py
16
+ enterprise_data/exceptions.py
16
17
  enterprise_data/filters.py
17
18
  enterprise_data/models.py
18
19
  enterprise_data/paginators.py
@@ -25,10 +26,18 @@ enterprise_data/admin_analytics/constants.py
25
26
  enterprise_data/admin_analytics/data_loaders.py
26
27
  enterprise_data/admin_analytics/database/__init__.py
27
28
  enterprise_data/admin_analytics/database/utils.py
29
+ enterprise_data/admin_analytics/database/filters/__init__.py
30
+ enterprise_data/admin_analytics/database/filters/base.py
31
+ enterprise_data/admin_analytics/database/filters/fact_enrollment_admin_dash.py
28
32
  enterprise_data/admin_analytics/database/queries/__init__.py
29
33
  enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py
30
34
  enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py
31
35
  enterprise_data/admin_analytics/database/queries/skills_daily_rollup_admin_dash.py
36
+ enterprise_data/admin_analytics/database/query_filters/__init__.py
37
+ enterprise_data/admin_analytics/database/query_filters/base.py
38
+ enterprise_data/admin_analytics/database/query_filters/between.py
39
+ enterprise_data/admin_analytics/database/query_filters/equal.py
40
+ enterprise_data/admin_analytics/database/query_filters/in_.py
32
41
  enterprise_data/admin_analytics/database/tables/__init__.py
33
42
  enterprise_data/admin_analytics/database/tables/base.py
34
43
  enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py
@@ -2,4 +2,4 @@
2
2
  Enterprise data api application. This Django app exposes API endpoints used by enterprises.
3
3
  """
4
4
 
5
- __version__ = "10.10.1"
5
+ __version__ = "10.11.1"
@@ -0,0 +1,5 @@
1
+ """
2
+ Query Filters for database tables.
3
+ """
4
+
5
+ from .fact_enrollment_admin_dash import FactEnrollmentAdminDashFilters
@@ -0,0 +1,7 @@
1
+ """
2
+ Base filters for database tables.
3
+ """
4
+
5
+
6
+ class BaseFilter:
7
+ pass
@@ -0,0 +1,51 @@
1
+ """
2
+ Query filters for enrollments table.
3
+ """
4
+ from enterprise_data.admin_analytics.database.filters.base import BaseFilter
5
+ from enterprise_data.admin_analytics.database.query_filters import BetweenQueryFilter, EqualQueryFilter, INQueryFilter
6
+
7
+
8
+ class FactEnrollmentAdminDashFilters(BaseFilter):
9
+ """
10
+ Query filters for enrollments table.
11
+ """
12
+ @staticmethod
13
+ def enterprise_customer_uuid_filter(enterprise_customer_uuid_params_key: str) -> EqualQueryFilter:
14
+ """
15
+ Filter by enterprise customer uuid.
16
+
17
+ Arguments:
18
+ enterprise_customer_uuid_params_key: The key against which value will be passed in the query.
19
+ """
20
+ return EqualQueryFilter(
21
+ column='enterprise_customer_uuid',
22
+ value_placeholder=enterprise_customer_uuid_params_key,
23
+ )
24
+
25
+ @staticmethod
26
+ def enterprise_enrollment_date_range_filter(
27
+ start_date_params_key: str, end_date_params_key: str
28
+ ) -> BetweenQueryFilter:
29
+ """
30
+ Filter by enrollment date to be in the given range.
31
+
32
+ Arguments:
33
+ start_date_params_key (str): The start date key against which value will be passed in the query.
34
+ end_date_params_key (str): The end date key against which value will be passed in the query.
35
+ """
36
+ return BetweenQueryFilter(
37
+ column='enterprise_enrollment_date',
38
+ range_placeholders=(start_date_params_key, end_date_params_key),
39
+ )
40
+
41
+ @staticmethod
42
+ def enterprise_user_id_in_filter(
43
+ enterprise_user_id_param_keys: list,
44
+ ) -> INQueryFilter:
45
+ """
46
+ Filter by enterprise user id.
47
+ """
48
+ return INQueryFilter(
49
+ column='enterprise_user_id',
50
+ values_placeholders=enterprise_user_id_param_keys
51
+ )
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Module containing queries for the fact_enrollment_admin_dash table.
3
3
  """
4
+ from ..query_filters import QueryFilters
4
5
 
5
6
 
6
7
  class FactEnrollmentAdminDashQueries:
@@ -20,27 +21,25 @@ class FactEnrollmentAdminDashQueries:
20
21
  """
21
22
 
22
23
  @staticmethod
23
- def get_enrollment_count_query():
24
+ def get_enrollment_count_query(query_filters: QueryFilters) -> str:
24
25
  """
25
26
  Get the query to fetch the total number of enrollments for an enterprise customer.
26
27
  """
27
- return """
28
+ return f"""
28
29
  SELECT count(*)
29
30
  FROM fact_enrollment_admin_dash
30
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
31
- enterprise_enrollment_date BETWEEN %(start_date)s AND %(end_date)s;
31
+ WHERE {query_filters.to_sql()};
32
32
  """
33
33
 
34
34
  @staticmethod
35
- def get_all_enrollments_query():
35
+ def get_all_enrollments_query(query_filters: QueryFilters) -> str:
36
36
  """
37
37
  Get the query to fetch all enrollments.
38
38
  """
39
- return """
39
+ return f"""
40
40
  SELECT email, course_title, course_subject, enroll_type, enterprise_enrollment_date
41
41
  FROM fact_enrollment_admin_dash
42
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
43
- enterprise_enrollment_date BETWEEN %(start_date)s AND %(end_date)s
42
+ WHERE {query_filters.to_sql()}
44
43
  ORDER BY ENTERPRISE_ENROLLMENT_DATE DESC LIMIT %(limit)s OFFSET %(offset)s
45
44
  """
46
45
 
@@ -98,21 +97,21 @@ class FactEnrollmentAdminDashQueries:
98
97
  """
99
98
 
100
99
  @staticmethod
101
- def get_top_courses_by_enrollments_query(record_count=10):
100
+ def get_top_courses_by_enrollments_query(query_filters: QueryFilters, record_count: int = 10) -> str:
102
101
  """
103
102
  Get the query to fetch the enrollment count by courses.
104
103
 
105
104
  Query will fetch the top N courses by enrollment count. Where N is the value of record_count.
106
105
 
107
106
  Arguments:
107
+ query_filters (QueryFilters): List of query filters.
108
108
  record_count (int): Number of records to fetch.
109
109
  """
110
110
  return f"""
111
111
  WITH filtered_data AS (
112
112
  SELECT *
113
113
  FROM fact_enrollment_admin_dash
114
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
115
- enterprise_enrollment_date BETWEEN %(start_date)s AND %(end_date)s
114
+ WHERE {query_filters.to_sql()}
116
115
  ),
117
116
  top_10_courses AS (
118
117
  SELECT course_key
@@ -134,7 +133,7 @@ class FactEnrollmentAdminDashQueries:
134
133
  """
135
134
 
136
135
  @staticmethod
137
- def get_top_subjects_by_enrollments_query(record_count=10):
136
+ def get_top_subjects_by_enrollments_query(query_filters: QueryFilters, record_count: int = 10) -> str:
138
137
  """
139
138
  Get the query to fetch the enrollment count by subjects.
140
139
 
@@ -142,13 +141,13 @@ class FactEnrollmentAdminDashQueries:
142
141
 
143
142
  Arguments:
144
143
  record_count (int): Number of records to fetch.
144
+ query_filters (QueryFilters): List of query filters.
145
145
  """
146
146
  return f"""
147
147
  WITH filtered_data AS (
148
148
  SELECT *
149
149
  FROM fact_enrollment_admin_dash
150
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
151
- enterprise_enrollment_date BETWEEN %(start_date)s AND %(end_date)s
150
+ WHERE {query_filters.to_sql()}
152
151
  ),
153
152
  top_10_subjects AS (
154
153
  SELECT course_subject
@@ -168,15 +167,17 @@ class FactEnrollmentAdminDashQueries:
168
167
  """
169
168
 
170
169
  @staticmethod
171
- def get_enrolment_time_series_data_query():
170
+ def get_enrolment_time_series_data_query(query_filters: QueryFilters) -> str:
172
171
  """
173
172
  Get the query to fetch the enrollment time series data with daily aggregation.
173
+
174
+ Arguments:
175
+ query_filters (QueryFilters): A list of filters for this query.
174
176
  """
175
- return """
177
+ return f"""
176
178
  SELECT enterprise_enrollment_date, enroll_type, COUNT(*) as enrollment_count
177
179
  FROM fact_enrollment_admin_dash
178
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
179
- enterprise_enrollment_date BETWEEN %(start_date)s AND %(end_date)s
180
+ WHERE {query_filters.to_sql()}
180
181
  GROUP BY enterprise_enrollment_date, enroll_type
181
182
  ORDER BY enterprise_enrollment_date;
182
183
  """
@@ -0,0 +1,7 @@
1
+ """
2
+ Query Filters to filter query data.
3
+ """
4
+ from .base import QueryFilters
5
+ from .between import BetweenQueryFilter
6
+ from .equal import EqualQueryFilter
7
+ from .in_ import INQueryFilter
@@ -0,0 +1,68 @@
1
+ """
2
+ Base Query Filter.
3
+ """
4
+ from abc import ABC, abstractmethod
5
+
6
+
7
+ class QueryFilter(ABC):
8
+ """
9
+ Base Query filter class for functionality common to all filters.
10
+ """
11
+ @abstractmethod
12
+ def to_sql(self) -> str:
13
+ """
14
+ Convert the filter to a SQL string.
15
+ """
16
+ raise NotImplementedError
17
+
18
+ @staticmethod
19
+ def validate_argument_exclusivity(value, value_placeholder):
20
+ """
21
+ Validate that that arguments are mutually exclusive.
22
+
23
+ This method will make sure that at-least one of the value or value_placeholder is provided. it will also
24
+ make sure that both value and value_placeholder are not provided at the same time.
25
+
26
+ Arguments:
27
+ value: The value of the filter.
28
+ value_placeholder: The placeholder for the value.
29
+ """
30
+ if value is not None and value_placeholder is not None:
31
+ raise ValueError('Both value and value_placeholder cannot be provided at the same time.')
32
+ if value is None and value_placeholder is None:
33
+ raise ValueError('Either value or value_placeholder must be provided.')
34
+ return True
35
+
36
+ def value_to_sql(self, value):
37
+ """
38
+ Convert the given value to a string in a way that it can be used inside WHERE clause of SQL query.
39
+
40
+ Note: This method is meant to evolve according to user needs. currently it handles the following data types.
41
+ More types can be added as needed.
42
+
43
+ 1. str: Encloses the string in single quotes.
44
+ 2. list<str>: Encloses the list of strings in a tuple after calling this method recursively on each item.
45
+
46
+ Arguments:
47
+ value (Any): The value to format.
48
+
49
+ Returns:
50
+ (Any): The formatted value.
51
+ """
52
+ if isinstance(value, str):
53
+ return f"'{value}'"
54
+ if isinstance(value, list):
55
+ return [self.value_to_sql(item) for item in value]
56
+
57
+ return value
58
+
59
+
60
+ class QueryFilters(list):
61
+ """
62
+ A list of QueryFilter objects.
63
+ """
64
+ def to_sql(self) -> str:
65
+ """
66
+ Convert the filters to a SQL string.
67
+ """
68
+ return ' AND '.join([_filter.to_sql() for _filter in self])
@@ -0,0 +1,30 @@
1
+ """
2
+ Query filter for between operation.
3
+ """
4
+ from .base import QueryFilter
5
+
6
+
7
+ class BetweenQueryFilter(QueryFilter):
8
+ """
9
+ Query filter for between operation.
10
+ """
11
+
12
+ def __init__(self, column: str, _range: tuple = None, range_placeholders: tuple = None):
13
+ """
14
+ Initialize the filter.
15
+
16
+ This will also validate arguments.
17
+ """
18
+ self.validate_argument_exclusivity(_range, range_placeholders)
19
+
20
+ self.column = column
21
+ self.range = _range
22
+ self.range_placeholders = range_placeholders
23
+
24
+ def to_sql(self) -> str:
25
+ if self.range:
26
+ lower, upper = self.range
27
+ return f'{self.column} BETWEEN {self.value_to_sql(lower)} AND {self.value_to_sql(upper)}'
28
+ else:
29
+ lower_placeholder, upper_placeholder = self.range_placeholders
30
+ return f'{self.column} BETWEEN %({lower_placeholder})s AND %({upper_placeholder})s'
@@ -0,0 +1,27 @@
1
+ """
2
+ Query filter for equal operation.
3
+ """
4
+ from .base import QueryFilter
5
+
6
+
7
+ class EqualQueryFilter(QueryFilter):
8
+ """
9
+ Query filter for equal operation.
10
+ """
11
+ def __init__(self, column: str, value: str = None, value_placeholder: str = None):
12
+ """
13
+ Initialize the filter.
14
+
15
+ This will also validate arguments.
16
+ """
17
+ self.validate_argument_exclusivity(value, value_placeholder)
18
+
19
+ self.column = column
20
+ self.value = value
21
+ self.value_placeholder = value_placeholder
22
+
23
+ def to_sql(self) -> str:
24
+ if self.value is not None:
25
+ return f'{self.column} = {self.value_to_sql(self.value)}'
26
+ else:
27
+ return f'{self.column} = %({self.value_placeholder})s'
@@ -0,0 +1,28 @@
1
+ """
2
+ Query filter for between operation.
3
+ """
4
+ from .base import QueryFilter
5
+
6
+
7
+ class INQueryFilter(QueryFilter):
8
+ """
9
+ Query filter for IN operation.
10
+ """
11
+
12
+ def __init__(self, column: str, values: list = None, values_placeholders: list = None):
13
+ """
14
+ Initialize the filter.
15
+
16
+ This will also validate arguments.
17
+ """
18
+ self.validate_argument_exclusivity(values, values_placeholders)
19
+
20
+ self.column = column
21
+ self.values = values
22
+ self.values_placeholders = values_placeholders
23
+
24
+ def to_sql(self) -> str:
25
+ if self.values is not None:
26
+ return f'{self.column} IN {str(tuple(self.value_to_sql(self.values)))}'
27
+ else:
28
+ return f'{self.column} IN {tuple(f"%({item})s" for item in self.values_placeholders)}'