edx-enterprise-data 10.11.1__py3-none-any.whl → 10.13.0__py3-none-any.whl

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 (22) hide show
  1. {edx_enterprise_data-10.11.1.dist-info → edx_enterprise_data-10.13.0.dist-info}/METADATA +1 -1
  2. {edx_enterprise_data-10.11.1.dist-info → edx_enterprise_data-10.13.0.dist-info}/RECORD +22 -19
  3. enterprise_data/__init__.py +1 -1
  4. enterprise_data/admin_analytics/database/filters/__init__.py +2 -0
  5. enterprise_data/admin_analytics/database/filters/fact_completion_admin_dash.py +22 -0
  6. enterprise_data/admin_analytics/database/filters/fact_engagement_admin_dash.py +11 -0
  7. enterprise_data/admin_analytics/database/filters/fact_enrollment_admin_dash.py +2 -42
  8. enterprise_data/admin_analytics/database/filters/mixins.py +84 -0
  9. enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py +13 -18
  10. enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py +20 -24
  11. enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py +103 -33
  12. enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py +96 -74
  13. enterprise_data/api/v1/serializers.py +1 -0
  14. enterprise_data/api/v1/views/analytics_completions.py +11 -5
  15. enterprise_data/api/v1/views/analytics_engagements.py +10 -5
  16. enterprise_data/api/v1/views/enterprise_admin.py +2 -1
  17. enterprise_data/management/commands/pre_warm_analytics_cache.py +11 -0
  18. enterprise_data/tests/api/v1/views/test_enterprise_admin.py +5 -4
  19. enterprise_reporting/tests/test_delivery_method.py +1 -1
  20. {edx_enterprise_data-10.11.1.dist-info → edx_enterprise_data-10.13.0.dist-info}/WHEEL +0 -0
  21. {edx_enterprise_data-10.11.1.dist-info → edx_enterprise_data-10.13.0.dist-info}/licenses/LICENSE +0 -0
  22. {edx_enterprise_data-10.11.1.dist-info → edx_enterprise_data-10.13.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edx-enterprise-data
3
- Version: 10.11.1
3
+ Version: 10.13.0
4
4
  Summary: Enterprise Reporting
5
5
  Home-page: https://github.com/openedx/edx-enterprise-data
6
6
  Author: edX
@@ -1,5 +1,5 @@
1
- edx_enterprise_data-10.11.1.dist-info/licenses/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
2
- enterprise_data/__init__.py,sha256=j6aLs1tTZrhX0hqVukHt4A3LxK06eXBgt0DlKcYKKK4,125
1
+ edx_enterprise_data-10.13.0.dist-info/licenses/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
2
+ enterprise_data/__init__.py,sha256=6b64KfpVwhIK3wktzVb4OEjFotuixZTyDM-kl7XnqaI,125
3
3
  enterprise_data/apps.py,sha256=aF6hZwDfI2oWj95tUTm_2ikHueQj-jLj-u0GrgzpsQI,414
4
4
  enterprise_data/clients.py,sha256=glw-fXu3V7rKEpiUBF056gZEdNK4KnWcP9tNYELimRQ,6566
5
5
  enterprise_data/constants.py,sha256=uCKjfpdlMYFZJsAj3n9RMw4Cmg5_6s3NuwocO-fch3s,238
@@ -16,12 +16,15 @@ enterprise_data/admin_analytics/constants.py,sha256=-6uLAq5DUeA_rv5eUb9SeqlG3iVW
16
16
  enterprise_data/admin_analytics/data_loaders.py,sha256=b6RjEIxCol8ETQMY7QfwhqN9eEAvrUN_UldIG7rgsSY,736
17
17
  enterprise_data/admin_analytics/database/__init__.py,sha256=vNSWKf2VV5xMegN7htJJtxtQEb0ASLC6frE2w0ZpYpE,104
18
18
  enterprise_data/admin_analytics/database/utils.py,sha256=5u-d6ZQW95mF_r4bH8Xdi7DgpYAuDFOG_q0P-bjKXHU,1712
19
- enterprise_data/admin_analytics/database/filters/__init__.py,sha256=ZteBm55429cn8zaUVYHRFA7InQPWP0b4XiZeq24HQT4,115
19
+ enterprise_data/admin_analytics/database/filters/__init__.py,sha256=qzRLCsLTocvaFKpHIB3juyVsxaQ3ByO3YNeSAYkUsHc,257
20
20
  enterprise_data/admin_analytics/database/filters/base.py,sha256=nOek6XgHEVBKUTGk-K0PZpy0RSZB3D7kc8OD5nlqXcE,71
21
- enterprise_data/admin_analytics/database/filters/fact_enrollment_admin_dash.py,sha256=WKRBWRCujiMay2ePdl9vnNN1ux-LO0edyb79W4dm-S4,1808
21
+ enterprise_data/admin_analytics/database/filters/fact_completion_admin_dash.py,sha256=pklKo12Vxm3rfNGE4qUiFmb9mZ526MhONPDzoJ-o0DM,679
22
+ enterprise_data/admin_analytics/database/filters/fact_engagement_admin_dash.py,sha256=ljdCbRbPS26qJaG6RnqepqwFgiE9GIQnR1uyQRlU5RM,334
23
+ enterprise_data/admin_analytics/database/filters/fact_enrollment_admin_dash.py,sha256=X7aVTii8hS49rSRf8EtZZKxsSZR64tX3TsEsLiHfVUg,338
24
+ enterprise_data/admin_analytics/database/filters/mixins.py,sha256=FOtOKvcugQC8eofli8Pf2vi8EKKXoWHem1CVaLw7moA,3064
22
25
  enterprise_data/admin_analytics/database/queries/__init__.py,sha256=IC5TLOr_GnydbrVbl2mWhwO3aUbYeHuDmfPTLmwGhZA,218
23
- enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py,sha256=eLy9GT0gFGLbw8yZZdEaeCAw0pTEUsy0-Ud5g2T9T80,10836
24
- enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py,sha256=0YbIQvNL8pgi-apsoYzBSnDeouiqZIUlYzIH4xkbY_w,10942
26
+ enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py,sha256=RejAfiNGr0i3wyNe5bsqFOcdRKCGp-tbqS04ibgLi5I,10393
27
+ enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py,sha256=n_RiqraVzYvCsgLaPmpSBUX3cyNEHjSnkNH7n35gC80,10609
25
28
  enterprise_data/admin_analytics/database/queries/skills_daily_rollup_admin_dash.py,sha256=ZaJPghTrQvBGsFxfpeR8EE45ujtaYI9R_xkoDDqD2So,4269
26
29
  enterprise_data/admin_analytics/database/query_filters/__init__.py,sha256=xW9cf5KGpMs33tTlil5gzKq4RxcZVCJZESsrHo2X0E4,182
27
30
  enterprise_data/admin_analytics/database/query_filters/base.py,sha256=XZUC1AIaDPBq0cwh2Xn5wp_DZfsD3HnMMvqFUt7iM2E,2205
@@ -30,8 +33,8 @@ enterprise_data/admin_analytics/database/query_filters/equal.py,sha256=Z4OPVSZmo
30
33
  enterprise_data/admin_analytics/database/query_filters/in_.py,sha256=RsqDVTgzJ0vvEMmtyefPNZh8U3eShLp7ZqY_J5oC45E,802
31
34
  enterprise_data/admin_analytics/database/tables/__init__.py,sha256=Z-c3P9hqR-dC9uYKe63qHkQG9Nms8cLE2jRN-4jeMM0,289
32
35
  enterprise_data/admin_analytics/database/tables/base.py,sha256=1KyKsC18pW3m-5U-T6pdt5rIwsz6Wp3QFFbD3r6L6YQ,395
33
- enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py,sha256=VMUGwfrUsYd_NnxEDNBovAmHwhdTCSImGA6JjHzknhk,12959
34
- enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py,sha256=okRav232A2TD2WzVsOq_HHOm3itp_-uJB6uUxypykLI,15864
36
+ enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py,sha256=wAnpNgh1USAQKi86JdEy4KJ_d_IL2fbKKu3ypqi5BCs,15434
37
+ enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py,sha256=BwchyH1VJy8Ie-m_ma3bXiKKkNtJhb8A0u37hjocyiU,17049
35
38
  enterprise_data/admin_analytics/database/tables/skills_daily_rollup_admin_dash.py,sha256=3xNwSi0wfCyBHcXPd6-9Ujs1NUm8kmZRg_gPrZzp9nQ,3233
36
39
  enterprise_data/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
40
  enterprise_data/api/urls.py,sha256=POqc_KATHdnpMf9zHtpO46pKD5KAlAExtx7G6iylLcU,273
@@ -40,15 +43,15 @@ enterprise_data/api/v0/serializers.py,sha256=dngZTk6DhRxApchQKCMp1B_c8aVnQtH0NCq
40
43
  enterprise_data/api/v0/urls.py,sha256=vzJjqIo_S3AXWs9Us8XTaJc3FnxLbYzAkmLyuDQqum0,699
41
44
  enterprise_data/api/v0/views.py,sha256=4RslZ4NZOU-844bnebEQ71ji2utRY7jEijqC45oQQD0,14380
42
45
  enterprise_data/api/v1/__init__.py,sha256=1aAzAYU5hk-RW6cKUxa1645cbZMxn7GIZ7OMjWc9MKI,46
43
- enterprise_data/api/v1/serializers.py,sha256=U3zxiideqwpoJuofI0dkx0AwbN2GUiELxqJIXIVwI9s,13843
46
+ enterprise_data/api/v1/serializers.py,sha256=6yxUe_7UBh80e2ZPZIf1AUzzgtKM8-yS38Q4Katqbj8,13898
44
47
  enterprise_data/api/v1/urls.py,sha256=Wl1xLboPg-Lq1ZvjAWf51JKYkHlmx02Kpq1nwfDyS8s,4372
45
48
  enterprise_data/api/v1/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
- enterprise_data/api/v1/views/analytics_completions.py,sha256=esFbJ5q8ssnm2Mfbc3rZXtiGHF-MeM4KQ4Ft3N7wwHU,6260
47
- enterprise_data/api/v1/views/analytics_engagements.py,sha256=Yo-bpA-0xOQHUPTFF0jHWxjm6KpSC-l2nGxhYX0ajBk,6298
49
+ enterprise_data/api/v1/views/analytics_completions.py,sha256=ALkoUTgvaqCxpjnf3rkvwBT7-Hv7eM1RnCdRboCQgR8,6540
50
+ enterprise_data/api/v1/views/analytics_engagements.py,sha256=XHJ_sfGyeamCW4krEazHzOMDGjK5qwIDvZ1IJRUgLaE,6577
48
51
  enterprise_data/api/v1/views/analytics_enrollments.py,sha256=_KBo4RhEmfQXcCOgvowD28WCVJwlc4APuCnRDbAYK9E,6563
49
52
  enterprise_data/api/v1/views/analytics_leaderboard.py,sha256=3dyo7_OhyGEEeibemBrRsUOo0jbM4LbDgV5gw3YnVig,4186
50
53
  enterprise_data/api/v1/views/base.py,sha256=Kkmd5zgEBAhvwS_GoGXSK6lgbDNwSPioYn-QbnizI3w,3416
51
- enterprise_data/api/v1/views/enterprise_admin.py,sha256=xxpb48cjuHkFJH-IQG0DwOvdH8RgyYD-aQjyfMMJNFg,9030
54
+ enterprise_data/api/v1/views/enterprise_admin.py,sha256=uaf8sSp_JS1T5Kgi4xNCjhu6A0HKa3Zwp6JMjY3okJk,9103
52
55
  enterprise_data/api/v1/views/enterprise_learner.py,sha256=vRzfaQCEoeq_tEY7KsNZJVzgn7XEWZ1l-n0oUoSVGyU,20093
53
56
  enterprise_data/api/v1/views/enterprise_offers.py,sha256=VifxgqTLFLVw4extYPlHcN1N_yjXcsYsAlYEnAbpb10,1266
54
57
  enterprise_data/cache/__init__.py,sha256=fiBUploll1kmDy2vCmnNpeZVTD4ewsgtRF14vVs0Rb4,1850
@@ -64,7 +67,7 @@ enterprise_data/management/commands/create_enterprise_learner_enrollment_lpr_v1.
64
67
  enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py,sha256=bUYmZHA3yK3ZBPhV0wkpRDgH_Q2b5rVQnwSp2hRmh28,1799
65
68
  enterprise_data/management/commands/create_enterprise_offer.py,sha256=0R1eEKWTCGjod4I8qBH2UBD-erqj5mFtM_DG5Vxet_0,1150
66
69
  enterprise_data/management/commands/create_enterprise_user.py,sha256=V_kvOSPZ1DXfAdF1W3AwAtavEYjdYaHBjjfzndZP8lk,1498
67
- enterprise_data/management/commands/pre_warm_analytics_cache.py,sha256=i64hcbvqGW0UWYbx046iEETzCOcva1cdYumdb5RByGU,8522
70
+ enterprise_data/management/commands/pre_warm_analytics_cache.py,sha256=MdvwIZdxYei5V6pTOe_-ohCXHlrMRk29fGe9rfijJzk,8841
68
71
  enterprise_data/management/commands/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
72
  enterprise_data/management/commands/tests/test_create_dummy_data_lpr_v1.py,sha256=wt9fqAFKQVTqllpZ42dch-n31JavUifUIB9CKNYcnYM,1086
70
73
  enterprise_data/management/commands/tests/test_create_enterprise_enrollment.py,sha256=5CABLk8qAx8RP8mrFtnbJ4-xVkf9-5Mq6iQcx8jBfFc,1742
@@ -144,7 +147,7 @@ enterprise_data/tests/api/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
144
147
  enterprise_data/tests/api/v1/test_serializers.py,sha256=DwgEHcyOP3oqNUPB2O-NkJGeO_cYs9XJiq7791vJLZE,3682
145
148
  enterprise_data/tests/api/v1/test_views.py,sha256=rLqUHfar0HdBNtz33hQxd_0qUUgr7Ku3KwQSQ1B4Ypg,15213
146
149
  enterprise_data/tests/api/v1/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
- enterprise_data/tests/api/v1/views/test_enterprise_admin.py,sha256=OxeCL_-wotTOoe7cQxJTFDNataBRn5y8ei6GM5-EklA,11052
150
+ enterprise_data/tests/api/v1/views/test_enterprise_admin.py,sha256=6SXw7LcMaE-M2VSX8PHaWmOHDGXlqbI2ahNHqyBuPOk,11161
148
151
  enterprise_data_roles/__init__.py,sha256=toCpbypm2uDoWVw29_em9gPFNly8vNUS__C0b4TCqEg,112
149
152
  enterprise_data_roles/admin.py,sha256=QNP0VeWE092vZzpyxOA5UJK1nNGl5e71B1J0RCwo_nU,998
150
153
  enterprise_data_roles/apps.py,sha256=nKi8TyuQ5Q6WGtKs5QeXvUTc3N-YQjKhyBnm2EM3Bng,260
@@ -178,7 +181,7 @@ enterprise_reporting/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
178
181
  enterprise_reporting/fixtures/enterprise_customer_reporting.json,sha256=nS6E9KHW0Iqk7ZHtTyyVyrztIXxjn9OtBvMJkn7owxc,3959
179
182
  enterprise_reporting/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
180
183
  enterprise_reporting/tests/test_clients.py,sha256=h-h7xBJ6wIBKP-QqRxcJJGiQxLfTOLYByCuWfcCeCy0,8474
181
- enterprise_reporting/tests/test_delivery_method.py,sha256=_nvpxPjYb59ix0nsgX4Ani0gJ0mgcBCgfHpw0rS0scc,4561
184
+ enterprise_reporting/tests/test_delivery_method.py,sha256=p7OWkHKzl-iiA8jHXoo7TIRQees-AUryKzIq-t2MtwI,4561
182
185
  enterprise_reporting/tests/test_enterprise_client.py,sha256=lpWm0muvA3alRjmlRAezE5901C9DU3WiySH4D5-U3qE,1058
183
186
  enterprise_reporting/tests/test_external_link_report.py,sha256=zdnVOD1qtAp9c5EbIPnD9jcoLtW4iKs7gSVklgBK328,7029
184
187
  enterprise_reporting/tests/test_reporter.py,sha256=PTmkGvPjGEjxiyizL88LAKnaWdvZDgOBjL4QStfOdyw,4057
@@ -186,7 +189,7 @@ enterprise_reporting/tests/test_send_enterprise_reports.py,sha256=zBj7sDvRLJQbRs
186
189
  enterprise_reporting/tests/test_utils.py,sha256=y4t6w9aKra-ftqtUeHvPwOhje-1npz7auV5o74ya8fE,9523
187
190
  enterprise_reporting/tests/test_vertica_client.py,sha256=-R2yNCGUjRtoXwLMBloVFQkFYrJoo613VCr61gwI3kQ,140
188
191
  enterprise_reporting/tests/utils.py,sha256=xms2LM7DV3wczXEfctOK1ddel1EE0J_YSr17UzbCDy4,1401
189
- edx_enterprise_data-10.11.1.dist-info/METADATA,sha256=qGem3YioOvmd2BpaHm7xLHVjzDkgWIHl-eW5jn3r_o0,1707
190
- edx_enterprise_data-10.11.1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
191
- edx_enterprise_data-10.11.1.dist-info/top_level.txt,sha256=f5F2kU-dob6MqiHJpgZkFzoCD5VMhsdpkTV5n9Tvq3I,59
192
- edx_enterprise_data-10.11.1.dist-info/RECORD,,
192
+ edx_enterprise_data-10.13.0.dist-info/METADATA,sha256=RgZC-iLHMg24D7ZS5S4ZDaxN0IhZYCYdhFnx49ZQNuA,1707
193
+ edx_enterprise_data-10.13.0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
194
+ edx_enterprise_data-10.13.0.dist-info/top_level.txt,sha256=f5F2kU-dob6MqiHJpgZkFzoCD5VMhsdpkTV5n9Tvq3I,59
195
+ edx_enterprise_data-10.13.0.dist-info/RECORD,,
@@ -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.11.1"
5
+ __version__ = "10.13.0"
@@ -2,4 +2,6 @@
2
2
  Query Filters for database tables.
3
3
  """
4
4
 
5
+ from .fact_completion_admin_dash import FactCompletionAdminDashFilters
6
+ from .fact_engagement_admin_dash import FactEngagementAdminDashFilters
5
7
  from .fact_enrollment_admin_dash import FactEnrollmentAdminDashFilters
@@ -0,0 +1,22 @@
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.filters.mixins import CommonFiltersMixin
6
+ from enterprise_data.admin_analytics.database.query_filters import EqualQueryFilter
7
+
8
+
9
+ class FactCompletionAdminDashFilters(CommonFiltersMixin, BaseFilter):
10
+ """
11
+ Query filters for completions data in enrollments table.
12
+ """
13
+
14
+ @staticmethod
15
+ def has_passed_filter() -> EqualQueryFilter:
16
+ """
17
+ Filter by has passed with fixed value 1.
18
+ """
19
+ return EqualQueryFilter(
20
+ column='has_passed',
21
+ value=1
22
+ )
@@ -0,0 +1,11 @@
1
+ """
2
+ Query filters for engagments data.
3
+ """
4
+ from enterprise_data.admin_analytics.database.filters.base import BaseFilter
5
+ from enterprise_data.admin_analytics.database.filters.mixins import CommonFiltersMixin
6
+
7
+
8
+ class FactEngagementAdminDashFilters(CommonFiltersMixin, BaseFilter):
9
+ """
10
+ Query filters for engagments data.
11
+ """
@@ -2,50 +2,10 @@
2
2
  Query filters for enrollments table.
3
3
  """
4
4
  from enterprise_data.admin_analytics.database.filters.base import BaseFilter
5
- from enterprise_data.admin_analytics.database.query_filters import BetweenQueryFilter, EqualQueryFilter, INQueryFilter
5
+ from enterprise_data.admin_analytics.database.filters.mixins import CommonFiltersMixin
6
6
 
7
7
 
8
- class FactEnrollmentAdminDashFilters(BaseFilter):
8
+ class FactEnrollmentAdminDashFilters(CommonFiltersMixin, BaseFilter):
9
9
  """
10
10
  Query filters for enrollments table.
11
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
- )
@@ -0,0 +1,84 @@
1
+ """
2
+ Common query filters for all tables.
3
+ """
4
+ from logging import getLogger
5
+ from typing import Optional, Tuple
6
+ from uuid import UUID
7
+
8
+ from enterprise_data.admin_analytics.database.filters.base import BaseFilter
9
+ from enterprise_data.admin_analytics.database.query_filters import BetweenQueryFilter, EqualQueryFilter, INQueryFilter
10
+ from enterprise_data.clients import EnterpriseApiClient
11
+ from enterprise_data.exceptions import EnterpriseApiClientException
12
+
13
+ LOGGER = getLogger(__name__)
14
+
15
+
16
+ class CommonFiltersMixin(BaseFilter):
17
+ """
18
+ Common filters.
19
+ """
20
+ @staticmethod
21
+ def enterprise_customer_uuid_filter(enterprise_customer_uuid_params_key: str) -> EqualQueryFilter:
22
+ """
23
+ Filter by enterprise customer uuid.
24
+
25
+ Arguments:
26
+ enterprise_customer_uuid_params_key: The key against which value will be passed in the query.
27
+ """
28
+ return EqualQueryFilter(
29
+ column='enterprise_customer_uuid',
30
+ value_placeholder=enterprise_customer_uuid_params_key,
31
+ )
32
+
33
+ @staticmethod
34
+ def date_range_filter(
35
+ column: str,
36
+ start_date_params_key: str,
37
+ end_date_params_key: str
38
+ ) -> BetweenQueryFilter:
39
+ """
40
+ Filter by a table column to be in the given date range.
41
+
42
+ Arguments:
43
+ column (str): The table column name to filter on.
44
+ start_date_params_key (str): The start date key against which value will be passed in the query.
45
+ end_date_params_key (str): The end date key against which value will be passed in the query.
46
+ """
47
+ return BetweenQueryFilter(
48
+ column=column,
49
+ range_placeholders=(start_date_params_key, end_date_params_key),
50
+ )
51
+
52
+ def enterprise_user_query_filter( # pylint: disable=inconsistent-return-statements
53
+ self,
54
+ group_uuid: Optional[UUID],
55
+ enterprise_customer_uuid: UUID
56
+ ) -> Optional[Tuple[INQueryFilter, dict]]:
57
+ """
58
+ Get the query filter to filter enrollments for enterprise users in the given group.
59
+
60
+ Arguments:
61
+ group_uuid (UUID): The UUID of the group.
62
+ enterprise_customer_uuid (UUID): The UUID of the enterprise customer.
63
+
64
+ Returns:
65
+ (INQueryFilter | None): The query filter to filter enrollments for enterprise users in the given group.
66
+ """
67
+ if not group_uuid:
68
+ return None
69
+
70
+ try:
71
+ learners_in_group = EnterpriseApiClient.get_enterprise_user_ids_in_group(group_uuid)
72
+ except EnterpriseApiClientException:
73
+ LOGGER.exception(
74
+ "Failed to get learners in group [%s] for enterprise [%s]",
75
+ group_uuid,
76
+ enterprise_customer_uuid,
77
+ )
78
+ else:
79
+ params = {f'eu_{i}': i for i in learners_in_group}
80
+ enterprise_user_id_in_filter = INQueryFilter(
81
+ column='enterprise_user_id',
82
+ values_placeholders=list(params.keys()),
83
+ )
84
+ return enterprise_user_id_in_filter, params
@@ -21,34 +21,32 @@ class FactEngagementAdminDashQueries:
21
21
  """
22
22
 
23
23
  @staticmethod
24
- def get_engagement_count_query():
24
+ def get_engagement_count_query(query_filters):
25
25
  """
26
26
  Get the query to fetch the total number of engagements for an enterprise customer.
27
27
  """
28
- return """
28
+ return f"""
29
29
  SELECT count(*)
30
30
  FROM fact_enrollment_engagement_day_admin_dash
31
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
32
- activity_date BETWEEN %(start_date)s AND %(end_date)s;
31
+ WHERE {query_filters.to_sql()};
33
32
  """
34
33
 
35
34
  @staticmethod
36
- def get_all_engagement_query():
35
+ def get_all_engagement_query(query_filters):
37
36
  """
38
37
  Get the query to fetch all engagement data.
39
38
  """
40
- return """
39
+ return f"""
41
40
  SELECT
42
41
  email, course_title, course_subject, enroll_type, activity_date,
43
42
  learning_time_seconds/3600 as learning_time_hours
44
43
  FROM fact_enrollment_engagement_day_admin_dash
45
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
46
- activity_date BETWEEN %(start_date)s AND %(end_date)s
44
+ WHERE {query_filters.to_sql()}
47
45
  ORDER BY activity_date DESC LIMIT %(limit)s OFFSET %(offset)s;
48
46
  """
49
47
 
50
48
  @staticmethod
51
- def get_top_courses_by_engagement_query(record_count=10):
49
+ def get_top_courses_by_engagement_query(query_filters, record_count=10):
52
50
  """
53
51
  Get the query to fetch the learning time in hours by courses.
54
52
 
@@ -69,8 +67,7 @@ class FactEngagementAdminDashQueries:
69
67
  (learning_time_seconds / 60.0 / 60.0) AS learning_time_hours,
70
68
  activity_date
71
69
  FROM fact_enrollment_engagement_day_admin_dash
72
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
73
- activity_date BETWEEN %(start_date)s AND %(end_date)s
70
+ WHERE {query_filters.to_sql()}
74
71
  ),
75
72
  top_10_courses AS (
76
73
  SELECT
@@ -94,7 +91,7 @@ class FactEngagementAdminDashQueries:
94
91
  """
95
92
 
96
93
  @staticmethod
97
- def get_top_subjects_by_engagement_query(record_count=10):
94
+ def get_top_subjects_by_engagement_query(query_filters, record_count=10):
98
95
  """
99
96
  Get the query to fetch the learning time in hours by subjects.
100
97
 
@@ -114,8 +111,7 @@ class FactEngagementAdminDashQueries:
114
111
  (learning_time_seconds / 60.0 / 60.0) AS learning_time_hours,
115
112
  activity_date
116
113
  FROM fact_enrollment_engagement_day_admin_dash
117
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
118
- activity_date BETWEEN %(start_date)s AND %(end_date)s
114
+ WHERE {query_filters.to_sql()}
119
115
  ),
120
116
  top_10_subjects AS (
121
117
  SELECT
@@ -138,7 +134,7 @@ class FactEngagementAdminDashQueries:
138
134
  """
139
135
 
140
136
  @staticmethod
141
- def get_engagement_time_series_data_query():
137
+ def get_engagement_time_series_data_query(query_filters):
142
138
  """
143
139
  Get the query to fetch the completion time series data.
144
140
 
@@ -147,11 +143,10 @@ class FactEngagementAdminDashQueries:
147
143
  Returns:
148
144
  (str): Query to fetch the completion time series data.
149
145
  """
150
- return """
146
+ return f"""
151
147
  SELECT activity_date, enroll_type, SUM(learning_time_seconds)/3600 as learning_time_hours
152
148
  FROM fact_enrollment_engagement_day_admin_dash
153
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
154
- activity_date BETWEEN %(start_date)s AND %(end_date)s
149
+ WHERE {query_filters.to_sql()}
155
150
  GROUP BY activity_date, enroll_type
156
151
  ORDER BY activity_date;
157
152
  """
@@ -70,17 +70,15 @@ class FactEnrollmentAdminDashQueries:
70
70
  """
71
71
 
72
72
  @staticmethod
73
- def get_completion_count_query():
73
+ def get_completion_count_query(query_filters: QueryFilters) -> str:
74
74
  """
75
75
  Get the query to fetch the completion count.
76
76
  """
77
- return """
77
+ return f"""
78
78
  SELECT
79
79
  SUM(has_passed) as completions
80
80
  FROM fact_enrollment_admin_dash
81
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
82
- has_passed=1 AND
83
- passed_date BETWEEN %(start_date)s AND %(end_date)s;
81
+ WHERE {query_filters.to_sql()};
84
82
  """
85
83
 
86
84
  @staticmethod
@@ -94,7 +92,7 @@ class FactEnrollmentAdminDashQueries:
94
92
  FROM fact_engagement_admin_dash
95
93
  WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
96
94
  activity_date BETWEEN %(start_date)s AND %(end_date)s;
97
- """
95
+ """
98
96
 
99
97
  @staticmethod
100
98
  def get_top_courses_by_enrollments_query(query_filters: QueryFilters, record_count: int = 10) -> str:
@@ -183,27 +181,28 @@ class FactEnrollmentAdminDashQueries:
183
181
  """
184
182
 
185
183
  @staticmethod
186
- def get_all_completions_query():
184
+ def get_all_completions_query(
185
+ query_filters: QueryFilters,
186
+ ) -> str:
187
187
  """
188
188
  Get the query to fetch all completions.
189
189
  """
190
- return """
190
+ return f"""
191
191
  SELECT email, course_title, course_subject, enroll_type, passed_date
192
192
  FROM fact_enrollment_admin_dash
193
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
194
- has_passed=1 AND
195
- passed_date BETWEEN %(start_date)s AND %(end_date)s
193
+ WHERE {query_filters.to_sql()}
196
194
  ORDER BY passed_date DESC LIMIT %(limit)s OFFSET %(offset)s
197
195
  """
198
196
 
199
197
  @staticmethod
200
- def get_top_courses_by_completions_query(record_count=10):
198
+ def get_top_courses_by_completions_query(query_filters: QueryFilters, record_count=10) -> str:
201
199
  """
202
200
  Get the query to fetch the completion count by courses.
203
201
 
204
202
  Query should fetch the top N courses by completion count. Where N is the value of record_count.
205
203
 
206
204
  Arguments:
205
+ query_filters (QueryFilters): List of query filters.
207
206
  record_count (int): Number of records to fetch.
208
207
 
209
208
  Returns:
@@ -217,9 +216,7 @@ class FactEnrollmentAdminDashQueries:
217
216
  enroll_type,
218
217
  passed_date
219
218
  FROM fact_enrollment_admin_dash
220
- WHERE has_passed = 1 AND
221
- enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
222
- passed_date BETWEEN %(start_date)s AND %(end_date)s
219
+ WHERE {query_filters.to_sql()}
223
220
  ),
