edx-enterprise-data 10.6.0__py3-none-any.whl → 10.7.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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edx-enterprise-data
3
- Version: 10.6.0
3
+ Version: 10.7.0
4
4
  Summary: Enterprise Reporting
5
5
  Home-page: https://github.com/openedx/edx-enterprise-data
6
6
  Author: edX
@@ -1,11 +1,11 @@
1
- enterprise_data/__init__.py,sha256=Vji9ThNLjw1fgFjyPoOSympvSYzxWjmD4jmB7MyB2MA,124
1
+ enterprise_data/__init__.py,sha256=iTpn78n71dvVScgFYyIsXHgae3gI4WEYNwYvxi4vjDc,124
2
2
  enterprise_data/apps.py,sha256=aF6hZwDfI2oWj95tUTm_2ikHueQj-jLj-u0GrgzpsQI,414
3
3
  enterprise_data/clients.py,sha256=GvQupy5TVYfO_IKC3yzXSAgNP54r-PtIjidM5ws9Iks,3947
4
4
  enterprise_data/constants.py,sha256=uCKjfpdlMYFZJsAj3n9RMw4Cmg5_6s3NuwocO-fch3s,238
5
5
  enterprise_data/filters.py,sha256=D2EiK12MMpBoz6eOUmTpoJEhj_sH7bA93NRRAdvkDVo,6163
6
- enterprise_data/models.py,sha256=khGcOh7NWP8KGu84t78Y2zAu3knREeXA_prApmU2NX8,24428
6
+ enterprise_data/models.py,sha256=7j8b8lgORZTQC9frG4CpfHTRvTgUvBTThemz6JPGCb0,24559
7
7
  enterprise_data/paginators.py,sha256=YPrC5TeXFt-ymenT2H8H2nCbDCnAzJQlH9kFPElRxWE,269
8
- enterprise_data/renderers.py,sha256=d_bJZjeUTyHRBBtpCcslrTyldv6IMYQ_QW-GWijwGHU,3026
8
+ enterprise_data/renderers.py,sha256=qggCLZklL9ohVcLHLO1pSecPJSDCCR7e_-PVobl9Lj8,3063
9
9
  enterprise_data/signals.py,sha256=8eqNPnlvmfsKf19lGWv5xTIuBgQIqR8EZSp9UYzC8Rc,1024
10
10
  enterprise_data/urls.py,sha256=bqtKF5OEWEwrNmHG3os-pZNuNsmjlhxEqp7yM4TbPf4,243
11
11
  enterprise_data/utils.py,sha256=sDrpBd62DpybCV41QCxRUaCuvch3qKjEhfUp9cA_GV0,2952
@@ -16,7 +16,7 @@ enterprise_data/admin_analytics/database/__init__.py,sha256=vNSWKf2VV5xMegN7htJJ
16
16
  enterprise_data/admin_analytics/database/utils.py,sha256=5u-d6ZQW95mF_r4bH8Xdi7DgpYAuDFOG_q0P-bjKXHU,1712
17
17
  enterprise_data/admin_analytics/database/queries/__init__.py,sha256=IC5TLOr_GnydbrVbl2mWhwO3aUbYeHuDmfPTLmwGhZA,218
18
18
  enterprise_data/admin_analytics/database/queries/fact_engagement_admin_dash.py,sha256=eLy9GT0gFGLbw8yZZdEaeCAw0pTEUsy0-Ud5g2T9T80,10836
19
- enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py,sha256=w30BiDOcKzV_FCdtxIG-_7zSCu5f3x5pgBRFCGjHu04,11011
19
+ enterprise_data/admin_analytics/database/queries/fact_enrollment_admin_dash.py,sha256=ikTly1_fb-xzrXUTpA7B2dRRYpcuDhbpxMBkxbs-DP4,11064
20
20
  enterprise_data/admin_analytics/database/queries/skills_daily_rollup_admin_dash.py,sha256=ZaJPghTrQvBGsFxfpeR8EE45ujtaYI9R_xkoDDqD2So,4269
21
21
  enterprise_data/admin_analytics/database/tables/__init__.py,sha256=Z-c3P9hqR-dC9uYKe63qHkQG9Nms8cLE2jRN-4jeMM0,289
22
22
  enterprise_data/admin_analytics/database/tables/base.py,sha256=1KyKsC18pW3m-5U-T6pdt5rIwsz6Wp3QFFbD3r6L6YQ,395
