Beispiel #1
0
    def _compute_and_update_grade(self,
                                  student,
                                  course,
                                  course_structure,
                                  read_only=False):
        """
        Freshly computes and updates the grade for the student and course.

        If read_only is True, doesn't save any updates to the grades.
        """
        course_grade = CourseGrade(student, course, course_structure)
        course_grade.compute_and_update(read_only)
        # END TMA GRADE TRACKING UPDATE
        mongo_persist = dashboardStats()
        collection = mongo_persist.connect()
        add_user = {}
        add_user['user_id'] = student.id
        add_user['username'] = student.username
        add_user['passed'] = course_grade.passed
        add_user['percent'] = course_grade.percent
        add_user['summary'] = course_grade.summary
        mongo_persist.add_user_grade_info(collection, str(course.id), add_user)
        log.info('mongo_tracking_insert')
        # END TMA GRADE TRACKING UPDATE
        return course_grade
Beispiel #2
0
def ensure_certif(request, course_id):
    user_id = request.user.id
    username = request.user.username
    course_key = SlashSeparatedCourseKey.from_deprecated_string(course_id)
    course_tma = get_course_by_id(course_key)
    is_graded = course_tma.is_graded
    grade_cutoffs = modulestore().get_course(
        course_key, depth=0).grade_cutoffs['Pass'] * 100
    grading_note = CourseGradeFactory().create(request.user, course_tma)

    #TMA GRADE TRACKING UPDATE
    mongo_persist = dashboardStats()
    collection = mongo_persist.connect()
    add_user = {}
    add_user['user_id'] = request.user.id
    add_user['username'] = request.user.username
    add_user['passed'] = grading_note.passed
    add_user['percent'] = grading_note.percent
    add_user['summary'] = grading_note.summary
    mongo_persist.add_user_grade_info(collection, str(course_id), add_user)
    # END TMA GRADE TRACKING UPDATE

    passed = grading_note.passed
    percent = float(int(grading_note.percent * 1000) / 10)
    overall_progress = get_overall_progress(request.user.id, course_key)
    context = {
        'passed': passed,
        'percent': percent,
        'is_graded': is_graded,
        'grade_cutoffs': grade_cutoffs,
        'overall_progress': overall_progress
    }

    return JsonResponse(context)
Beispiel #3
0
    def overall_grades_infos(self):

        mongo_persist = dashboardStats()
        find_mongo_persist_course = mongo_persist.return_grades_values(
            self.course_id)

        context = {
            "all_user":
            find_mongo_persist_course['num_users'],
            "user_finished":
            find_mongo_persist_course['passed'],
            'course_average_grade':
            round(find_mongo_persist_course['average_grades'], 1),
            'passed_average_grades':
            round(find_mongo_persist_course['passed_average_grades'], 1)
        }

        return context
