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()
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
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
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
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
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)
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)
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)
def test_invalid_val(self): with pytest.raises(TypeError): days_from("some string", 1)
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)]
def enroll_date(max_days_back): days_back = random.randint(1, abs(max_days_back)) return days_from(LAST_DAY, days_back * -1)
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()