Skip to content

Commit 60ff839

Browse files
committed
Course daily metrics pipeline update to support enrollment metrics rework
- Updated figures.pipeline.course_daily_metrics loader to use the new enrollment pipeline code - Renamed `get_average_progress` to `get_average_progress_deprecated` and retained if needed to help debug the new enrollment metrics - Updated tests to support these changes
1 parent ba9e110 commit 60ff839

File tree

2 files changed

+26
-16
lines changed

2 files changed

+26
-16
lines changed

figures/pipeline/course_daily_metrics.py

+13-4
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from figures.models import CourseDailyMetrics, PipelineError
2929
from figures.pipeline.logger import log_error
3030
import figures.pipeline.loaders
31+
from figures.pipeline.enrollment_metrics import bulk_calculate_course_progress_data
3132
from figures.serializers import CourseIndexSerializer
3233
from figures.compat import GeneratedCertificate
3334
import figures.sites
@@ -81,7 +82,7 @@ def get_active_learner_ids_today(course_id, date_for):
8182
).values_list('student__id', flat=True).distinct()
8283

8384

84-
def get_average_progress(course_id, date_for, course_enrollments):
85+
def get_average_progress_deprecated(course_id, date_for, course_enrollments):
8586
"""Collects and aggregates raw course grades data
8687
"""
8788
progress = []
@@ -225,6 +226,9 @@ def extract(self, course_id, date_for=None, **_kwargs):
225226
average_days_to_complete=data.get('average_days_to_complete, None'),
226227
num_learners_completed=data['num_learners_completed'],
227228
)
229+
TODO: refactor this class
230+
Add lazy loading method to load course enrollments
231+
- Create a method for each metric field
228232
"""
229233

230234
# Update args if not assigned
@@ -247,18 +251,23 @@ def extract(self, course_id, date_for=None, **_kwargs):
247251
# we can do a lambda for course_enrollments to get the count
248252

249253
data['enrollment_count'] = course_enrollments.count()
254+
250255
active_learner_ids_today = get_active_learner_ids_today(
251256
course_id, date_for,)
252257
if active_learner_ids_today:
253258
active_learners_today = active_learner_ids_today.count()
254259
else:
255260
active_learners_today = 0
256-
257261
data['active_learners_today'] = active_learners_today
258-
data['average_progress'] = get_average_progress(
259-
course_id, date_for, course_enrollments,)
262+
263+
# Average progress
264+
progress_data = bulk_calculate_course_progress_data(course_id=course_id,
265+
date_for=date_for)
266+
data['average_progress'] = progress_data['average_progress']
267+
260268
data['average_days_to_complete'] = get_average_days_to_complete(
261269
course_id, date_for,)
270+
262271
data['num_learners_completed'] = get_num_learners_completed(
263272
course_id, date_for,)
264273

tests/pipeline/test_course_daily_metrics.py

+13-12
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ def test_get_active_learner_ids_today(self):
158158
course_id=self.course_overview.id, date_for=self.today)
159159
assert recs.count() == len(self.course_enrollments)
160160

161-
def test_get_average_progress(self):
161+
def test_get_average_progress_deprecated(self):
162162
"""
163163
[John] This test needs work. The function it is testing needs work too
164164
for testability. We don't want to reproduce the function's behavior, we
@@ -167,7 +167,7 @@ def test_get_average_progress(self):
167167
"""
168168
course_enrollments = CourseEnrollment.objects.filter(
169169
course_id=self.course_overview.id)
170-
actual = pipeline_cdm.get_average_progress(
170+
actual = pipeline_cdm.get_average_progress_deprecated(
171171
course_id=self.course_overview.id,
172172
date_for=self.today,
173173
course_enrollments=course_enrollments
@@ -183,13 +183,13 @@ def test_get_average_progress(self):
183183
'figures.metrics.LearnerCourseGrades.course_progress',
184184
side_effect=PermissionDenied('mock-failure')
185185
)
186-
def test_get_average_progress_error(self, mock_lcg):
186+
def test_get_average_progress_deprecated_has_error(self, mock_lcg):
187187

188188
assert PipelineError.objects.count() == 0
189189
course_enrollments = CourseEnrollment.objects.filter(
190190
course_id=self.course_overview.id)
191191

192-
results = pipeline_cdm.get_average_progress(
192+
results = pipeline_cdm.get_average_progress_deprecated(
193193
course_id=self.course_overview.id,
194194
date_for=self.today,
195195
course_enrollments=course_enrollments
@@ -236,8 +236,12 @@ def setup(self, db):
236236
self.course_enrollments = [CourseEnrollmentFactory() for i in range(1, 5)]
237237
self.student_module = StudentModuleFactory()
238238

239-
def test_extract(self):
239+
def test_extract(self, monkeypatch):
240240
course_id = self.course_enrollments[0].course_id
241+
monkeypatch.setattr(figures.pipeline.course_daily_metrics,
242+
'bulk_calculate_course_progress_data',
243+
lambda **_kwargs: dict(average_progress=0.5))
244+
241245
results = pipeline_cdm.CourseDailyMetricsExtractor().extract(course_id)
242246
assert results
243247

@@ -298,14 +302,11 @@ def test_load_existing(self):
298302
@pytest.mark.parametrize('average_progress', [-1.0, -0.01, 1.01])
299303
def test_load_invalid_data(self, monkeypatch, average_progress):
300304

301-
def mock_get_average_progress(course_id, date_for, course_enrollments):
302-
return average_progress
303-
304305
course_id = self.course_enrollments[0].course_id
305-
monkeypatch.setattr(
306-
figures.pipeline.course_daily_metrics,
307-
'get_average_progress',
308-
mock_get_average_progress)
306+
monkeypatch.setattr(figures.pipeline.course_daily_metrics,
307+
'bulk_calculate_course_progress_data',
308+
lambda **_kwargs: dict(average_progress=average_progress))
309+
309310
with pytest.raises(ValidationError) as execinfo:
310311
assert CourseDailyMetrics.objects.count() == 0
311312
cdm, created = pipeline_cdm.CourseDailyMetricsLoader(course_id).load()

0 commit comments

Comments
 (0)