Exemple #1
0
def populate_daily_metrics(date_for=None, force_update=False):
    '''Populates the daily metrics models for the given date

    This method populates CourseDailyMetrics for all the courses in the site,
    then populates SiteDailyMetrics

    It calls the individual tasks, ``populate_single_cdm`` and
    ``populate_site_daily_metrics`` as immediate calls so that no courses are
    missed when the site daily metrics record is populated.

    NOTE: We have an experimental task that runs the course populators in

    parallel, then when they are all done, populates the site metrics. See the
    function ``experimental_populate_daily_metrics`` docstring for details

    TODO: Add error handling and error logging
    TODO: Create and add decorator to assign 'date_for' if None
    '''
    if date_for:
        date_for = as_date(date_for)
    else:
        date_for = datetime.datetime.utcnow().replace(tzinfo=utc).date()

    logger.info(
        'Starting task "figures.populate_daily_metrics" for date "{}"'.format(
            date_for))

    for site in Site.objects.all():
        for course in figures.sites.get_courses_for_site(site):
            try:
                populate_single_cdm(course_id=course.id,
                                    date_for=date_for,
                                    force_update=force_update)
            except Exception as e:
                logger.exception('figures.tasks.populate_daily_metrics failed')
                # Always capture CDM load exceptions to the Figures pipeline
                # error table
                error_data = dict(
                    date_for=date_for,
                    msg='figures.tasks.populate_daily_metrics failed',
                    exception_class=e.__class__.__name__,
                )
                if hasattr(e, 'message_dict'):
                    error_data['message_dict'] = e.message_dict
                log_error_to_db(
                    error_data=error_data,
                    error_type=PipelineError.COURSE_DATA,
                    course_id=str(course.id),
                    site=site,
                    logger=logger,
                    log_pipeline_errors_to_db=True,
                )
        populate_site_daily_metrics(site_id=site.id,
                                    date_for=date_for,
                                    force_update=force_update)

    logger.info(
        'Finished task "figures.populate_daily_metrics" for date "{}"'.format(
            date_for))
Exemple #2
0
def populate_daily_metrics(date_for=None, force_update=False):
    '''Populates the daily metrics models for the given date

    This method populates CourseDailyMetrics for all the courses in the site,
    then populates SiteDailyMetrics

    It calls the individual tasks, ``populate_single_cdm`` and
    ``populate_site_daily_metrics`` as immediate calls so that no courses are
    missed when the site daily metrics record is populated.

    NOTE: We have an experimental task that runs the course populators in

    parallel, then when they are all done, populates the site metrics. See the
    function ``experimental_populate_daily_metrics`` docstring for details

    TODO: Add error handling and error logging
    TODO: Create and add decorator to assign 'date_for' if None
    '''
    if date_for:
        date_for = as_date(date_for)
    else:
        date_for = datetime.datetime.utcnow().replace(tzinfo=utc).date()

    logger.info(
        'Starting task "figures.populate_daily_metrics" for date "{}"'.format(
            date_for))

    sites_count = Site.objects.count()
    for i, site in enumerate(Site.objects.all()):
        try:
            for course in figures.sites.get_courses_for_site(site):
                try:
                    populate_single_cdm(course_id=course.id,
                                        date_for=date_for,
                                        force_update=force_update)
                except Exception as e:  # pylint: disable=broad-except
                    logger.exception(
                        'figures.tasks.populate_daily_metrics failed')
                    # Always capture CDM load exceptions to the Figures pipeline
                    # error table
                    error_data = dict(
                        date_for=date_for,
                        msg='figures.tasks.populate_daily_metrics failed',
                        exception_class=e.__class__.__name__,
                    )
                    if hasattr(e, 'message_dict'):
                        error_data['message_dict'] = e.message_dict  # pylint: disable=no-member
                    log_error_to_db(
                        error_data=error_data,
                        error_type=PipelineError.COURSE_DATA,
                        course_id=str(course.id),
                        site=site,
                        logger=logger,
                        log_pipeline_errors_to_db=True,
                    )
            populate_site_daily_metrics(site_id=site.id,
                                        date_for=date_for,
                                        force_update=force_update)

            # Until we implement signal triggers
            try:
                update_enrollment_data(site_id=site.id)
            except Exception:  # pylint: disable=broad-except
                msg = ('FIGURES:FAIL figures.tasks update_enrollment_data '
                       ' unhandled exception. site[{}]:{}')
                logger.exception(msg.format(site.id, site.domain))

        except Exception:  # pylint: disable=broad-except
            msg = ('FIGURES:FAIL populate_daily_metrics unhandled site level'
                   ' exception for site[{}]={}')
            logger.exception(msg.format(site.id, site.domain))
        logger.info(
            "figures.populate_daily_metrics: finished Site {:04d} of {:04d}".
            format(i, sites_count))
    logger.info(
        'Finished task "figures.populate_daily_metrics" for date "{}"'.format(
            date_for))