Beispiel #4
0
    def load_persisted_grade(cls, user, course, course_structure):
        """
        Initializes a CourseGrade object, filling its members with persisted values from the database.

        If the grading policy is out of date, recomputes the grade.

        If no persisted values are found, returns None.
        """
        try:
            persistent_grade = PersistentCourseGrade.read_course_grade(
                user.id, course.id)
        except PersistentCourseGrade.DoesNotExist:
            return None
        course_grade = CourseGrade(user, course, course_structure)

        current_grading_policy_hash = course_grade.get_grading_policy_hash(
            course.location, course_structure)
        if current_grading_policy_hash != persistent_grade.grading_policy_hash:
            return None
        else:
            course_grade._percent = persistent_grade.percent_grade  # pylint: disable=protected-access
            course_grade._letter_grade = persistent_grade.letter_grade  # pylint: disable=protected-access
            course_grade.course_version = persistent_grade.course_version
            course_grade.course_edited_timestamp = persistent_grade.course_edited_timestamp
        #TMA GRADE TRACKING UPDATE
        mongo_persist = dashboardStats()
        collection = mongo_persist.connect()
        add_user = {}
        add_user['user_id'] = user.id
        add_user['username'] = user.username
        add_user['passed'] = course_grade.passed
        add_user['percent'] = course_grade.percent
        add_user['summary'] = course_grade.summary
        mongo_persist.add_user_grade_info(collection, str(course.id), add_user)
        log.info('mongo_tracking_insert')
        # END TMA GRADE TRACKING UPDATE

        course_grade._log_event(log.info, u"load_persisted_grade")  # pylint: disable=protected-access

        return course_grade
    def generate_xls(self):
        log.warning(_("tma_grade_reports : start generate_xls"))
        log.warning(_("tma_grade_reports : course_id : " + self.course_id))

        #get request body

        body = json.loads(self.request.body).get('fields')

        log.warning(_("tma_grade_reports : microsite : " + self.microsite))
        log.warning(_("tma_grade_reports : body : " + str(body)))
        #get mongodb course's grades
        mongo_persist = dashboardStats()
        find_mongo_persist_course = mongo_persist.get_course(self.course_id)

        #prepare workbook
        _wb = self.prepare_workbook()
        sheet_count = _wb.get_sheet('reports')

        #form factory connection
        form_factory = ensure_form_factory()
        form_factory_db = 'ensure_form'
        form_factory_collection = 'certificate_form'
        form_factory.connect(db=form_factory_db,
                             collection=form_factory_collection)

        #get register & certificate fields info
        register_form_ = configuration_helpers.get_value('FORM_EXTRA')
        certificates_form_ = configuration_helpers.get_value(
            'CERTIFICATE_FORM_EXTRA')

        #prepare workbook header
        k = 0
        for u in body:
            if not ('final-grades' and 'summary') in u:
                sheet_count.write(0, k, u)
                k = k + 1
            elif "summary" in u:
                grade_breakdown = find_mongo_persist_course[0].get(
                    'users_info').get('summary').get('grade_breakdown')
                for key, value in grade_breakdown.items():
                    sheet_count.write(0, k, value.get('category'))
                    k = k + 1
            elif "final-grades" in u:
                sheet_count.write(0, k, 'final grade')
                k = k + 1
                sheet_count.write(0, k, 'Eligible attestation')
                k = k + 1

        #sheets row
        j = 1

        #write differents workbook_rows
        for _row in find_mongo_persist_course:
            # get row user_id
            user_id = _row['user_id']

            #ensure user exist if False pass to next row
            ensure_user_exist = True
            try:
                #get current row users mysql auth_user & aut_userprofile info
                _user = User.objects.raw(
                    "SELECT a.id,a.email,a.username,a.date_joined,b.custom_field FROM auth_user a,auth_userprofile b WHERE a.id = b.user_id and a.id = %s",
                    [user_id])

                #prepare dict of auth_user info
                user = {}

                #prepare dict of aut_userprofile info
                user_profile = {}

                #prepare dict of certificate form info
                user_certif_profile = {}

                #ensure only first occurance of _user is use
                det = 0

                #get current user certificates forms values
                if certificates_form_ is not None:
                    form_factory.microsite = self.microsite
                    form_factory.user_id = user_id
                    try:
                        user_certif_profile = form_factory.getForm(
                            user_id=True, microsite=True).get('form')
                        log.ingo("user_certif_profile")
                        log.warning(user_certif_profile)
                    except:
                        pass

                #hydrate user & user_profile dicts
                for extract in _user:
                    if det < 1:
                        #hydrate user dict
                        user['id'] = extract.id
                        user['email'] = extract.email
                        user['username'] = extract.username
                        user['date_joined'] = extract.date_joined

                        #row from auth_userprofile mysql table
                        _user_profile = extract.custom_field

                        #bloc for with det == 1
                        det = 1

                        #hydrate user_profile dict
                        try:
                            user_profile = json.loads(_user_profile)
                        except:
                            pass

            except:
                ensure_user_exist = False

            #write user xls line if exist
            if ensure_user_exist:
                k = 0
                for n in body:

                    #insert user mysql value to xls
                    if n in user.keys():
                        if n == 'date_joined':
                            sheet_count.write(
                                j, k, str(user.get(n).strftime('%d-%m-%Y')))
                        else:
                            sheet_count.write(j, k, user.get(n))
                        k = k + 1

                    #insert register_form mysql value to xls
                    elif n in user_profile.keys():
                        _insert_value = return_select_value(
                            n, user_profile.get(n), register_form_)
                        sheet_count.write(j, k, _insert_value)
                        k = k + 1

                    #insert certificate_form mongodb value to xls
                    elif n in user_certif_profile.keys():
                        _insert_value = return_select_value(
                            n, user_certif_profile.get(n), certificates_form_)
                        sheet_count.write(j, k, _insert_value)
                        k = k + 1

                    #insert summary grades mongodb value to xls
                    elif "summary" in n:
                        grade_breakdown = _row.get('users_info').get(
                            'summary').get('grade_breakdown')
                        for key, value in grade_breakdown.items():
                            #insert grade value to xls
                            details = value['detail']
                            details = details.replace(
                                value['category'],
                                "").replace(" = ",
                                            "").replace("of a possible ",
                                                        "").replace("%", "")
                            split = details.split(" ")
                            avg = str(
                                int(float(split[0]) / float(split[1]) *
                                    100)) + "%"
                            sheet_count.write(j, k, avg)
                            k = k + 1

                    #insert final grades mongodb value to xls
                    elif "final-grades" in n:
                        sheet_count.write(
                            j, k,
                            str(_row.get('users_info').get('percent') * 100) +
                            "%")
                        k = k + 1
                        sheet_count.write(
                            j, k, str(_row.get('users_info').get('passed')))
                        k = k + 1
                    else:
                        sheet_count.write(j, k, '')
                        k = k + 1
                j = j + 1
            else:
                pass
        log.warning(_("tma_grade_reports : save file generate_xls"))
        _wb.save(self.filepath)
        _file = open(self.filepath, 'r')
        _content = _file.read()
        _file.close()

        response = {'path': self.filename}

        return JsonResponse(response)