Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #7
0
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)
Beispiel #8
0
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)
Beispiel #9
0
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)
Beispiel #10
0
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)
Beispiel #11
0
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)
Beispiel #12
0
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)
Beispiel #13
0
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)
Beispiel #14
0
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)
Beispiel #15
0
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)
Beispiel #16
0
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)
Beispiel #17
0
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)
Beispiel #18
0
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)
Beispiel #19
0
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)
Beispiel #20
0
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)
Beispiel #21
0
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)
Beispiel #22
0
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)
Beispiel #23
0
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)
Beispiel #24
0
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)
Beispiel #25
0
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)
Beispiel #26
0
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)
Beispiel #27
0
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)
Beispiel #28
0
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)
Beispiel #29
0
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)
Beispiel #30
0
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)