@@ -30,7 +30,7 @@ enterprise_data/api/v0/serializers.py,sha256=dngZTk6DhRxApchQKCMp1B_c8aVnQtH0NCq
30
30
  enterprise_data/api/v0/urls.py,sha256=vzJjqIo_S3AXWs9Us8XTaJc3FnxLbYzAkmLyuDQqum0,699
31
31
  enterprise_data/api/v0/views.py,sha256=4RslZ4NZOU-844bnebEQ71ji2utRY7jEijqC45oQQD0,14380
32
32
  enterprise_data/api/v1/__init__.py,sha256=1aAzAYU5hk-RW6cKUxa1645cbZMxn7GIZ7OMjWc9MKI,46
33
- enterprise_data/api/v1/serializers.py,sha256=oS09fMJyb3DkSc2y5TH5Yknd9NjYrlmWMRPNqBZ741U,10902
33
+ enterprise_data/api/v1/serializers.py,sha256=C7X_f2J2RmqdGPmy9KFQQyGOli98kGeSsPDBG9kDk3A,10939
34
34
  enterprise_data/api/v1/urls.py,sha256=IpOyS9UWuyip6fw6gtrxBw9SZLOdxh3sQ2j0Gdk4eOw,4180
35
35
  enterprise_data/api/v1/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
36
  enterprise_data/api/v1/views/analytics_completions.py,sha256=esFbJ5q8ssnm2Mfbc3rZXtiGHF-MeM4KQ4Ft3N7wwHU,6260
@@ -39,7 +39,7 @@ enterprise_data/api/v1/views/analytics_enrollments.py,sha256=hw87VZ0hFWpwf3QEHFn
39
39
  enterprise_data/api/v1/views/analytics_leaderboard.py,sha256=3dyo7_OhyGEEeibemBrRsUOo0jbM4LbDgV5gw3YnVig,4186
40
40
  enterprise_data/api/v1/views/base.py,sha256=Kkmd5zgEBAhvwS_GoGXSK6lgbDNwSPioYn-QbnizI3w,3416
41
41
  enterprise_data/api/v1/views/enterprise_admin.py,sha256=DyN6RS4qY8sgKNIvcx1nRmSGuPm2pLYHZeh5YHXlH2w,8209
42
- enterprise_data/api/v1/views/enterprise_learner.py,sha256=NqI_Tlz5v3p4fYZe2RRCg54AizslZdHB3Ckh8YQrhIM,18163
42
+ enterprise_data/api/v1/views/enterprise_learner.py,sha256=XYoNQ9Ir12B9seGcs2LadWgeee3j5UTTAztZROcSy4U,18201
43
43
  enterprise_data/api/v1/views/enterprise_offers.py,sha256=VifxgqTLFLVw4extYPlHcN1N_yjXcsYsAlYEnAbpb10,1266
44
44
  enterprise_data/cache/__init__.py,sha256=fiBUploll1kmDy2vCmnNpeZVTD4ewsgtRF14vVs0Rb4,1850
45
45
  enterprise_data/cache/decorators.py,sha256=vLbXK9VSv-HzVkkXS1-TkuSMxudwyxz04WFsAXqmjuM,1273
@@ -58,7 +58,7 @@ enterprise_data/management/commands/pre_warm_analytics_cache.py,sha256=3MCThZiZg
58
58
  enterprise_data/management/commands/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
59
  enterprise_data/management/commands/tests/test_create_dummy_data_lpr_v1.py,sha256=wt9fqAFKQVTqllpZ42dch-n31JavUifUIB9CKNYcnYM,1086
60
60
  enterprise_data/management/commands/tests/test_create_enterprise_enrollment.py,sha256=5CABLk8qAx8RP8mrFtnbJ4-xVkf9-5Mq6iQcx8jBfFc,1742
61
- enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py,sha256=FzOBHcd1FfSVN5AI8oAKvmqj-W8Y-V7x9yJx9R1WrLQ,3845
61
+ enterprise_data/management/commands/tests/test_create_enterprise_learner_enrollment_lpr_v1.py,sha256=cw8PTUhwkFZeI3agCRLRMxKBRO6k1Ukft2CJIRUUMoY,4139
62
62
  enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py,sha256=P7wyyaZ4LMWv1umpCThp4By5DWjtI7kYAmY0AeuY2XI,1637
63
63
  enterprise_data/management/commands/tests/test_create_enterprise_user.py,sha256=0uxG332-jYpaxUIrMtIVRTwvRfxTWEQBIwZlIQO7f2g,1469
