Esempio n. 1
0
 def test_days_from(self, days):
     '''TODO: Test with input as a
     - datetime
     - date
     - str
     - unicode
     '''
     expected = self.now + datetime.timedelta(days=days)
     assert days_from(self.now, days) == expected
     assert days_from(self.now.date(), days) == expected.date()
Esempio n. 2
0
def seed_users(data=None):
    if not data:
        data = cans.USER_DATA

    first_date = days_from(LAST_DAY, DAYS_BACK * -1)
    created_users = []
    for rec in data:
        try:
            profile_rec = rec.get('profile', None)
            user = get_user_model().objects.create_user(
                username=rec['username'],
                password=rec['password'],
                email=rec['email'],
            )
            user.is_staff = rec.get('is_staff', False)
            user.is_superuser = rec.get('is_superuser', False)
            user.date_joined = as_datetime(
                FAKE.date_between(first_date, LAST_DAY)).replace(tzinfo=utc)
            user.save()
            created_users.append(user)
            if profile_rec:
                UserProfile.objects.create(
                    user=user,
                    name=profile_rec['fullname'],
                    gender=profile_rec.get('gender', None),
                    country=profile_rec.get('country', None),
                )
        except IntegrityError as e:
            print('skipping duplicate user email {}'.format(e))
    return created_users
Esempio n. 3
0
    def test_edrec_exists_older_lcgm(self):
        ce = self.enrollments[0]
        older_date = days_from(self.date_for, -2)

        # Create existing Figures records
        EnrollmentDataFactory(site=self.site,
                              user=ce.user,
                              course_id=str(ce.course_id),
                              date_for=older_date)
        older_lcgm = LearnerCourseGradeMetricsFactory(site=self.site,
                                                      user=ce.user,
                                                      course_id=str(
                                                          ce.course_id),
                                                      date_for=older_date)

        # Make sure that the LCGM we created is the most recent one
        assert LearnerCourseGradeMetrics.objects.latest_lcgm(
            ce.user, ce.course_id) == older_lcgm
        # assert lcgm1 == older_lcgm
        # run our code under test
        ed, created = EnrollmentData.objects.update_metrics(self.site, ce)
        # verify our Figures records are updated
        after_lcgm = LearnerCourseGradeMetrics.objects.latest_lcgm(
            ce.user, ce.course_id)
        after_ed = EnrollmentData.objects.get(site=self.site,
                                              user=ce.user,
                                              course_id=str(ce.course_id))
        assert after_lcgm.date_for == self.date_for
        assert after_ed.date_for == self.date_for
