def gendata(request): data = {} for course in modulestore().get_courses(): data[course.id] = {} print("Loading info for course {courseid}".format(courseid = course.id)) enrolled_students = User.objects.filter( courseenrollment__course_id=course.id, ).prefetch_related("groups").order_by('username') enrolled_students = [st for st in enrolled_students if not _has_staff_access_to_course_id(st, course.id)] if len(enrolled_students) <= 0: continue #Category weights gradeset = student_grades(enrolled_students[0], request, course, keep_raw_scores=False, use_offline=False) category_weights = {} for section in gradeset['grade_breakdown']: category_weights[section['category']] = section['weight'] for user in enrolled_students: data[course.id][user.email] = {} #User data[course.id][user.email]["user"] = user #Raw statistic by problems gradeset = student_grades(user, request, course, keep_raw_scores=True, use_offline=False) statprob = [(getattr(score, 'earned', '') or score[0]) for score in gradeset['raw_scores']] #By subsection statsec = [] complition = 0 complition_cnt = 0 try: courseware_summary = grades.progress_summary(user, request, course); for chapter in courseware_summary: total = 0 flag = False for section in chapter['sections']: if not section['graded'] or len(section['format']) < 1: continue flag = True statsec += [((section['section_total'].earned / section['section_total'].possible) if section['section_total'].possible else 0)] total += ((section['section_total'].earned / section['section_total'].possible) if section['section_total'].possible else 0) * category_weights.get(section['format'], 0.0) statsec += [total] if flag: complition += total complition_cnt += 1 except: pass if complition_cnt == 0: complition = 0 else: complition = complition / complition_cnt if complition > 0.7: data[course.id][user.email]["0.7"] = True else: data[course.id][user.email]["0.7"] = False if complition > 0.99: data[course.id][user.email]["1.0"] = True else: data[course.id][user.email]["1.0"] = False data[course.id][user.email]["prob_info"] = statprob data[course.id][user.email]["sec_info"] = statsec print("Loading info for course {courseid} - COMPLETE - total {users}".format(courseid = course.id, users = len (data[course.id]) )) return data
def fullstat(request = None): request = DummyRequest() header = [u'ФИО', u'ФИО (измененное)', u'логин школы', u'email', u'email (измененное)', u'курс', u'зарег. в пакет рег.', u"дата рег. на курс", u'2/3', u'100%', u'Задачи/Задания(Модули)'] assignments = [] datatablefull = {'header': header, 'assignments': assignments, 'students': []} datafull = [] for course in modulestore().get_courses(): datarow = [u'-', u'-', u'-', u'-', u'-', course.id, u'-', u'-', u'-'] assignments = [] enrolled_students = User.objects.filter( courseenrollment__course_id=course.id, ).prefetch_related("groups").order_by('username') enrolled_students = [st for st in enrolled_students if not _has_staff_access_to_course_id(st, course.id)] if len(enrolled_students) <= 0: continue gradeset = student_grades(enrolled_students[0], request, course, keep_raw_scores=True, use_offline=False) courseware_summary = grades.progress_summary(enrolled_students[0], request, course); if courseware_summary is None: continue assignments += [score.section for score in gradeset['raw_scores']] for chapter in courseware_summary: for section in chapter['sections']: if not section['graded'] or len(section['format']) < 1: continue assignments += [section['format']] assignments += [chapter['display_name']] datarow += assignments datafull.append(datarow) edxdata = gendata(request) print("Dumping fullstat") f = open("/opt/data.csv") if f is None: return False; ff = UnicodeDictReader(f, delimiter=';', quoting=csv.QUOTE_NONE) usermap = {} idx = 0 for row in ff: idx += 1 usermap.setdefault(row['email'],[]).append(row) for course in modulestore().get_courses(): enrolled_students = User.objects.filter( courseenrollment__course_id=course.id, courseenrollment__is_active=1, ).prefetch_related("groups").order_by('username') enrolled_students = [st for st in enrolled_students if not _has_staff_access_to_course_id(st, course.id)] idx = 0 for user in enrolled_students: try: idx += 1 datarow = [] found = False rows = [] try: for elem in user.profile.get_meta().get('old_emails',[])[::-1]: if usermap[elem[0]]: found = True rows = usermap[elem[0]] break if not found and usermap[user.email]: found = True rows = usermap[user.email] except: pass off_reg = False try: for row in rows: found = False for course_id, course_name in coursemap.iteritems(): if course_name in row['subject']: found = True off_reg = True break if found: break except: pass #User name = '' try: name = rows[0]['second-name'] + ' ' + rows[0]['first-name'] + ' ' + rows[0]['patronymic'] except: pass datarow += [name] if user.profile.name != name: datarow += [user.profile.name] else: datarow += [u''] try: datarow += [rows[0]['login']] except: datarow += [''] email = '' try: datarow += [rows[0]['email']] email = rows[0]['email'] except: datarow += [''] if user.email != email: datarow += [user.email] else: datarow += [u''] #Course datarow += [course.display_name] if off_reg: datarow += [u'Да'] else: datarow += [u'Нет'] try: courseenrollment = user.courseenrollment_set.filter(course_id = course.id)[0] datarow += [courseenrollment.created.strftime('%d/%m/%Y')] except: continue #Raw statistic by problems statprob = edxdata[course.id][user.email]["prob_info"] #By subsection statsec = edxdata[course.id][user.email]["sec_info"] if edxdata[course.id][user.email]["0.7"]: datarow += [u"Да"] else: datarow += [u"Нет"] if edxdata[course.id][user.email]["1.0"]: datarow += [u"Да"] else: datarow += [u"Нет"] if len(statsec) > 0 and len(statprob) > 0: datarow += statprob datarow += statsec datafull.append(datarow) except: logging.exception("Something awful happened in fullstat!") pass datatablefull['data'] = datafull return_csv('full_stat.csv',datatablefull, open("/var/www/edx/fullstat.csv", "wb")) for course in modulestore().get_courses(): print("Dumping course {courseid}".format(courseid = course.id)) assignments = [] enrolled_students = User.objects.filter( courseenrollment__course_id=course.id, ).prefetch_related("groups").order_by('username') enrolled_students = [st for st in enrolled_students if not _has_staff_access_to_course_id(st, course.id)] if len(enrolled_students) <= 0: continue gradeset = student_grades(enrolled_students[0], request, course, keep_raw_scores=True, use_offline=False) courseware_summary = grades.progress_summary(enrolled_students[0], request, course); if courseware_summary is None: print "No courseware_summary" continue assignments += [score.section for score in gradeset['raw_scores']] for chapter in courseware_summary: for section in chapter['sections']: if not section['graded'] or len(section['format']) < 1: continue assignments += [section['format']] assignments += [chapter['display_name']] header = [u'ФИО', u'логин школы', u'email', u"дата регистрации на курс", u'2/3', u'100%'] header += assignments datatable = {'header': header, 'assignments': assignments, 'students': []} data = [] for user in enrolled_students: try: datarow = [] #User name = user.profile.name datarow += [name] datarow += [user.profile.work_login] datarow += [user.email] courseenrollment = user.courseenrollment_set.filter(course_id = course.id)[0] datarow += [courseenrollment.created.strftime('%d/%m/%Y')] #Raw statistic by problems statprob = edxdata[course.id][user.email]["prob_info"] #By subsection statsec = edxdata[course.id][user.email]["sec_info"] if edxdata[course.id][user.email]["0.7"]: datarow += [u"Да"] else: datarow += [u"Нет"] if edxdata[course.id][user.email]["1.0"]: datarow += [u"Да"] else: datarow += [u"Нет"] if len(statsec) > 0 and len(statprob) > 0: datarow += statprob datarow += statsec else: datarow += [0] * len(assignments) data.append(datarow) except: logging.exception("Something awful happened in {course_id}!".format(course_id = course.id)) pass datatable['data'] = data return_csv(course.id,datatable, open("/var/www/edx/" + course.id.replace('/','_') + ".xls", "wb"), encoding="cp1251", dialect="excel-tab") return_csv(course.id,datatable, open("/var/www/edx/" + course.id.replace('/','_') + ".csv", "wb")) return True