64
64
  enterprise_data/management/commands/tests/test_pre_warm_analytics_cache.py,sha256=Nbwsl5CYMbi5cN2IwmUtTs5b_MeU6T0lquk3x8Tuh_4,2108
@@ -104,6 +104,7 @@ enterprise_data/migrations/0038_enterpriseoffer_export_timestamp.py,sha256=8St3D
104
104
  enterprise_data/migrations/0039_auto_20240212_1403.py,sha256=rMiJcYx26ZGqPdQzgiWkUgbcRhD-tp9BgXdgt67vC2Q,1002
105
105
  enterprise_data/migrations/0040_auto_20240718_0536_squashed_0043_alter_enterpriselearnerenrollment_enterprise_enrollment_id.py,sha256=Kq_ResqoAsJjtyIysHjs4VaDxNh6p4fPMMyh93GIJxA,1693
106
106
  enterprise_data/migrations/0044_enterpriseexecedlcmoduleperformance.py,sha256=1aJ0wIu9K2cT3AJdBIHuNCUpJysPWmq_37Ucp5ntEO8,6122
107
+ enterprise_data/migrations/0045_alter_enterpriseexecedlcmoduleperformance_options_and_more.py,sha256=HJkY2OvuE39ciWgaEescd--ixQhTVrwzbL0_bvNofSo,876
107
108
  enterprise_data/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
109
  enterprise_data/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
110
  enterprise_data/settings/test.py,sha256=4-flfrlf81AthGx9wTaT5PscyoOWyhsDDqbzBl-z7Eg,4191
@@ -113,7 +114,7 @@ enterprise_data/tests/mixins.py,sha256=YifptI9mtOhAWnBGyPUy4kX5OJNSDP3DvW2vb1E2t
113
114
  enterprise_data/tests/test_clients.py,sha256=xBPHF9cgEFqNJoL4klOoYh_sVS3scZGcX0Ltc9Ghp7A,6336
114
115
  enterprise_data/tests/test_filters.py,sha256=ZBbLl9Sgj5mJ7lTWoaFcEPwuxPDpIbMo2n_Fhurc0T8,7263
115
116
  enterprise_data/tests/test_models.py,sha256=MWBY-LY5TPBjZ4GlvpM-h4W-BvRKr2Rml8Bzg1NPZ9M,3234
116
- enterprise_data/tests/test_utils.py,sha256=vbmYM7DMN-lHS2p4yaa0Yd6uSGXd2qoZRDE9X3J4Sec,18385
117
+ enterprise_data/tests/test_utils.py,sha256=k3ha4V9fM2jd98r0SIOWr5umMEG0YbVKJVbtq4zXXmw,18572
117
118
  enterprise_data/tests/test_views.py,sha256=UvDRNTxruy5zBK_KgUy2cBMbwlaTW_vkM0-TCXbQZiY,69667
118
119
  enterprise_data/tests/admin_analytics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
120
  enterprise_data/tests/admin_analytics/mock_analytics_data.py,sha256=qN73YxoD1kAtKsQo94avR0DGMCsJClrpqFxxYC6reqE,15248
@@ -171,8 +172,8 @@ enterprise_reporting/tests/test_send_enterprise_reports.py,sha256=WtL-RqGgu2x5PP
171
172
  enterprise_reporting/tests/test_utils.py,sha256=Zt_TA0LVb-B6fQGkUkAKKVlUKKnQh8jnw1US1jKe7g8,9493
172
173
  enterprise_reporting/tests/test_vertica_client.py,sha256=-R2yNCGUjRtoXwLMBloVFQkFYrJoo613VCr61gwI3kQ,140
173
174
  enterprise_reporting/tests/utils.py,sha256=xms2LM7DV3wczXEfctOK1ddel1EE0J_YSr17UzbCDy4,1401
