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.
- {edx_enterprise_data-10.11.1.dist-info → edx_enterprise_data-10.13.0.dist-info}/METADATA +1 -1
- {edx_enterprise_data-10.11.1.dist-info → edx_enterprise_data-10.13.0.dist-info}/RECORD +22 -19
- enterprise_data/__init__.py +1 -1
- enterprise_data/admin_analytics/database/filters/__init__.py +2 -0
- enterprise_data/admin_analytics/database/filters/fact_completion_admin_dash.py +22 -0
- enterprise_data/admin_analytics/database/filters/fact_engagement_admin_dash.py +11 -0
- enterprise_data/admin_analytics/database/filters/fact_enrollment_admin_dash.py +2 -42
- enterprise_data/admin_analytics/database/filters/mixins.py +84 -0
- enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py +13 -18
- enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py +20 -24
- enterprise_data/admin_analytics/database/tables/fact_engagement_admin_dash.py +103 -33
- enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py +96 -74
- enterprise_data/api/v1/serializers.py +1 -0
- enterprise_data/api/v1/views/analytics_completions.py +11 -5
- enterprise_data/api/v1/views/analytics_engagements.py +10 -5
- enterprise_data/api/v1/views/enterprise_admin.py +2 -1
- enterprise_data/management/commands/pre_warm_analytics_cache.py +11 -0
- enterprise_data/tests/api/v1/views/test_enterprise_admin.py +5 -4
- enterprise_reporting/tests/test_delivery_method.py +1 -1
- {edx_enterprise_data-10.11.1.dist-info → edx_enterprise_data-10.13.0.dist-info}/WHEEL +0 -0
- {edx_enterprise_data-10.11.1.dist-info → edx_enterprise_data-10.13.0.dist-info}/licenses/LICENSE +0 -0
- {edx_enterprise_data-10.11.1.dist-info → edx_enterprise_data-10.13.0.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,5 @@
|
|
1
|
-
edx_enterprise_data-10.
|
2
|
-
enterprise_data/__init__.py,sha256=
|
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=
|
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/
|
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=
|
24
|
-
enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py,sha256=
|
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=
|
34
|
-
enterprise_data/admin_analytics/database/tables/fact_enrollment_admin_dash.py,sha256=
|
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=
|
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=
|
47
|
-
enterprise_data/api/v1/views/analytics_engagements.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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.
|
190
|
-
edx_enterprise_data-10.
|
191
|
-
edx_enterprise_data-10.
|
192
|
-
edx_enterprise_data-10.
|
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,,
|
enterprise_data/__init__.py
CHANGED
@@ -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.
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
"""
|