Example #1
0
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
Example #2
0
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)
Example #3
0
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
Example #4
0
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), )