def student_dates(request, course_id='all'): if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id is 'all': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) data = OrderedDict() for course in courses: for user in UserEnrol.objects.using(course).all(): thedate = user.created.strftime('%Y-%m-%d') if thedate not in data: data[thedate] = {'enrolled': 0, 'active': 0, 'aggregate_enrolled': 0, 'aggregate_active': 0} data[thedate]['enrolled'] += 1 if user.is_active == "1": data[thedate]['active'] += 1 data = OrderedDict(sorted(data.items())) count = 0 activecount = 0 for date in data: count += data[date]['enrolled'] activecount += data[date]['active'] data[date]['aggregate_enrolled'] = count data[date]['aggregate_active'] = activecount return api.views.api_render(request, data, status.HTTP_200_OK)
def student_modes(request, course_id='all'): """ Lists all modes of enrolment for the enrolled students """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id is 'all': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) modes = {'audit':0,'honor':0,'verified':0} total = 0 for course in courses: paced_students = None if 'cutoff' in request.GET and request.GET['cutoff'] == 'true': paced_students = get_paced_students(request, course) for user in UserEnrol.objects.using(course).all(): if not paced_students or user.user_id in paced_students: if user.mode not in modes: modes[user.mode] = 0 modes[user.mode] += 1 total += 1 modes['total'] = total data = modes return api.views.api_render(request, data, status.HTTP_200_OK)
def meta_courseprofile(request, course_id='all'): """ Returns derived course profiles for a course """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id == 'all' or course_id == 'allcourses': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) data = {} for course in courses: data[course] = {} course_data = CourseProfile.objects.using("personcourse").filter( course=course) if len(course_data) > 0: data[course] = course_data[0].to_dict(None) data[course]['status'] = 'available' else: data[course]['status'] = 'unavailable' return api.views.api_render(request, data, status.HTTP_200_OK)
def student_personcourse(request, course_id='all'): """ Lists all genders for the enrolled students """ #Disable cache for the time being #if api.views.is_cached(request): # return api.views.api_cacherender(request) fields = None if 'fields' in request.GET: fields = request.GET['fields'].split(',') courses = [] course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['dbname']) data = [] PersonCourse._meta.db_table = 'personcourse_'+course_id pc_exists = api.views.db_table_exists('personcourse',PersonCourse._meta.db_table) if pc_exists: paced_students = None if 'cutoff' in request.GET and request.GET['cutoff'] == 'true': paced_students = get_paced_students(request, course_id) for table_user in PersonCourse.objects.using("personcourse").all(): if not paced_students or table_user.user_id in paced_students: data.append(table_user.to_dict(fields)) # print "LENGTH IS"+str(len(data)) return api.views.api_render(request, data, status.HTTP_200_OK)
def student_dates(request, course_id='all'): if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id == 'all' or course_id == 'allcourses': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) data = OrderedDict() for course in courses: for user in UserEnrol.objects.using(course).all(): thedate = user.created.strftime('%Y-%m-%d') if thedate not in data: data[thedate] = {'enrolled': 0, 'active': 0, 'aggregate_enrolled': 0, 'aggregate_active': 0} data[thedate]['enrolled'] += 1 if user.is_active == "1": data[thedate]['active'] += 1 data = OrderedDict(sorted(data.items())) count = 0 activecount = 0 for date in data: count += data[date]['enrolled'] activecount += data[date]['active'] data[date]['aggregate_enrolled'] = count data[date]['aggregate_active'] = activecount return api.views.api_render(request, data, status.HTTP_200_OK)
def meta_courseprofile(request, course_id='all'): """ Returns derived course profiles for a course """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id is 'all': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) data = {} for course in courses: data[course] = {} course_data = CourseProfile.objects.using("personcourse").filter(course=course) if len(course_data) > 0: data[course] = course_data[0].to_dict(None) data[course]['status'] = 'available' else: data[course]['status'] = 'unavailable' return api.views.api_render(request, data, status.HTTP_200_OK)
def student_countries(request, course_id='all'): """ Lists """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id == 'all' or course_id == 'allcourses': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) data = OrderedDict() total = 0 for course_id in courses: course = api.views.get_course(course_id) coursedata = Log.countcountryenrolments('clickstream', course['mongoname']) for countrydata in coursedata: if countrydata['country'] not in data: data[countrydata['country']] = {'count': 0, 'percentage': 0} data[countrydata['country']]['count'] += countrydata['count'] total += countrydata['count'] for country in data: data[country]['percentage'] = float(data[country]['count']) / float(total)*100 return api.views.api_render(request, data, status.HTTP_200_OK)
def student_modes(request, course_id='all'): """ Lists all modes of enrolment for the enrolled students """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id == 'all' or course_id == 'allcourses': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) modes = {'audit':0,'honor':0,'verified':0} total = 0 for course in courses: paced_students = None if 'cutoff' in request.GET and request.GET['cutoff'] == 'true': paced_students = get_paced_students(request, course) for user in UserEnrol.objects.using(course).all(): if not paced_students or user.user_id in paced_students: if user.mode not in modes: modes[user.mode] = 0 modes[user.mode] += 1 total += 1 modes['total'] = total data = modes return api.views.api_render(request, data, status.HTTP_200_OK)
def student_aus(request, course_id='all'): """ Lists """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id is 'all': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) data = OrderedDict() total = 0 for course_id in courses: course = api.views.get_course(course_id) coursedata = Log.countcountryenrolments('clickstream', course['mongoname']) for countrydata in coursedata: if countrydata['country'] not in data: data[countrydata['country']] = {'count': 0, 'percentage': 0} data[countrydata['country']]['count'] = countrydata['count'] data[countrydata['country']]['percentage'] = countrydata['percentage'] # total += countrydata['count'] # for country in data: # data[country]['percentage'] = float(data[country]['count']) / float(total)*100 return api.views.api_render(request, data, status.HTTP_200_OK)
def meta_enrolcount(request, course_id='all'): """ Returns the enrolment count over the last week """ if api.views.is_cached(request): return api.views.api_cacherender(request) data = OrderedDict() courses = [] if course_id == 'all' or course_id == 'allcourses': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course_id) day_students = 0 week_students = 0 month_students = 0 for course in courses: last_date = None PersonCourse._meta.db_table = 'personcourse_' + course if api.views.db_table_exists("personcourse", PersonCourse._meta.db_table): for table_user in PersonCourse.objects.using("personcourse").all(): if table_user.start_time is not None: if last_date is None or table_user.start_time > last_date: last_date = table_user.start_time if last_date is not None: month_ago = last_date + timedelta(-30) week_ago = last_date + timedelta(-7) day_ago = last_date + timedelta(-1) PersonCourse._meta.db_table = 'personcourse_' + course for table_user in PersonCourse.objects.using("personcourse").all(): if table_user.start_time is not None: if table_user.start_time > month_ago: month_students += 1 if table_user.start_time > week_ago: week_students += 1 if table_user.start_time > day_ago: day_students += 1 data['last_week'] = str(week_students) data['last_month'] = str(month_students) data['last_day'] = str(day_students) return api.views.api_render(request, data, status.HTTP_200_OK)
def meta_enrolcount(request, course_id='all'): """ Returns the enrolment count over the last week """ if api.views.is_cached(request): return api.views.api_cacherender(request) data = OrderedDict() courses = [] if course_id is 'all': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course_id) day_students = 0 week_students = 0 month_students = 0 for course in courses: last_date = None PersonCourse._meta.db_table = 'personcourse_'+course if api.views.db_table_exists("personcourse",PersonCourse._meta.db_table): for table_user in PersonCourse.objects.using("personcourse").all(): if table_user.start_time is not None: if last_date is None or table_user.start_time > last_date: last_date = table_user.start_time if last_date is not None: month_ago = last_date + timedelta(-30) week_ago = last_date + timedelta(-7) day_ago = last_date + timedelta(-1) PersonCourse._meta.db_table = 'personcourse_'+course for table_user in PersonCourse.objects.using("personcourse").all(): if table_user.start_time is not None: if table_user.start_time > month_ago: month_students += 1 if table_user.start_time > week_ago: week_students += 1 if table_user.start_time > day_ago: day_students += 1 data['last_week'] = str(week_students) data['last_month'] = str(month_students) data['last_day'] = str(day_students) return api.views.api_render(request, data, status.HTTP_200_OK)
def student_educations(request, course_id='all'): """ Lists all prior education levels for the enrolled students """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id is 'all': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) education_map = { 'p': 'Doctorate', 'm': 'Masters', 'b': 'Bachelor', 'a': 'Associate', 'hs': 'Secondary school', 'jhs': 'Middle school', 'el': 'Primary school', 'other': 'Other', 'p_se': 'Doctorate', 'p_oth': 'Doctorate' } education = OrderedDict() education['Primary school'] = 0 education['Middle school'] = 0 education['Secondary school'] = 0 education['Associate'] = 0 education['Bachelor'] = 0 education['Masters'] = 0 education['Doctorate'] = 0 education['Other'] = 0 for course in courses: paced_students = None if 'cutoff' in request.GET and request.GET['cutoff'] == 'true': paced_students = get_paced_students(request, course) for user in UserProfile.objects.using(course).all(): if user.level_of_education in education_map and user.level_of_education != '': user.level_of_education = education_map[user.level_of_education] else: user.level_of_education = "Unspecified" if not paced_students or user.user_id in paced_students: if user.level_of_education not in education: education[user.level_of_education] = 0 education[user.level_of_education] += 1 data = education return api.views.api_render(request, data, status.HTTP_200_OK)
def student_educations(request, course_id='all'): """ Lists all prior education levels for the enrolled students """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id == 'all' or course_id == 'allcourses': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) education_map = { 'p': 'Doctorate', 'm': 'Masters', 'b': 'Bachelor', 'a': 'Associate', 'hs': 'Secondary school', 'jhs': 'Middle school', 'el': 'Primary school', 'other': 'Other', 'p_se': 'Doctorate', 'p_oth': 'Doctorate' } education = OrderedDict() education['Primary school'] = 0 education['Middle school'] = 0 education['Secondary school'] = 0 education['Associate'] = 0 education['Bachelor'] = 0 education['Masters'] = 0 education['Doctorate'] = 0 education['Other'] = 0 for course in courses: paced_students = None if 'cutoff' in request.GET and request.GET['cutoff'] == 'true': paced_students = get_paced_students(request, course) for user in UserProfile.objects.using(course).all(): if user.level_of_education in education_map and user.level_of_education != '': user.level_of_education = education_map[user.level_of_education] else: user.level_of_education = "Unspecified" if not paced_students or user.user_id in paced_students: if user.level_of_education not in education: education[user.level_of_education] = 0 education[user.level_of_education] += 1 data = education return api.views.api_render(request, data, status.HTTP_200_OK)
def student_fullages(request, course_id='all'): """ Lists all ages for the enrolled students """ max_age = 100 if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id is 'all': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) age = OrderedDict() for i in range(0, max_age): age[str(i)] = 0 for course in courses: pass paced_students = None if 'cutoff' in request.GET and request.GET['cutoff'] == 'true': paced_students = get_paced_students(request, course) for user in UserProfile.objects.using(course).all(): if user.year_of_birth == 'NULL': user.year_of_birth = "Unknown" else: theage = 0 try: theage = (2014 - int(user.year_of_birth)) if theage <= max_age: theage = str(theage) if not paced_students or user.user_id in paced_students: if theage not in age: age[theage] = 0 age[theage] += 1 except ValueError: logger.error("Age is not a year") data = age return api.views.api_render(request, data, status.HTTP_200_OK)
def student_fullages(request, course_id='all'): """ Lists all ages for the enrolled students """ max_age = 100 if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id == 'all' or course_id == 'allcourses': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) age = OrderedDict() for i in range(0, max_age): age[str(i)] = 0 for course in courses: pass paced_students = None if 'cutoff' in request.GET and request.GET['cutoff'] == 'true': paced_students = get_paced_students(request, course) for user in UserProfile.objects.using(course).all(): if user.year_of_birth == 'NULL': user.year_of_birth = "Unknown" else: theage = 0 try: theage = (2014 - int(user.year_of_birth)) if theage <= max_age: theage = str(theage) if not paced_students or user.user_id in paced_students: if theage not in age: age[theage] = 0 age[theage] += 1 except ValueError: logger.error("Age is not a year") data = age return api.views.api_render(request, data, status.HTTP_200_OK)
def student_active(request, course_id='all'): if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id == 'all' or course_id == 'allcourses': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) data = OrderedDict() datadays = {} dataweeks = {} data['days'] = OrderedDict() data['weeks'] = OrderedDict() for course_id in courses: course = api.views.get_course(course_id) activeusers = Log.activeusersdaily('clickstream', course['mongoname']) for day in activeusers: if day['_id'] not in data['days']: datadays[day['_id']] = 0 datadays[day['_id']] += day['userCount'] activeusersweekly = Log.activeusersweekly('clickstream', course['mongoname']) for week in activeusersweekly: theyear = week['_id'][0:4] theweek = week['_id'][5:].zfill(2) realdate = datetime.datetime.strptime(theyear+theweek+'1', '%Y%W%w') thedate = realdate.strftime("%Y-%m-%d") if thedate not in data['weeks']: dataweeks[thedate] = 0 dataweeks[thedate] += week['userCount'] for key in sorted(datadays.iterkeys()): data['days'][key] = datadays[key] for key in sorted(dataweeks.iterkeys()): data['weeks'][key] = dataweeks[key] return api.views.api_render(request, data, status.HTTP_200_OK)
def student_active(request, course_id='all'): if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id is 'all': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) data = OrderedDict() datadays = {} dataweeks = {} data['days'] = OrderedDict() data['weeks'] = OrderedDict() for course_id in courses: course = api.views.get_course(course_id) activeusers = Log.activeusersdaily('clickstream', course['mongoname']) for day in activeusers: if day['_id'] not in data['days']: datadays[day['_id']] = 0 datadays[day['_id']] += day['userCount'] activeusersweekly = Log.activeusersweekly('clickstream', course['mongoname']) for week in activeusersweekly: theyear = week['_id'][0:4] theweek = week['_id'][5:].zfill(2) realdate = datetime.datetime.strptime(theyear+theweek+'1', '%Y%W%w') thedate = realdate.strftime("%Y-%m-%d") if thedate not in data['weeks']: dataweeks[thedate] = 0 dataweeks[thedate] += week['userCount'] for key in sorted(datadays.iterkeys()): data['days'][key] = datadays[key] for key in sorted(dataweeks.iterkeys()): data['weeks'][key] = dataweeks[key] return api.views.api_render(request, data, status.HTTP_200_OK)
def student_genders(request, course_id='all'): """ Lists all genders for the enrolled students """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id == 'all' or course_id == 'allcourses': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) gender_map = {'m': 'Male', 'f': 'Female', 'o': 'Other'} gender = OrderedDict() gender['Male'] = 0 gender['Female'] = 0 gender['Other'] = 0 gender['Unspecified'] = 0 for course in courses: paced_students = None if 'cutoff' in request.GET and request.GET['cutoff'] == 'true': paced_students = get_paced_students(request, course) for user in UserProfile.objects.using(course).all(): #print user if user.gender in gender_map: user.gender = gender_map[str(user.gender)] else: user.gender = "Unspecified" if user.gender == 'm': user.gender = "Male" if user.gender == 'f': user.gender = "Female" if user.gender == 'o': user.gender = "Other" if not paced_students or user.user_id in paced_students: gender[str(user.gender)] += 1 data = gender return api.views.api_render(request, data, status.HTTP_200_OK)
def student_in_age_range(request, course_id='all'): if api.views.is_cached(request): return api.views.api_cacherender(request) age_range = {'start': 13, 'end': 17} courses = [] if course_id == 'all' or course_id == 'allcourses': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) data = student_in_age_range_xx(courses, age_range) return api.views.api_render(request, data, status.HTTP_200_OK)
def student_in_age_range(request, course_id='all'): if api.views.is_cached(request): return api.views.api_cacherender(request) age_range = {'start': 13, 'end': 17} courses = [] if course_id == 'all': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) data = student_in_age_range_xx(courses, age_range) return api.views.api_render(request, data, status.HTTP_200_OK)
def student_genders(request, course_id='all'): """ Lists all genders for the enrolled students """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id is 'all': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) gender_map = {'m': 'Male', 'f': 'Female', 'o': 'Other'} gender = OrderedDict() gender['Male'] = 0 gender['Female'] = 0 gender['Other'] = 0 gender['Unspecified'] = 0 for course in courses: paced_students = None if 'cutoff' in request.GET and request.GET['cutoff'] == 'true': paced_students = get_paced_students(request, course) for user in UserProfile.objects.using(course).all(): #print user if user.gender in gender_map: user.gender = gender_map[str(user.gender)] else: user.gender = "Unspecified" if user.gender == 'm': user.gender = "Male" if user.gender == 'f': user.gender = "Female" if user.gender == 'o': user.gender = "Other" if not paced_students or user.user_id in paced_students: gender[str(user.gender)] += 1 data = gender return api.views.api_render(request, data, status.HTTP_200_OK)
def meta_courses(request): """ Lists the course information, in particular the course ID """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] for db in uqx_api.courses.EDX_DATABASES: if db == 'default' or db == 'personcourse' or db == 'Course_Event': continue course = OrderedDict() course['id'] = db course['name'] = str(db).replace('_', ' ') course['icon'] = uqx_api.courses.EDX_DATABASES[db]['icon'] course['year'] = uqx_api.courses.EDX_DATABASES[db]['year'] courses.append(course) courses = sorted(courses, key=lambda k: k['year']) data = courses return api.views.api_render(request, data, status.HTTP_200_OK)
def meta_courses(request): """ Lists the course information, in particular the course ID """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] for db in uqx_api.courses.EDX_DATABASES: if db == 'default' or db == 'personcourse' or db == 'Course_Event': continue course = OrderedDict() course['id'] = db course['name'] = str(db).replace('_', ' ') course['icon'] = uqx_api.courses.EDX_DATABASES[db]['icon'] course['year'] = uqx_api.courses.EDX_DATABASES[db]['year'] course['term'] = uqx_api.courses.EDX_DATABASES[db]['term'] courses.append(course) courses = sorted(courses, key=lambda k: k['year']) data = courses return api.views.api_render(request, data, status.HTTP_200_OK)
def meta_courseinfo(request): """ Lists the course information, in particular the course ID with extra information """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] for db in uqx_api.courses.EDX_DATABASES: if db == 'default' or db == 'personcourse' or db == 'Course_Event': continue course = OrderedDict() course['id'] = db course['name'] = str(db).replace('_', ' ') course['icon'] = uqx_api.courses.EDX_DATABASES[db]['icon'] course['year'] = uqx_api.courses.EDX_DATABASES[db]['year'] coursedb = api.views.get_course(course['id']) filename = uqx_api.courses.EDX_DATABASES[db]['discussiontable'].replace("/", "-").replace("-prod", "") courseurl = config.SERVER_URL + '/datasources/course_structure/'+filename+'.json' data = '[]' try: data = urllib2.urlopen(courseurl).read().replace('<script','').replace('</script>','') try: data = json.loads(data) max_per_day_date = datetime.now() if 'end' in data: course['end'] = data['end'] course['end'] = str(str(course['end']).replace('+00:00', 'Z')).replace('"', "") if 'start' in data: course['start'] = data['start'] course['start'] = str(str(course['start']).replace('+00:00', 'Z')).replace('"', "") max_per_day_date = dateutil.parser.parse(course['start']) + timedelta(days=7) if 'start' in data and 'end' not in data: course['end'] = course['start'] if 'display_name' in data: course['display_name'] = data['display_name'] max_per_day_date = max_per_day_date.replace(tzinfo=None) total = 0 within_per_day = 0 certificates = 0 duringcourse = 0 first_date = datetime.now() for user in UserEnrol.objects.using(db).all(): userdate = user.created.replace(tzinfo=None) if first_date > userdate: first_date = userdate if userdate < max_per_day_date: within_per_day += 1 total += 1 certificates += 1 if course['end'] == "null": duringcourse += 1 else: if userdate < datetime.strptime(course['end'], "%Y-%m-%dT%H:%M:%SZ"): duringcourse += 1 certificates = len(UserCertificate.objects.using(db).filter(status='downloadable')) range = (max_per_day_date - first_date).days per_day = round(within_per_day/range, 2) course['enrolments'] = total course['enrolments_per_day'] = per_day course['certificates'] = certificates course['enroled_during_course'] = duringcourse courses.append(course) except Exception as e: print "COULDNT PARSE COURSE DATA FOR "+course['id'] logger.info("COULDNT PARSE COURSE DATA FOR "+course['id']) logger.info("COURSE URL: "+str(courseurl)) logger.info(e) print data pass except Exception as e: print "COULDNT PARSE COURSE "+course['id'] logger.info("COULDNT PARSE COURSE "+course['id']) logger.info("COURSE URL: "+str(courseurl)) logger.info(e) pass data = courses return api.views.api_render(request, data, status.HTTP_200_OK)
def meta_courseinfo(request): """ Lists the course information, in particular the course ID with extra information """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] for db in uqx_api.courses.EDX_DATABASES: if db == 'default' or db == 'personcourse' or db == 'Course_Event': continue course = OrderedDict() course['id'] = db course['name'] = str(db).replace('_', ' ') course['icon'] = uqx_api.courses.EDX_DATABASES[db]['icon'] course['year'] = uqx_api.courses.EDX_DATABASES[db]['year'] coursedb = api.views.get_course(course['id']) #filename = uqx_api.courses.EDX_DATABASES[db]['discussiontable'].replace("/", "-").replace("-prod", "") filename = uqx_api.courses.EDX_DATABASES[db]['dbname'].replace( "_", "-") courseurl = config.SERVER_URL + '/datasources/course_structure/' + filename + '.json' data = '[]' try: data = urllib2.urlopen(courseurl).read().replace( '<script', '').replace('</script>', '') try: data = json.loads(data) max_per_day_date = datetime.now() if 'end' in data: course['end'] = data['end'] course['end'] = str( str(course['end']).replace('+00:00', 'Z')).replace('"', "") if 'start' in data: course['start'] = data['start'] course['start'] = str( str(course['start']).replace('+00:00', 'Z')).replace('"', "") max_per_day_date = dateutil.parser.parse( course['start']) + timedelta(days=7) if 'start' in data and 'end' not in data: course['end'] = course['start'] if 'display_name' in data: course['display_name'] = data['display_name'] max_per_day_date = max_per_day_date.replace(tzinfo=None) total = 0 within_per_day = 0 certificates = 0 duringcourse = 0 first_date = datetime.now() for user in UserEnrol.objects.using(db).all(): userdate = user.created.replace(tzinfo=None) if first_date > userdate: first_date = userdate if userdate < max_per_day_date: within_per_day += 1 total += 1 certificates += 1 if userdate < datetime.strptime(course['end'], "%Y-%m-%dT%H:%M:%SZ"): duringcourse += 1 certificates = len( UserCertificate.objects.using(db).filter( status='downloadable')) range = (max_per_day_date - first_date).days per_day = round(within_per_day / range, 2) course['enrolments'] = total course['enrolments_per_day'] = per_day course['certificates'] = certificates course['enroled_during_course'] = duringcourse courses.append(course) except Exception as e: logger.info("COULDNT PARSE COURSE DATA FOR " + course['id']) logger.info("COURSE URL: " + str(courseurl)) logger.info(e) pass except Exception as e: logger.info("COULDNT PARSE COURSE " + course['id']) logger.info("COURSE URL: " + str(courseurl)) logger.info(e) pass data = courses return api.views.api_render(request, data, status.HTTP_200_OK)
def student_ages(request, course_id='all'): """ Lists all ages for the enrolled students """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id == 'all' or course_id == 'allcourses': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) age = OrderedDict() age["Less than 12"] = 0 age["12-15"] = 0 age["16-18"] = 0 age["19-22"] = 0 age["23-25"] = 0 age["26-30"] = 0 age["31-40"] = 0 age["31-40"] = 0 age["41-50"] = 0 age["Over 50"] = 0 for course in courses: paced_students = None if 'cutoff' in request.GET and request.GET['cutoff'] == 'true': paced_students = get_paced_students(request, course) for user in UserProfile.objects.using(course).all(): if user.year_of_birth == 'NULL': user.year_of_birth = "Unknown" else: theage = 0 try: theage = 2014 - int(user.year_of_birth) except ValueError: logger.error("Age is not a year") if theage < 12: user.year_of_birth = "Less than 12" elif theage < 16: user.year_of_birth = "12-15" elif theage < 19: user.year_of_birth = "16-18" elif theage < 23: user.year_of_birth = "19-22" elif theage < 26: user.year_of_birth = "23-25" elif theage < 31: user.year_of_birth = "26-30" elif theage < 41: user.year_of_birth = "31-40" elif theage < 51: user.year_of_birth = "41-50" else: user.year_of_birth = "Over 50" if not paced_students or user.user_id in paced_students: if user.year_of_birth not in age: age[user.year_of_birth] = 0 age[user.year_of_birth] += 1 data = age return api.views.api_render(request, data, status.HTTP_200_OK)
def person_profile(request, user_id): """ Lists the demographic for a specific student """ data = { 'status': 'error', 'message': 'No information for ID ' + str(user_id) } courses = [] profiles = {} personcourse = {} for db in uqx_api.courses.EDX_DATABASES: if db == 'default' or db == 'personcourse' or db == 'Course_Event': continue print db try: users = UserProfile.objects.using(db).filter(user_id=user_id) if len(users) > 0: courses.append(db) profile = {} profile['name'] = users[0].name profile['language'] = users[0].language profile['location'] = users[0].location profile['mailing_address'] = users[0].mailing_address profile['gender'] = users[0].gender profile['meta'] = users[0].meta profile['goals'] = users[0].goals profile['city'] = users[0].city profile['country'] = users[0].country profile['year_of_birth'] = users[0].year_of_birth profile['level_of_education'] = users[0].level_of_education profiles = profile else: print "NO users for " + db except Exception as e: print "ECCC" + str(e) pass for course_id in courses: PersonCourse._meta.db_table = 'personcourse_' + course_id pc_exists = api.views.db_table_exists('personcourse', PersonCourse._meta.db_table) if pc_exists: person = PersonCourse.objects.using("personcourse").filter( user_id=user_id) print "----" print person print "====" person_object = {} if len(person) > 0: person_object['registered'] = person[0].registered person_object['viewed'] = person[0].viewed person_object['explored'] = person[0].explored person_object['certified'] = person[0].certified person_object['final_cc_cname'] = person[0].final_cc_cname person_object['LoE'] = person[0].LoE person_object['YoB'] = person[0].YoB person_object['gender'] = person[0].gender person_object['mode'] = person[0].mode person_object['grade'] = person[0].grade person_object['start_time'] = person[0].start_time person_object['last_event'] = person[0].last_event person_object['nevents'] = person[0].nevents person_object['ndays_act'] = person[0].ndays_act person_object['nplay_video'] = person[0].nplay_video person_object['nchapters'] = person[0].nchapters person_object['nforum_posts'] = person[0].nforum_posts person_object['roles'] = person[0].roles person_object['attempted_problems'] = person[ 0].attempted_problems personcourse[course_id] = person_object if len(courses) > 0: data = {} data['profile'] = profile data['courses'] = courses data['person_course'] = personcourse return api.views.api_render(request, data, status.HTTP_200_OK)
def person_profile(request, user_id): """ Lists the demographic for a specific student """ data = {'status': 'error', 'message': 'No information for ID '+str(user_id)} courses = [] profiles = {} personcourse = {} for db in uqx_api.courses.EDX_DATABASES: if db == 'default' or db == 'personcourse' or db == 'Course_Event': continue print db try: users = UserProfile.objects.using(db).filter(user_id=user_id) if len(users) > 0: courses.append(db) profile = {} profile['name'] = users[0].name profile['language'] = users[0].language profile['location'] = users[0].location profile['mailing_address'] = users[0].mailing_address profile['gender'] = users[0].gender profile['meta'] = users[0].meta profile['goals'] = users[0].goals profile['city'] = users[0].city profile['country'] = users[0].country profile['year_of_birth'] = users[0].year_of_birth profile['level_of_education'] = users[0].level_of_education profiles = profile else: print "NO users for "+db except Exception as e: print "ECCC"+str(e) pass for course_id in courses: PersonCourse._meta.db_table = 'personcourse_'+course_id pc_exists = api.views.db_table_exists('personcourse',PersonCourse._meta.db_table) if pc_exists: person = PersonCourse.objects.using("personcourse").filter(user_id=user_id) print "----" print person print "====" person_object = {} if len(person) > 0: person_object['registered'] = person[0].registered person_object['viewed'] = person[0].viewed person_object['explored'] = person[0].explored person_object['certified'] = person[0].certified person_object['final_cc_cname'] = person[0].final_cc_cname person_object['LoE'] = person[0].LoE person_object['YoB'] = person[0].YoB person_object['gender'] = person[0].gender person_object['mode'] = person[0].mode person_object['grade'] = person[0].grade person_object['start_time'] = person[0].start_time person_object['last_event'] = person[0].last_event person_object['nevents'] = person[0].nevents person_object['ndays_act'] = person[0].ndays_act person_object['nplay_video'] = person[0].nplay_video person_object['nchapters'] = person[0].nchapters person_object['nforum_posts'] = person[0].nforum_posts person_object['roles'] = person[0].roles person_object['attempted_problems'] = person[0].attempted_problems personcourse[course_id] = person_object if len(courses) > 0: data = {} data['profile'] = profile data['courses'] = courses data['person_course'] = personcourse return api.views.api_render(request, data, status.HTTP_200_OK)
def student_ages(request, course_id='all'): """ Lists all ages for the enrolled students """ if api.views.is_cached(request): return api.views.api_cacherender(request) courses = [] if course_id is 'all': courselist = api.views.get_all_courses() for course in courselist: courses.append(courselist[course]['id']) pass else: course = api.views.get_course(course_id) if course is None: return api.views.api_render(request, {'error': 'Unknown course code'}, status.HTTP_404_NOT_FOUND) courses.append(course['id']) age = OrderedDict() age["Less than 12"] = 0 age["12-15"] = 0 age["16-18"] = 0 age["19-22"] = 0 age["23-25"] = 0 age["26-30"] = 0 age["31-40"] = 0 age["31-40"] = 0 age["41-50"] = 0 age["Over 50"] = 0 for course in courses: paced_students = None if 'cutoff' in request.GET and request.GET['cutoff'] == 'true': paced_students = get_paced_students(request, course) for user in UserProfile.objects.using(course).all(): if user.year_of_birth == 'NULL': user.year_of_birth = "Unknown" else: theage = 0 try: theage = 2014 - int(user.year_of_birth) except ValueError: logger.error("Age is not a year") if theage < 12: user.year_of_birth = "Less than 12" elif theage < 16: user.year_of_birth = "12-15" elif theage < 19: user.year_of_birth = "16-18" elif theage < 23: user.year_of_birth = "19-22" elif theage < 26: user.year_of_birth = "23-25" elif theage < 31: user.year_of_birth = "26-30" elif theage < 41: user.year_of_birth = "31-40" elif theage < 51: user.year_of_birth = "41-50" else: user.year_of_birth = "Over 50" if not paced_students or user.user_id in paced_students: if user.year_of_birth not in age: age[user.year_of_birth] = 0 age[user.year_of_birth] += 1 data = age return api.views.api_render(request, data, status.HTTP_200_OK)