edx-enterprise-data 8.6.1__py3-none-any.whl → 8.8.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 (23) hide show
  1. {edx_enterprise_data-8.6.1.dist-info → edx_enterprise_data-8.8.0.dist-info}/METADATA +1 -1
  2. {edx_enterprise_data-8.6.1.dist-info → edx_enterprise_data-8.8.0.dist-info}/RECORD +23 -17
  3. enterprise_data/__init__.py +1 -1
  4. enterprise_data/admin_analytics/completions_utils.py +261 -0
  5. enterprise_data/admin_analytics/constants.py +9 -3
  6. enterprise_data/admin_analytics/utils.py +50 -11
  7. enterprise_data/api/v1/paginators.py +1 -1
  8. enterprise_data/api/v1/serializers.py +44 -30
  9. enterprise_data/api/v1/urls.py +21 -4
  10. enterprise_data/api/v1/views/analytics_enrollments.py +42 -53
  11. enterprise_data/api/v1/views/analytics_leaderboard.py +120 -0
  12. enterprise_data/api/v1/views/enterprise_admin.py +9 -5
  13. enterprise_data/api/v1/views/enterprise_completions.py +177 -0
  14. enterprise_data/renderers.py +14 -0
  15. enterprise_data/tests/admin_analytics/mock_analytics_data.py +501 -0
  16. enterprise_data/tests/admin_analytics/mock_enrollments.py +23 -7
  17. enterprise_data/tests/admin_analytics/test_analytics_enrollments.py +23 -22
  18. enterprise_data/tests/admin_analytics/test_analytics_leaderboard.py +163 -0
  19. enterprise_data/tests/admin_analytics/test_enterprise_completions.py +202 -0
  20. enterprise_data/tests/api/v1/views/test_enterprise_admin.py +4 -0
  21. {edx_enterprise_data-8.6.1.dist-info → edx_enterprise_data-8.8.0.dist-info}/LICENSE +0 -0
  22. {edx_enterprise_data-8.6.1.dist-info → edx_enterprise_data-8.8.0.dist-info}/WHEEL +0 -0
  23. {edx_enterprise_data-8.6.1.dist-info → edx_enterprise_data-8.8.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,501 @@
1
+ """Mock data for enrollments"""
2
+
3
+ import pandas as pd
4
+
5
+ from enterprise_data.admin_analytics.constants import EnrollmentChart
6
+ from enterprise_data.admin_analytics.utils import ChartType
7
+
8
+ ENROLLMENTS = [
9
+ {
10
+ "enterprise_customer_name": "Hill Ltd",
11
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
12
+ "lms_enrollment_id": 1013,
13
+ "user_id": 8907,
14
+ "email": "rebeccanelson@example.com",
15
+ "course_key": "hEmW+tvk03",
16
+ "courserun_key": "course-v1:hEmW+tvk03+1T9889",
17
+ "course_id": "1681",
18
+ "course_subject": "business-management",
19
+ "course_title": "Re-engineered tangible approach",
20
+ "enterprise_enrollment_date": "2021-07-04",
21
+ "lms_enrollment_mode": "verified",
22
+ "enroll_type": "certificate",
23
+ "program_title": "Non-Program",
24
+ "date_certificate_awarded": "2021-08-25",
25
+ "grade_percent": 0.99,
26
+ "cert_awarded": 1,
27
+ "date_certificate_created_raw": "2021-08-25",
28
+ "passed_date_raw": "2021-08-25",
29
+ "passed_date": "2021-08-25",
30
+ "has_passed": 1,
31
+ },
32
+ {
33
+ "enterprise_customer_name": "Hill Ltd",
34
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
35
+ "lms_enrollment_id": 9172,
36
+ "user_id": 8369,
37
+ "email": "taylorjames@example.com",
38
+ "course_key": "hEmW+tvk03",
39
+ "courserun_key": "course-v1:hEmW+tvk03+1T9889",
40
+ "course_id": "1681",
41
+ "course_subject": "business-management",
42
+ "course_title": "Re-engineered tangible approach",
43
+ "enterprise_enrollment_date": "2021-07-03",
44
+ "lms_enrollment_mode": "verified",
45
+ "enroll_type": "certificate",
46
+ "program_title": "Non-Program",
47
+ "date_certificate_awarded": "2021-09-01",
48
+ "grade_percent": 0.93,
49
+ "cert_awarded": 1,
50
+ "date_certificate_created_raw": "2021-09-01",
51
+ "passed_date_raw": "2021-09-01",
52
+ "passed_date": "2021-09-01",
53
+ "has_passed": 1,
54
+ },
55
+ {
56
+ "enterprise_customer_name": "Hill Ltd",
57
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
58
+ "lms_enrollment_id": 9552,
59
+ "user_id": 8719,
60
+ "email": "ssmith@example.com",
61
+ "course_key": "qZJC+KFX86",
62
+ "courserun_key": "course-v1:qZJC+KFX86+1T8918",
63
+ "course_id": "1725",
64
+ "course_subject": "medicine",
65
+ "course_title": "Secured static capability",
66
+ "enterprise_enrollment_date": "2021-05-11",
67
+ "lms_enrollment_mode": "verified",
68
+ "enroll_type": "certificate",
69
+ "program_title": "Non-Program",
70
+ "date_certificate_awarded": None,
71
+ "grade_percent": 0.0,
72
+ "cert_awarded": 0,
73
+ "date_certificate_created_raw": None,
74
+ "passed_date_raw": None,
75
+ "passed_date": None,
76
+ "has_passed": 0,
77
+ },
78
+ {
79
+ "enterprise_customer_name": "Hill Ltd",
80
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
81
+ "lms_enrollment_id": 3436,
82
+ "user_id": 3125,
83
+ "email": "kathleenmartin@example.com",
84
+ "course_key": "QWXx+Jqz64",
85
+ "courserun_key": "course-v1:QWXx+Jqz64+1T9449",
86
+ "course_id": "4878",
87
+ "course_subject": "social-sciences",
88
+ "course_title": "Horizontal solution-oriented hub",
89
+ "enterprise_enrollment_date": "2020-04-03",
90
+ "lms_enrollment_mode": "verified",
91
+ "enroll_type": "certificate",
92
+ "program_title": "Non-Program",
93
+ "date_certificate_awarded": None,
94
+ "grade_percent": 0.0,
95
+ "cert_awarded": 0,
96
+ "date_certificate_created_raw": None,
97
+ "passed_date_raw": None,
98
+ "passed_date": None,
99
+ "has_passed": 0,
100
+ },
101
+ {
102
+ "enterprise_customer_name": "Hill Ltd",
103
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
104
+ "lms_enrollment_id": 5934,
105
+ "user_id": 4853,
106
+ "email": "amber79@example.com",
107
+ "course_key": "NOGk+UVD31",
108
+ "courserun_key": "course-v1:NOGk+UVD31+1T4956",
109
+ "course_id": "4141",
110
+ "course_subject": "communication",
111
+ "course_title": "Streamlined zero-defect attitude",
112
+ "enterprise_enrollment_date": "2020-04-08",
113
+ "lms_enrollment_mode": "verified",
114
+ "enroll_type": "certificate",
115
+ "program_title": "Non-Program",
116
+ "date_certificate_awarded": None,
117
+ "grade_percent": 0.0,
118
+ "cert_awarded": 0,
119
+ "date_certificate_created_raw": None,
120
+ "passed_date_raw": None,
121
+ "passed_date": None,
122
+ "has_passed": 0,
123
+ },
124
+ ]
125
+
126
+ ENGAGEMENTS = [
127
+ {
128
+ "user_id": 2340,
129
+ "email": "padillamichelle@example.org",
130
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
131
+ "course_key": "luGg+KNt30",
132
+ "enroll_type": "certificate",
133
+ "activity_date": "2021-08-05",
134
+ "course_title": "Synergized reciprocal encoding",
135
+ "course_subject": "business-management",
136
+ "is_engaged": 1,
137
+ "is_engaged_video": 1,
138
+ "is_engaged_forum": 0,
139
+ "is_engaged_problem": 1,
140
+ "is_active": 1,
141
+ "learning_time_seconds": 3724,
142
+ },
143
+ {
144
+ "user_id": 1869,
145
+ "email": "yallison@example.org",
146
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
147
+ "course_key": "luGg+KNt30",
148
+ "enroll_type": "certificate",
149
+ "activity_date": "2021-07-27",
150
+ "course_title": "Synergized reciprocal encoding",
151
+ "course_subject": "business-management",
152
+ "is_engaged": 1,
153
+ "is_engaged_video": 1,
154
+ "is_engaged_forum": 0,
155
+ "is_engaged_problem": 1,
156
+ "is_active": 1,
157
+ "learning_time_seconds": 4335,
158
+ },
159
+ {
160
+ "user_id": 6962,
161
+ "email": "weaverpatricia@example.net",
162
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
163
+ "course_key": "luGg+KNt30",
164
+ "enroll_type": "certificate",
165
+ "activity_date": "2021-08-05",
166
+ "course_title": "Synergized reciprocal encoding",
167
+ "course_subject": "business-management",
168
+ "is_engaged": 1,
169
+ "is_engaged_video": 1,
170
+ "is_engaged_forum": 0,
171
+ "is_engaged_problem": 1,
172
+ "is_active": 1,
173
+ "learning_time_seconds": 9441,
174
+ },
175
+ {
176
+ "user_id": 6798,
177
+ "email": "seth57@example.org",
178
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
179
+ "course_key": "luGg+KNt30",
180
+ "enroll_type": "certificate",
181
+ "activity_date": "2021-08-21",
182
+ "course_title": "Synergized reciprocal encoding",
183
+ "course_subject": "business-management",
184
+ "is_engaged": 1,
185
+ "is_engaged_video": 1,
186
+ "is_engaged_forum": 1,
187
+ "is_engaged_problem": 1,
188
+ "is_active": 1,
189
+ "learning_time_seconds": 9898,
190
+ },
191
+ {
192
+ "user_id": 8530,
193
+ "email": "mackwilliam@example.com",
194
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
195
+ "course_key": "luGg+KNt30",
196
+ "enroll_type": "certificate",
197
+ "activity_date": "2021-10-24",
198
+ "course_title": "Synergized reciprocal encoding",
199
+ "course_subject": "business-management",
200
+ "is_engaged": 0,
201
+ "is_engaged_video": 0,
202
+ "is_engaged_forum": 0,
203
+ "is_engaged_problem": 0,
204
+ "is_active": 1,
205
+ "learning_time_seconds": 0,
206
+ },
207
+ {
208
+ "user_id": 7584,
209
+ "email": "graceperez@example.com",
210
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
211
+ "course_key": "luGg+KNt30",
212
+ "enroll_type": "certificate",
213
+ "activity_date": "2022-05-17",
214
+ "course_title": "Synergized reciprocal encoding",
215
+ "course_subject": "business-management",
216
+ "is_engaged": 0,
217
+ "is_engaged_video": 0,
218
+ "is_engaged_forum": 0,
219
+ "is_engaged_problem": 0,
220
+ "is_active": 1,
221
+ "learning_time_seconds": 21,
222
+ },
223
+ {
224
+ "user_id": 68,
225
+ "email": "yferguson@example.net",
226
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
227
+ "course_key": "luGg+KNt30",
228
+ "enroll_type": "certificate",
229
+ "activity_date": "2021-09-02",
230
+ "course_title": "Synergized reciprocal encoding",
231
+ "course_subject": "business-management",
232
+ "is_engaged": 1,
233
+ "is_engaged_video": 1,
234
+ "is_engaged_forum": 0,
235
+ "is_engaged_problem": 1,
236
+ "is_active": 1,
237
+ "learning_time_seconds": 4747,
238
+ },
239
+ {
240
+ "user_id": 4278,
241
+ "email": "caseyjohnny@example.com",
242
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
243
+ "course_key": "Kcpr+XoR30",
244
+ "enroll_type": "certificate",
245
+ "activity_date": "2022-05-20",
246
+ "course_title": "Assimilated even-keeled focus group",
247
+ "course_subject": "engineering",
248
+ "is_engaged": 0,
249
+ "is_engaged_video": 0,
250
+ "is_engaged_forum": 0,
251
+ "is_engaged_problem": 0,
252
+ "is_active": 1,
253
+ "learning_time_seconds": 0,
254
+ },
255
+ {
256
+ "user_id": 8726,
257
+ "email": "webertodd@example.com",
258
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
259
+ "course_key": "luGg+KNt30",
260
+ "enroll_type": "certificate",
261
+ "activity_date": "2021-09-21",
262
+ "course_title": "Synergized reciprocal encoding",
263
+ "course_subject": "business-management",
264
+ "is_engaged": 1,
265
+ "is_engaged_video": 1,
266
+ "is_engaged_forum": 1,
267
+ "is_engaged_problem": 1,
268
+ "is_active": 1,
269
+ "learning_time_seconds": 5285,
270
+ },
271
+ {
272
+ "user_id": 282,
273
+ "email": "crystal86@example.net",
274
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
275
+ "course_key": "luGg+KNt30",
276
+ "enroll_type": "certificate",
277
+ "activity_date": "2021-07-11",
278
+ "course_title": "Synergized reciprocal encoding",
279
+ "course_subject": "business-management",
280
+ "is_engaged": 0,
281
+ "is_engaged_video": 0,
282
+ "is_engaged_forum": 0,
283
+ "is_engaged_problem": 0,
284
+ "is_active": 1,
285
+ "learning_time_seconds": 0,
286
+ },
287
+ {
288
+ "user_id": 2731,
289
+ "email": "paul77@example.org",
290
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
291
+ "course_key": "luGg+KNt30",
292
+ "enroll_type": "certificate",
293
+ "activity_date": "2021-07-26",
294
+ "course_title": "Synergized reciprocal encoding",
295
+ "course_subject": "business-management",
296
+ "is_engaged": 1,
297
+ "is_engaged_video": 1,
298
+ "is_engaged_forum": 1,
299
+ "is_engaged_problem": 1,
300
+ "is_active": 1,
301
+ "learning_time_seconds": 15753,
302
+ },
303
+ {
304
+ "user_id": 4038,
305
+ "email": "samanthaclarke@example.org",
306
+ "enterprise_customer_uuid": "33ce656295e04ecfa2a77d407eb96f69",
307
+ "course_key": "luGg+KNt30",
308
+ "enroll_type": "certificate",
309
+ "activity_date": "2021-07-19",
310
+ "course_title": "Synergized reciprocal encoding",
311
+ "course_subject": "business-management",
312
+ "is_engaged": 0,
313
+ "is_engaged_video": 0,
314
+ "is_engaged_forum": 0,
315
+ "is_engaged_problem": 0,
316
+ "is_active": 1,
317
+ "learning_time_seconds": 29,
318
+ }
319
+ ]
320
+
321
+ ENROLLMENT_STATS_CSVS = {
322
+ EnrollmentChart.ENROLLMENTS_OVER_TIME.value: (
323
+ b'enterprise_enrollment_date,certificate\n'
324
+ b'2020-04-03,1\n'
325
+ b'2020-04-08,1\n'
326
+ b'2021-05-11,1\n'
327
+ b'2021-07-03,1\n'
328
+ b'2021-07-04,1\n'
329
+ ),
330
+ EnrollmentChart.TOP_COURSES_BY_ENROLLMENTS.value: (
331
+ b'course_key,course_title,certificate\n'
332
+ b'NOGk+UVD31,Streamlined zero-defect attitude,1\n'
333
+ b'QWXx+Jqz64,Horizontal solution-oriented hub,1\n'
334
+ b'hEmW+tvk03,Re-engineered tangible approach,2\n'
335
+ b'qZJC+KFX86,Secured static capability,1\n'
336
+ ),
337
+ EnrollmentChart.TOP_SUBJECTS_BY_ENROLLMENTS.value: (
338
+ b'course_subject,certificate\nbusiness-management,2\ncommunication,1\nmedicine,1\nsocial-sciences,1\n'
339
+ )
340
+ }
341
+
342
+
343
+ def enrollments_dataframe():
344
+ """Return a DataFrame of enrollments."""
345
+ enrollments = pd.DataFrame(ENROLLMENTS)
346
+
347
+ enrollments['enterprise_enrollment_date'] = enrollments['enterprise_enrollment_date'].astype('datetime64[ns]')
348
+ enrollments['date_certificate_awarded'] = enrollments['date_certificate_awarded'].astype('datetime64[ns]')
349
+ enrollments['date_certificate_created_raw'] = enrollments['date_certificate_created_raw'].astype('datetime64[ns]')
350
+ enrollments['passed_date_raw'] = enrollments['passed_date_raw'].astype('datetime64[ns]')
351
+ enrollments['passed_date'] = enrollments['passed_date'].astype('datetime64[ns]')
352
+
353
+ return enrollments
354
+
355
+
356
+ def engagements_dataframe():
357
+ """Return a DataFrame of engagements."""
358
+ engagements = pd.DataFrame(ENGAGEMENTS)
359
+ engagements['activity_date'] = engagements['activity_date'].astype('datetime64[ns]')
360
+ return engagements
361
+
362
+
363
+ def enrollments_csv_content():
364
+ """Return the CSV content of enrollments."""
365
+ return (
366
+ b'email,course_title,course_subject,enroll_type,enterprise_enrollment_date\r\n'
367
+ b'rebeccanelson@example.com,Re-engineered tangible approach,business-management,certificate,2021-07-04\r\n'
368
+ b'taylorjames@example.com,Re-engineered tangible approach,business-management,certificate,2021-07-03\r\n'
369
+ b'ssmith@example.com,Secured static capability,medicine,certificate,2021-05-11\r\n'
370
+ b'amber79@example.com,Streamlined zero-defect attitude,communication,certificate,2020-04-08\r\n'
371
+ b'kathleenmartin@example.com,Horizontal solution-oriented hub,social-sciences,certificate,2020-04-03\r\n'
372
+ )
373
+
374
+
375
+ def leaderboard_csv_content():
376
+ """Return the CSV content of leaderboard."""
377
+ return (
378
+ b'email,learning_time_hours,daily_sessions,average_session_length,course_completions\r\n'
379
+ b'paul77@example.org,4.4,1,4.4,\r\nseth57@example.org,2.7,1,2.7,\r\n'
380
+ b'weaverpatricia@example.net,2.6,1,2.6,\r\nwebertodd@example.com,1.5,1,1.5,\r\n'
381
+ b'yferguson@example.net,1.3,1,1.3,\r\nyallison@example.org,1.2,1,1.2,\r\n'
382
+ b'padillamichelle@example.org,1.0,1,1.0,\r\ncaseyjohnny@example.com,0.0,0,,\r\n'
383
+ b'crystal86@example.net,0.0,0,,\r\ngraceperez@example.com,0.0,0,,\r\n'
384
+ b'mackwilliam@example.com,0.0,0,,\r\nsamanthaclarke@example.org,0.0,0,,\r\n'
385
+ )
386
+
387
+
388
+ LEADERBOARD_RESPONSE = [
389
+ {
390
+ "email": "paul77@example.org",
391
+ "daily_sessions": 1,
392
+ "learning_time_seconds": 15753,
393
+ "learning_time_hours": 4.4,
394
+ "average_session_length": 4.4,
395
+ "course_completions": None,
396
+ },
397
+ {
398
+ "email": "seth57@example.org",
399
+ "daily_sessions": 1,
400
+ "learning_time_seconds": 9898,
401
+ "learning_time_hours": 2.7,
402
+ "average_session_length": 2.7,
403
+ "course_completions": None,
404
+ },
405
+ {
406
+ "email": "weaverpatricia@example.net",
407
+ "daily_sessions": 1,
408
+ "learning_time_seconds": 9441,
409
+ "learning_time_hours": 2.6,
410
+ "average_session_length": 2.6,
411
+ "course_completions": None,
412
+ },
413
+ {
414
+ "email": "webertodd@example.com",
415
+ "daily_sessions": 1,
416
+ "learning_time_seconds": 5285,
417
+ "learning_time_hours": 1.5,
418
+ "average_session_length": 1.5,
419
+ "course_completions": None,
420
+ },
421
+ {
422
+ "email": "yferguson@example.net",
423
+ "daily_sessions": 1,
424
+ "learning_time_seconds": 4747,
425
+ "learning_time_hours": 1.3,
426
+ "average_session_length": 1.3,
427
+ "course_completions": None,
428
+ },
429
+ {
430
+ "email": "yallison@example.org",
431
+ "daily_sessions": 1,
432
+ "learning_time_seconds": 4335,
433
+ "learning_time_hours": 1.2,
434
+ "average_session_length": 1.2,
435
+ "course_completions": None,
436
+ },
437
+ {
438
+ "email": "padillamichelle@example.org",
439
+ "daily_sessions": 1,
440
+ "learning_time_seconds": 3724,
441
+ "learning_time_hours": 1.0,
442
+ "average_session_length": 1.0,
443
+ "course_completions": None,
444
+ },
445
+ {
446
+ "email": "caseyjohnny@example.com",
447
+ "daily_sessions": 0,
448
+ "learning_time_seconds": 0,
449
+ "learning_time_hours": 0.0,
450
+ "average_session_length": None,
451
+ "course_completions": None,
452
+ },
453
+ {
454
+ "email": "crystal86@example.net",
455
+ "daily_sessions": 0,
456
+ "learning_time_seconds": 0,
457
+ "learning_time_hours": 0.0,
458
+ "average_session_length": None,
459
+ "course_completions": None,
460
+ },
461
+ {
462
+ "email": "graceperez@example.com",
463
+ "daily_sessions": 0,
464
+ "learning_time_seconds": 21,
465
+ "learning_time_hours": 0.0,
466
+ "average_session_length": None,
467
+ "course_completions": None,
468
+ },
469
+ {
470
+ "email": "mackwilliam@example.com",
471
+ "daily_sessions": 0,
472
+ "learning_time_seconds": 0,
473
+ "learning_time_hours": 0.0,
474
+ "average_session_length": None,
475
+ "course_completions": None,
476
+ },
477
+ {
478
+ "email": "samanthaclarke@example.org",
479
+ "daily_sessions": 0,
480
+ "learning_time_seconds": 29,
481
+ "learning_time_hours": 0.0,
482
+ "average_session_length": None,
483
+ "course_completions": None,
484
+ },
485
+ ]
486
+
487
+ COMPLETIONS_STATS_CSVS = {
488
+ ChartType.COMPLETIONS_OVER_TIME.value: (
489
+ b'passed_date,certificate\n'
490
+ b'2021-08-25,1\n'
491
+ b'2021-09-01,2\n'
492
+ ),
493
+ ChartType.TOP_COURSES_BY_COMPLETIONS.value: (
494
+ b'course_key,course_title,certificate\n'
495
+ b'hEmW+tvk03,Re-engineered tangible approach,2\n'
496
+ ),
497
+ ChartType.TOP_SUBJECTS_BY_COMPLETIONS.value: (
498
+ b'course_subject,certificate\n'
499
+ b'business-management,2\n'
500
+ )
501
+ }
@@ -2,7 +2,8 @@
2
2
 
3
3
  import pandas as pd
4
4
 
5
- from enterprise_data.admin_analytics.constants import ENROLLMENT_CSV
5
+ from enterprise_data.admin_analytics.constants import EnrollmentChart
6
+ from enterprise_data.admin_analytics.utils import ChartType
6
7
 
7
8
  ENROLLMENTS = [
8
9
  {
@@ -71,7 +72,7 @@ ENROLLMENTS = [
71
72
  "cert_awarded": 0,
72
73
  "date_certificate_created_raw": None,
73
74
  "passed_date_raw": None,
74
- "passed_date": None,
75
+ "passed_date": '2022-08-24',
75
76
  "has_passed": 0,
76
77
  },
77
78
  {
@@ -94,7 +95,7 @@ ENROLLMENTS = [
94
95
  "cert_awarded": 0,
95
96
  "date_certificate_created_raw": None,
96
97
  "passed_date_raw": None,
97
- "passed_date": None,
98
+ "passed_date": "2022-08-24",
98
99
  "has_passed": 0,
99
100
  },
100
101
  {
@@ -117,13 +118,13 @@ ENROLLMENTS = [
117
118
  "cert_awarded": 0,
118
119
  "date_certificate_created_raw": None,
119
120
  "passed_date_raw": None,
120
- "passed_date": None,
121
+ "passed_date": "2022-08-20",
121
122
  "has_passed": 0,
122
123
  },
123
124
  ]
124
125
 
125
126
  ENROLLMENT_STATS_CSVS = {
126
- ENROLLMENT_CSV.ENROLLMENTS_OVER_TIME.value: (
127
+ EnrollmentChart.ENROLLMENTS_OVER_TIME.value: (
127
128
  b'enterprise_enrollment_date,certificate\n'
128
129
  b'2020-04-03,1\n'
129
130
  b'2020-04-08,1\n'
@@ -131,17 +132,32 @@ ENROLLMENT_STATS_CSVS = {
131
132
  b'2021-07-03,1\n'
132
133
  b'2021-07-04,1\n'
133
134
  ),
134
- ENROLLMENT_CSV.TOP_COURSES_BY_ENROLLMENTS.value: (
135
+ EnrollmentChart.TOP_COURSES_BY_ENROLLMENTS.value: (
135
136
  b'course_key,course_title,certificate\n'
136
137
  b'NOGk+UVD31,Streamlined zero-defect attitude,1\n'
137
138
  b'QWXx+Jqz64,Horizontal solution-oriented hub,1\n'
138
139
  b'hEmW+tvk03,Re-engineered tangible approach,2\n'
139
140
  b'qZJC+KFX86,Secured static capability,1\n'
140
141
  ),
141
- ENROLLMENT_CSV.TOP_SUBJECTS_BY_ENROLLMENTS.value: (
142
+ EnrollmentChart.TOP_SUBJECTS_BY_ENROLLMENTS.value: (
142
143
  b'course_subject,certificate\nbusiness-management,2\ncommunication,1\nmedicine,1\nsocial-sciences,1\n'
143
144
  )
144
145
  }
146
+ COMPLETIONS_STATS_CSVS = {
147
+ ChartType.COMPLETIONS_OVER_TIME.value: (
148
+ b'passed_date,certificate\n'
149
+ b'2021-08-25,1\n'
150
+ b'2021-09-01,2\n'
151
+ ),
152
+ ChartType.TOP_COURSES_BY_COMPLETIONS.value: (
153
+ b'course_key,course_title,certificate\n'
154
+ b'hEmW+tvk03,Re-engineered tangible approach,2\n'
155
+ ),
156
+ ChartType.TOP_SUBJECTS_BY_COMPLETIONS.value: (
157
+ b'course_subject,certificate\n'
158
+ b'business-management,2\n'
159
+ )
160
+ }
145
161
 
146
162
 
147
163
  def enrollments_dataframe():