Esempio n. 4
0
def generate_cdm_data_for_course(course_id):
    """
    Just getting it working first, then we'll make the values more reasonable

    like value = sorted([lower_bound, x, upper_bound])[1]

    """
    cdm_data = []
    yesterday = {}
    end_date = prev_day(datetime.datetime.now())
    start_date = days_from(end_date, -180)

    for dt in rrule(DAILY, dtstart=start_date, until=end_date):
        enrollment_count = yesterday.get('enrollment_count', 0) + randint(
            0, 10)
        average_progress = gen_avg_progress(
            yesterday.get('average_progress', 0))
        average_days_to_complete = randint(10, 30)
        num_learners_completed = gen_num_learners_completed(yesterday)

        rec = dict(
            course_id=course_id,
            date_for=dt.strftime('%Y-%m-%d'),
            enrollment_count=enrollment_count,
            active_learners_today=randint(0, enrollment_count // 2),
            average_progress=average_progress,
            average_days_to_complete=average_days_to_complete,
            num_learners_completed=num_learners_completed,
        )
        cdm_data.append(rec)
        yesterday = rec
    return cdm_data
Esempio n. 5
0
 def test_student_modules_active_on_date(self):
     our_date_for = fake.date_this_year()
     our_created_sm = [
         StudentModuleFactory(course_id=self.course_overview.id,
                              created=our_date_for) for _ in range(2)
     ]
     our_modified_sm = [
         StudentModuleFactory(course_id=self.course_overview.id,
                              modified=our_date_for) for _ in range(2)
     ]
     # Create record with a different date
     StudentModuleFactory(course_id=self.course_overview.id,
                          created=days_from(our_date_for, -2),
                          modified=days_from(our_date_for, -1))
     course = Course(self.course_overview.id)
     found_sm = course.student_modules_active_on_date(our_date_for)
     assert set(our_created_sm + our_modified_sm) == set(found_sm)
 def test_get_previous_cumulative_active_user_count_not_yesterday(self):
     prior_date = days_from(self.date_for, -5)
     prior_sdm = SiteDailyMetricsFactory(site=self.site,
                                         date_for=prior_date,
                                         **SDM_DATA[1])
     actual = pipeline_sdm.get_previous_cumulative_active_user_count(
         site=self.site, date_for=self.date_for)
     assert prior_sdm.cumulative_active_user_count > 0
     assert actual == prior_sdm.cumulative_active_user_count
Esempio n. 7
0
def seed_course_daily_metrics_for_course(course_id):
    end_date = LAST_DAY
    start_date = days_from(end_date, -DAYS_BACK)

    for dt in rrule(DAILY, dtstart=start_date, until=end_date):
        if VERBOSE:
            print('populating day {} for course {}'.format(dt, course_id))
        cdm, created = pipeline_cdm.CourseDailyMetricsLoader(course_id).load(
            date_for=dt, force_update=True)
Esempio n. 8
0
def seed_site_daily_metrics(data=None):
    """
    Run seed_course_daily_metrics first

    Then, for each date for which we have a CDM record
    """
    end_date = LAST_DAY
    start_date = days_from(end_date, -DAYS_BACK)
    for dt in rrule(DAILY, dtstart=start_date, until=end_date):
        pipeline_sdm.SiteDailyMetricsLoader().load(site=get_site(),
                                                   date_for=dt,
                                                   force_update=True)
Esempio n. 9
0
 def test_enrollments_active_on_date(self):
     our_date_for = fake.date_this_year()
     other_date_for = days_from(our_date_for, -1)
     our_ce = [
         CourseEnrollmentFactory(course_id=self.course_overview.id)
         for _ in range(2)
     ]
     our_sm = []
     for ce in our_ce:
         our_sm.extend([
             StudentModuleFactory.from_course_enrollment(
                 ce, modified=our_date_for),
             StudentModuleFactory.from_course_enrollment(
                 ce, created=our_date_for)
         ])
     # Create enrollment we should not get in our results
     other_ce = CourseEnrollmentFactory(course_id=self.course_overview.id)
     StudentModuleFactory.from_course_enrollment(other_ce,
                                                 created=other_date_for,
                                                 modified=other_date_for)
     course = Course(self.course_overview.id)
     found_ce = course.enrollments_active_on_date(our_date_for)
     assert set(found_ce) == set(our_ce)
Esempio n. 10
0
 def test_invalid_val(self):
     with pytest.raises(TypeError):
         days_from("some string", 1)
Esempio n. 11
0
def days_back_list(days_back):
    end_date = prev_day(datetime.datetime.now())
    start_date = days_from(end_date, abs(days_back) * -1)
    return [day for day in rrule(DAILY, dtstart=start_date, until=end_date)]
Esempio n. 12
0
 def enroll_date(max_days_back):
     days_back = random.randint(1, abs(max_days_back))
     return days_from(LAST_DAY, days_back * -1)
Esempio n. 13
0
from student.models import CourseAccessRole, CourseEnrollment, UserProfile

from figures.compat import RELEASE_LINE, GeneratedCertificate
from figures.models import (
    CourseDailyMetrics,
    LearnerCourseGradeMetrics,
    SiteDailyMetrics,
)
from figures.helpers import as_course_key, as_datetime, days_from, prev_day
from figures.pipeline import course_daily_metrics as pipeline_cdm
from figures.pipeline import site_daily_metrics as pipeline_sdm

from devsite import cans

FAKE = faker.Faker()
LAST_DAY = days_from(datetime.datetime.now(), -2).replace(tzinfo=utc)

DAYS_BACK = 180
NO_LEARNERS_PER_COURSE = 50

# Quick and dirty debuging
VERBOSE = False


def get_site():
    """
    In demo mode, we have just one site (for now)
    """
    return Site.objects.first()