174
- edx_enterprise_data-10.6.0.dist-info/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
175
- edx_enterprise_data-10.6.0.dist-info/METADATA,sha256=3-JMI7HZrVn9YpIhzhuxmQ0d3Y-7-IT_A_sFROOGW9k,1505
176
- edx_enterprise_data-10.6.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
177
- edx_enterprise_data-10.6.0.dist-info/top_level.txt,sha256=f5F2kU-dob6MqiHJpgZkFzoCD5VMhsdpkTV5n9Tvq3I,59
178
- edx_enterprise_data-10.6.0.dist-info/RECORD,,
175
+ edx_enterprise_data-10.7.0.dist-info/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
176
+ edx_enterprise_data-10.7.0.dist-info/METADATA,sha256=0sUp6Oy7fhAJC087VKKO2jVz6UkbQZ__QUxvTacKdMk,1505
177
+ edx_enterprise_data-10.7.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
178
+ edx_enterprise_data-10.7.0.dist-info/top_level.txt,sha256=f5F2kU-dob6MqiHJpgZkFzoCD5VMhsdpkTV5n9Tvq3I,59
179
+ edx_enterprise_data-10.7.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.6.0"
5
+ __version__ = "10.7.0"
@@ -124,6 +124,7 @@ class FactEnrollmentAdminDashQueries:
124
124
 
125
125
  SELECT
126
126
  d.course_key,
127
+ MAX(d.course_title) AS course_title,
127
128
  d.enroll_type,
128
129
  COUNT(*) AS enrollment_count
129
130
  FROM filtered_data d
@@ -41,9 +41,9 @@ class EnterpriseLearnerEnrollmentSerializer(serializers.ModelSerializer):
41
41
  'course_primary_program', 'primary_program_type', 'course_primary_subject', 'has_passed',
42
42
  'last_activity_date', 'progress_status', 'passed_date', 'current_grade',
43
43
  'letter_grade', 'enterprise_user_id', 'user_email', 'user_account_creation_date',
44
- 'user_country_code', 'user_username', 'enterprise_name', 'enterprise_customer_uuid',
45
- 'enterprise_sso_uid', 'created', 'course_api_url', 'total_learning_time_hours', 'is_subsidy',
46
- 'course_product_line', 'budget_id', 'enterprise_group_name', 'enterprise_group_uuid',
44
+ 'user_country_code', 'user_username', 'user_first_name', 'user_last_name', 'enterprise_name',
45
+ 'enterprise_customer_uuid', 'enterprise_sso_uid', 'created', 'course_api_url', 'total_learning_time_hours',
46
+ 'is_subsidy', 'course_product_line', 'budget_id', 'enterprise_group_name', 'enterprise_group_uuid',
47
47
  )
48
48
 
49
49
  def get_course_api_url(self, obj):
@@ -59,9 +59,9 @@ class EnterpriseLearnerEnrollmentViewSet(EnterpriseViewSetMixin, viewsets.ReadOn
59
59
  'course_primary_program', 'primary_program_type', 'course_primary_subject', 'has_passed',
60
60
  'last_activity_date', 'progress_status', 'passed_date', 'current_grade',
61
61
  'letter_grade', 'enterprise_user_id', 'user_email', 'user_account_creation_date',
62
- 'user_country_code', 'user_username', 'enterprise_name', 'enterprise_customer_uuid',
63
- 'enterprise_sso_uid', 'created', 'course_api_url', 'total_learning_time_hours', 'is_subsidy',
64
- 'course_product_line', 'budget_id'
62
+ 'user_country_code', 'user_username', 'user_first_name', 'user_last_name', 'enterprise_name',
63
+ 'enterprise_customer_uuid', 'enterprise_sso_uid', 'created', 'course_api_url', 'total_learning_time_hours',
64
+ 'is_subsidy', 'course_product_line', 'budget_id',
65
65
  ]
66
66
 
67
67
  # TODO: Remove after we release the streaming csv changes
@@ -39,6 +39,8 @@ class TestCreateEnterpriseLearnerEnrollmentCommand(TestCase):
39
39
  assert enterprise_learner_enrollment[0].letter_grade is None
40
40
  assert enterprise_learner_enrollment[0].enterprise_user_id is None
41
41
  assert enterprise_learner_enrollment[0].user_username is None
42
+ assert enterprise_learner_enrollment[0].user_first_name is None
43
+ assert enterprise_learner_enrollment[0].user_last_name is None
42
44
  assert enterprise_learner_enrollment[0].user_email is None
43
45
  assert enterprise_learner_enrollment[0].enterprise_user is None
44
46
 
@@ -62,6 +64,8 @@ class TestCreateEnterpriseLearnerEnrollmentCommand(TestCase):
62
64
  assert enterprise_learner_enrollment[0].progress_status is not None
63
65
  assert enterprise_learner_enrollment[0].enterprise_user_id is not None
64
66
  assert enterprise_learner_enrollment[0].user_username is not None
