def test_store_mau_metrics(monkeypatch, sm_test_data): """ Basic minimal test """ mock_today = datetime(year=sm_test_data['year_for'], month=sm_test_data['month_for'], day=1) freezer = freeze_time(mock_today) freezer.start() site = sm_test_data['site'] data = store_mau_metrics(site=site) freezer.stop() site_mau = data['smo'].mau assert site_mau == len(sm_test_data['student_modules']) assert data['smo'].year == mock_today.year assert data['smo'].month == mock_today.month assert len(data['cmos']) == len(sm_test_data['course_overviews']) for cmo in data['cmos']: assert cmo.year == mock_today.year assert cmo.month == mock_today.month expected_course_sm = get_student_modules_for_course_in_site( site=site, course_id=cmo.course_id) expected_mau = get_mau_from_student_modules( student_modules=expected_course_sm, year=mock_today.year, month=mock_today.month) # TODO: Fix, rudimentary check, improve assert expected_mau
def get_mau_from_site_course(site, course_id, year, month): """Convenience function to get the distinct active users for a given course in a site """ student_modules = get_student_modules_for_course_in_site( site=site, course_id=course_id) return get_mau_from_student_modules(student_modules=student_modules, year=year, month=month)
def get_all_mau_for_site_course(site, courselike, month_for): """ Extract a queryset of distinct MAU user ids for the site and course """ sm_recs = get_student_modules_for_course_in_site(site, as_course_key(courselike)) mau_ids = get_mau_from_student_modules(student_modules=sm_recs, year=month_for.year, month=month_for.month) return mau_ids
def retrieve_live_course_mau_data(site, course_id): """ Used this when we need to retrieve unique active users for a given course in the site """ student_modules = get_student_modules_for_course_in_site(site, course_id) today = datetime.utcnow() users = get_mau_from_student_modules(student_modules=student_modules, year=today.year, month=today.month) return dict( count=users.count(), month_for=today.date(), course_id=str(course_id), domain=site.domain, )
def bulk_calculate_course_progress_data(course_id, date_for=None): """Calculates the average progress for a set of course enrollments How it works 1. collects progress percent for each course enrollment 1.1. If up to date enrollment metrics record already exists, use that 2. calculate and return the average of these enrollments TODO: Update to filter on active users Questions: - What makes a learner an active learner? """ progress_percentages = [] if not date_for: date_for = datetime.utcnow().replace(tzinfo=utc).date() site = get_site_for_course(course_id) if not site: raise UnlinkedCourseError( 'No site found for course "{}"'.format(course_id)) course_sm = get_student_modules_for_course_in_site(site=site, course_id=course_id) for ce in course_enrollments_for_course(course_id): metrics = collect_metrics_for_enrollment(site=site, course_enrollment=ce, course_sm=course_sm, date_for=date_for) if metrics: progress_percentages.append(metrics.progress_percent) else: # Log this for troubleshooting error_data = dict( msg=('Unable to create or retrieve enrollment metrics ' + 'for user {} and course {}'.format( ce.user.username, str(ce.course_id)))) log_error(error_data=error_data, error_type=PipelineError.COURSE_DATA, user=ce.user, course_id=str(course_id)) return dict( average_progress=calculate_average_progress(progress_percentages), )