224
221
  top_10_courses AS (
225
222
  SELECT
@@ -243,13 +240,14 @@ class FactEnrollmentAdminDashQueries:
243
240
  """
244
241
 
245
242
  @staticmethod
246
- def get_top_subjects_by_completions_query(record_count=10):
243
+ def get_top_subjects_by_completions_query(query_filters: QueryFilters, record_count=10) -> str:
247
244
  """
248
245
  Get the query to fetch the completion count by subjects.
249
246
 
250
247
  Query should fetch the top N subjects by completion count. Where N is the value of record_count.
251
248
 
252
249
  Arguments:
250
+ query_filters (QueryFilters): List of query filters.
253
251
  record_count (int): Number of records to fetch.
254
252
 
255
253
  Returns:
@@ -262,9 +260,7 @@ class FactEnrollmentAdminDashQueries:
262
260
  enroll_type,
263
261
  passed_date
264
262
  FROM fact_enrollment_admin_dash
265
- WHERE has_passed = 1 AND
266
- enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
267
- passed_date BETWEEN %(start_date)s AND %(end_date)s
263
+ WHERE {query_filters.to_sql()}
268
264
  ),
269
265
  top_10_subjects AS (
270
266
  SELECT
@@ -287,7 +283,9 @@ class FactEnrollmentAdminDashQueries:
287
283
  """
288
284
 
289
285
  @staticmethod
290
- def get_completions_time_series_data_query():
286
+ def get_completions_time_series_data_query(
287
+ query_filters: QueryFilters,
288
+ ) -> str:
291
289
  """
292
290
  Get the query to fetch the completion time series data.
293
291
 
@@ -296,12 +294,10 @@ class FactEnrollmentAdminDashQueries:
296
294
  Returns:
297
295
  (str): Query to fetch the completion time series data.
298
296
  """
299
- return """
297
+ return f"""
300
298
  SELECT passed_date, enroll_type, count(course_key) as completion_count
301
299
  FROM fact_enrollment_admin_dash
302
- WHERE enterprise_customer_uuid=%(enterprise_customer_uuid)s AND
303
- has_passed=1 AND
304
- passed_date BETWEEN %(start_date)s AND %(end_date)s
300
+ WHERE {query_filters.to_sql()}
305
301
  GROUP BY passed_date, enroll_type
306
302
  ORDER BY passed_date;
307
303
  """