67
+ assert enterprise_learner_enrollment[0].user_first_name is not None
68
+ assert enterprise_learner_enrollment[0].user_last_name is not None
65
69
  assert enterprise_learner_enrollment[0].enterprise_user is not None
66
70
  assert enterprise_learner_enrollment[0].user_email is not None
67
71
  assert EnterpriseLearner.objects.count() == 1
@@ -0,0 +1,27 @@
1
+ # Generated by Django 4.2.15 on 2024-12-23 12:55
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('enterprise_data', '0044_enterpriseexecedlcmoduleperformance'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterModelOptions(
14
+ name='enterpriseexecedlcmoduleperformance',
15
+ options={'verbose_name': 'Exec Ed LC Module Performance', 'verbose_name_plural': 'Exec Ed LC Module Performance'},
16
+ ),
17
+ migrations.AddField(
18
+ model_name='enterpriselearnerenrollment',
19
+ name='user_first_name',
20
+ field=models.CharField(max_length=255, null=True),
21
+ ),
22
+ migrations.AddField(
23
+ model_name='enterpriselearnerenrollment',
24
+ name='user_last_name',
25
+ field=models.CharField(max_length=255, null=True),
26
+ ),
27
+ ]
enterprise_data/models.py CHANGED
@@ -128,6 +128,8 @@ class EnterpriseLearnerEnrollment(models.Model):
128
128
  user_account_creation_date = models.DateTimeField(null=True)
129
129
  user_country_code = models.CharField(max_length=2, null=True)
130
130
  user_username = models.CharField(max_length=255, null=True)
131
+ user_first_name = models.CharField(max_length=255, null=True)
132
+ user_last_name = models.CharField(max_length=255, null=True)
131
133
  enterprise_name = models.CharField(max_length=255, db_index=True, null=False)
132
134
  enterprise_customer_uuid = models.UUIDField(db_index=True, null=False)
133
135
  enterprise_sso_uid = models.CharField(max_length=255, null=True)
@@ -25,9 +25,9 @@ class EnrollmentsCSVRenderer(CSVStreamingRenderer):
25
25
  'course_primary_program', 'primary_program_type', 'course_primary_subject', 'has_passed',
26
26
  'last_activity_date', 'progress_status', 'passed_date', 'current_grade',
27
27
  'letter_grade', 'enterprise_user_id', 'user_email', 'user_account_creation_date',
28
- 'user_country_code', 'user_username', 'enterprise_name', 'enterprise_customer_uuid',
29
- 'enterprise_sso_uid', 'created', 'course_api_url', 'total_learning_time_hours', 'is_subsidy',
30
- 'course_product_line', 'budget_id', 'enterprise_group_name', 'enterprise_group_uuid',
28
+ 'user_country_code', 'user_username', 'user_first_name', 'user_last_name', 'enterprise_name',
29
+ 'enterprise_customer_uuid', 'enterprise_sso_uid', 'created', 'course_api_url', 'total_learning_time_hours',
30
+ 'is_subsidy', 'course_product_line', 'budget_id', 'enterprise_group_name', 'enterprise_group_uuid',
31
31
  ]
32
32
 
33
33
 
@@ -180,6 +180,8 @@ class EnterpriseLearnerEnrollmentFactory(factory.django.DjangoModelFactory):
180
180
  enterprise_user_id = factory.Sequence(lambda n: n)
181
181
  user_email = factory.lazy_attribute(lambda x: FAKER.email()) # pylint: disable=no-member
182
182
  user_username = factory.Sequence('robot{}'.format)
183
+ user_first_name = factory.Sequence('Robot First {}'.format)
184
+ user_last_name = factory.Sequence('Robot Last {}'.format)
183
185
  user_account_creation_date = factory.lazy_attribute(lambda x: '2018-01-01')
184
186
  user_country_code = factory.lazy_attribute(lambda x: FAKER.country_code())
185
187
  is_subsidy = factory.lazy_attribute(lambda x: FAKER.boolean()) # pylint: disable=no-member
@@ -230,6 +232,8 @@ class EnterpriseLearnerEnrollmentFactory(factory.django.DjangoModelFactory):
230
232
  'user_account_creation_date',
231
233
  'user_country_code',
232
234
  'user_username',
235
+ 'user_first_name',
236
+ 'user_last_name',
233
237
  ]
234
238
  if create and not obj.is_consent_granted:
235
239
  for field in dsc_dependent_fields: