Beispiel #1
0
def random_id(id=None, course=None, exam=None):
    """
        Returns a random id from questions that have not been answered.
        Returns a random number if none available
    """
    # All questions
    questions = all_questions(course, exam)
    # Already answered questions
    if exam:
        query = models.Stats.exam(get_user(), course, exam)
    else:
        query = models.Stats.course(get_user(), course)
    answered = set(query.with_entities(models.Stats.question_id).all())
    # List of indexes for unanswered questions
    indexes = [
        i + 1 for i, question in enumerate(questions)
        if (i + 1) != id and question not in answered
    ]
    # Ignore current question
    if indexes:
        # Select random index
        return random.choice(indexes)
    else:
        # All questions have been answered
        return random.randint(1, len(questions) + 1)
Beispiel #2
0
 def post(self):
     try:
         question_id = int(request.form.get('question'))
     except ValueError:
         return error('Missing question')
     question = models.Question.query.get_or_404(question_id)
     if question.multiple:
         try:
             answer_alt = set(map(int, request.form.getlist('alternative')))
         except ValueError:
             return error('Missing alternative')
         correct_alt = correct_alternatives(question)
         # Checking if all alternatives are correct
         correct = correct_alt == answer_alt
     else:
         # Yes/No
         answer = request.form.get('correct', False) == 'true'
         correct = question.correct == answer
     user = get_user()
     answered = models.Stats.answered(user, question)
     if not answered:
         stat = models.Stats(user, question, correct)
         models.db.session.add(stat)
         models.db.session.commit()
     return {'success': not answered, 'correct': correct}
Beispiel #3
0
 def post(self):
     try:
         question_id = int(request.form.get('question'))
     except ValueError:
         return error('Missing question')
     question = models.Question.query.get_or_404(question_id)
     if question.multiple:
         try:
             answer_alt = set(map(int, request.form.getlist('alternative')))
         except ValueError:
             return error('Missing alternative')
         correct_alt = correct_alternatives(question)
         # Checking if all alternatives are correct
         if question.exam.multiple_correct:
             correct = correct_alt == answer_alt
         else:
             correct = correct_alt >= answer_alt
     else:
         # Yes/No
         answer = request.form.get('correct', False) == 'true'
         correct = question.correct == answer
     user = get_user()
     answered = models.Stats.answered(user, question)
     if not answered:
         stat = models.Stats(user, question, correct)
         models.db.session.add(stat)
         models.db.session.commit()
     return {'success': not answered, 'correct': correct}
Beispiel #4
0
 def serialize(self):
     if self.exam.hidden:
         user = get_user()
         if not user.admin:
             return None
     response = {
         'id': self.id,
         'text': self.text,
         'exam_id': self.exam_id,
         'multiple': self.multiple,
         'type': self.type.code
     }
     if self.multiple:
         response['alternatives'] = []
         for alt in self.alternatives:
             alt_dict = alt.serialize()
             del alt_dict['question_id']
             response['alternatives'].append(alt_dict)
     else:
         response['correct'] = self.correct
     if self.image:
         if self.image.startswith('http://'):
             response['image'] = self.image
         else:
             # this is not efficient
             response['image'] = url_for(
                 'static',
                 filename='img/' + self.course.code + '/' + self.image)
     return response
Beispiel #5
0
 def serialize(self):
     if self.exam.hidden:
         user = get_user()
         if not user.admin:
             return None
     response = {
         'id': self.id,
         'text': self.text,
         'exam_id': self.exam_id,
         'multiple': self.multiple,
         'type': self.type.code
     }
     if self.multiple:
         response['alternatives'] = []
         for alt in self.alternatives:
             alt_dict = alt.serialize()
             del alt_dict['question_id']
             response['alternatives'].append(alt_dict)
     else:
         response['correct'] = self.correct
     if self.image:
         if self.image.startswith('http://'):
             response['image'] = self.image
         else:
             # this is not efficient
             response['image'] = url_for('static', filename='img/' + self.course.code + '/' + self.image)
     return response
Beispiel #6
0
 def save_user(self, form):
     user = get_user()
     user.name = form.name.data
     user.username = form.username.data
     user.password = form.password.data
     user.registered = True
     models.db.session.add(user)
     models.db.session.commit()
Beispiel #7
0
 def save_user(self, form):
     user = get_user()
     user.name = form.name.data
     user.username = form.username.data
     user.password = form.password.data
     user.registered = True
     models.db.session.add(user)
     models.db.session.commit()
Beispiel #8
0
def reset_stats_exam(course, exam):
    """Reset stats for a course"""
    course = models.Course.query.filter_by(code=course).first_or_404()
    exam = models.Exam.query.filter_by(course=course, name=exam).first_or_404()
    stats_query = models.Stats.exam(get_user(), course.code, exam.name).with_entities(models.Stats.id).subquery()
    models.Stats.query.filter(models.Stats.id.in_(stats_query)).\
        update({models.Stats.reset: True}, synchronize_session=False)
    models.db.session.commit()
    return redirect(url_for('quiz.exam', course=course.code, exam=exam.name))
Beispiel #9
0
def reset_stats_course(course):
    """Reset stats for a course"""
    # Check if course exists
    course = models.Course.query.filter_by(code=course).first_or_404()
    stats_query = models.Stats.course(get_user(), course.code).with_entities(models.Stats.id).subquery()
    models.Stats.query.filter(models.Stats.id.in_(stats_query)).\
        update({models.Stats.reset: True}, synchronize_session=False)
    models.db.session.commit()
    return redirect(url_for('quiz.course', course=course.code))
Beispiel #10
0
def reset_stats_course(course):
    """Reset stats for a course"""
    # Check if course exists
    course = models.Course.query.filter_by(code=course).first_or_404()
    stats_query = models.Stats.course(get_user(), course.code).with_entities(
        models.Stats.id).subquery()
    models.Stats.query.filter(models.Stats.id.in_(stats_query)).\
        update({models.Stats.reset: True}, synchronize_session=False)
    models.db.session.commit()
    return redirect(url_for('quiz.course', course=course.code))
Beispiel #11
0
def reset_stats_exam(course, exam):
    """Reset stats for a course"""
    course = models.Course.query.filter_by(code=course).first_or_404()
    exam = models.Exam.query.filter_by(course=course, name=exam).first_or_404()
    stats_query = models.Stats.exam(get_user(), course.code,
                                    exam.name).with_entities(
                                        models.Stats.id).subquery()
    models.Stats.query.filter(models.Stats.id.in_(stats_query)).\
        update({models.Stats.reset: True}, synchronize_session=False)
    models.db.session.commit()
    return redirect(url_for('quiz.exam', course=course.code, exam=exam.name))
Beispiel #12
0
 def serialize(self):
     # Hack to hide hidden exams
     if self.hidden:
         user = get_user()
         if not user.admin:
             return None
     return {
         'id': self.id,
         'name': self.name,
         'course_id': self.course_id,
         'multiple_correct': self.multiple_correct,
     }
Beispiel #13
0
 def serialize(self):
     # Hack to hide hidden exams
     if self.hidden:
         user = get_user()
         if not user.admin:
             return None
     return {
         'id': self.id,
         'name': self.name,
         'course_id': self.course_id,
         'multiple_correct': self.multiple_correct,
     }
Beispiel #14
0
def random_id(id=None, course=None, exam=None):
    """
        Returns a random id from questions that have not been answered.
        Returns a random number if none available
    """
    # All questions
    questions = all_questions(course, exam)
    # Already answered questions
    if exam:
        query = models.Stats.exam(get_user(), course, exam)
    else:
        query = models.Stats.course(get_user(), course)
    answered = set(query.with_entities(models.Stats.question_id).all())
    # List of indexes for unanswered questions
    indexes = [i + 1 for i, question in enumerate(questions) if (i + 1) != id and question not in answered]
    # Ignore current question
    if indexes:
        # Select random index
        return random.choice(indexes)
    else:
        # All questions have been answered
        return random.randint(1, len(questions) + 1)
Beispiel #15
0
 def delete(self, object_id):
     response = {}
     user = get_user()
     if not user.admin:
         response['errors'] = [error('Admin access required')]
         return response
     object = self.model.query.get(object_id)
     if object:
         models.db.session.delete(object)
         models.db.session.commit()
         # Deleting cache
         cache.clear()
     return {'success': bool(object)}
Beispiel #16
0
 def remove_admin_fields(self):
     user = get_user()
     delete_fields = []
     for field in self:
         name = field.name
         model_field = getattr(field.meta.model, name, None)
         if not model_field:
             continue
         if 'admin' in model_field.info and model_field.info['admin']:
             if not user.admin:
                 delete_fields.append(name)
     for field in delete_fields:
         delattr(self, field)
Beispiel #17
0
 def remove_admin_fields(self):
     user = get_user()
     delete_fields = []
     for field in self:
         name = field.name
         model_field = getattr(field.meta.model, name, None)
         if not model_field:
             continue
         if 'admin' in model_field.info and model_field.info['admin']:
             if not user.admin:
                 delete_fields.append(name)
     for field in delete_fields:
         delattr(self, field)
Beispiel #18
0
def generate_stats(course_code, exam_name=None):
    stats_data = {}
    if not exam_name:
        stats_data['max'] = max_questions_course(course_code)
        stats = models.Stats.course(get_user(), course_code)
    else:
        stats_data['max'] = max_questions_exam(course_code, exam_name)
        stats = models.Stats.exam(get_user(), course_code, exam_name)
    stats_all = stats.all()
    stats_data['total'] = len(stats_all)
    stats_data['points'] = len(list(filter(lambda stat: stat.correct, stats_all)))
    stats_data['grade'] = grade(stats_data['points'], stats_data['total'])
    stats_data['percentage'] = percentage(stats_data['points'], stats_data['total'])

    combo = 0
    for stat in reversed(stats_all):
        if stat.correct:
            combo += 1
        else:
            break
    stats_data['combo'] = combo
    return stats_data
Beispiel #19
0
 def delete(self, object_id):
     response = {}
     user = get_user()
     if not user.admin:
         response['errors'] = [error('Admin access required')]
         return response
     object = self.model.query.get(object_id)
     if object:
         models.db.session.delete(object)
         models.db.session.commit()
         # Deleting cache
         cache.clear()
     return {'success': bool(object)}
Beispiel #20
0
def generate_stats(course_code, exam_name=None):
    stats_data = {}
    if not exam_name:
        stats_data['max'] = max_questions_course(course_code)
        stats = models.Stats.course(get_user(), course_code)
    else:
        stats_data['max'] = max_questions_exam(course_code, exam_name)
        stats = models.Stats.exam(get_user(), course_code, exam_name)
    stats_all = stats.all()
    stats_data['total'] = len(stats_all)
    stats_data['points'] = len(
        list(filter(lambda stat: stat.correct, stats_all)))
    stats_data['grade'] = grade(stats_data['points'], stats_data['total'])
    stats_data['percentage'] = percentage(stats_data['points'],
                                          stats_data['total'])

    combo = 0
    for stat in reversed(stats_all):
        if stat.correct:
            combo += 1
        else:
            break
    stats_data['combo'] = combo
    return stats_data
Beispiel #21
0
def login():
    user = get_user()
    if user.registered:
        flash('Du er allerede logget inn', 'error')
        return redirect(url_for('quiz.main'))
    if request.method == 'POST':
        form = forms.LoginForm(request.form)
        if form.validate():
            # Login
            user = models.User.query.filter_by(username=form.username.data).first()
            if user and user.password == form.password.data:
                session['user'] = user.id
                return redirect(url_for('quiz.main'))
    else:
        form = forms.LoginForm()
    context = dict(form=form)
    return render_template('quiz/login.html', **context)
Beispiel #22
0
def login():
    user = get_user()
    if user.registered:
        flash('you are already logged in', 'error')
        return redirect(url_for('quiz.main'))
    if request.method == 'POST':
        form = forms.LoginForm(request.form)
        if form.validate():
            # Login
            user = models.User.query.filter_by(
                username=form.username.data).first()
            if user and user.password == form.password.data:
                session['user'] = user.id
                return redirect(url_for('quiz.main'))
    else:
        form = forms.LoginForm()
    context = dict(form=form)
    return render_template('quiz/login.html', **context)
Beispiel #23
0
 def post(self):
     response = {}
     user = get_user()
     if not user.registered:
         response['errors'] = [error('Not logged in')]
         return response
     form = self.form(request.form)
     response['success'] = form.validate()
     if form.validate():
         # Inserting
         object = self.model()
         form.populate_obj(object)
         models.db.session.add(object)
         models.db.session.commit()
         # Deleting cache
         cache.clear()
     else:
         response['errors'] = form.errors
     return response
Beispiel #24
0
 def post(self):
     response = {}
     user = get_user()
     if not user.registered:
         response['errors'] = [error('Not logged in')]
         return response
     form = self.form(request.form)
     response['success'] = form.validate()
     if form.validate():
         # Inserting
         object = self.model()
         form.populate_obj(object)
         models.db.session.add(object)
         models.db.session.commit()
         # Deleting cache
         cache.clear()
     else:
         response['errors'] = form.errors
     return response
Beispiel #25
0
 def put(self, object_id):
     response = {'success': False}
     user = get_user()
     if not user.registered:
         response['errors'] = [error('Not logged in')]
         return response
     object = self.model.query.get(object_id)
     if not object:
         response['errors'] = [error('Item not found')]
         return response
     form = self.form(request.form, obj=object)
     form.populate_obj(object)
     response['success'] = form.validate()
     if response['success']:
         models.db.session.add(object)
         models.db.session.commit()
         # Deleting cache
         cache.clear()
     else:
         response['errors'] = form.errors
     return response
Beispiel #26
0
 def put(self, object_id):
     response = {'success': False}
     user = get_user()
     if not user.registered:
         response['errors'] = [error('Not logged in')]
         return response
     object = self.model.query.get(object_id)
     if not object:
         response['errors'] = [error('Item not found')]
         return response
     form = self.form(request.form, obj=object)
     form.populate_obj(object)
     response['success'] = form.validate()
     if response['success']:
         models.db.session.add(object)
         models.db.session.commit()
         # Deleting cache
         cache.clear()
     else:
         response['errors'] = form.errors
     return response
Beispiel #27
0
 def post(self, *args, **kwargs):
     self.get(*args, **kwargs)
     answer = request.form.get('answer')
     if answer:
         self.answered = True
         if self.question.multiple:
             self.success = self.alternatives_correct()
         else:
             bool_answer = answer.lower() == 'true'
             self.success = self.question.correct == bool_answer
         user = get_user()
         # Checking if question has already been answered
         if not models.Stats.answered(user, self.question):
             self.save_answer(user, self.success)
         elif self.success:
             flash('Du har allerede svart på dette spørsmålet så du får ikke noe poeng. :-)', 'info')
     else:
         flash('Blankt svar', 'error')
     # Preserving order on submit
     ordering = request.form.get('order')
     if ordering:
         self.reorder_alternatives(ordering)
Beispiel #28
0
 def post(self, *args, **kwargs):
     self.get(*args, **kwargs)
     answer = request.form.get('answer')
     if answer:
         self.answered = True
         if self.question.multiple:
             self.success = self.alternatives_correct()
         else:
             bool_answer = answer.lower() == 'true'
             self.success = self.question.correct == bool_answer
         user = get_user()
         # Checking if question has already been answered
         if not models.Stats.answered(user, self.question):
             self.save_answer(user, self.success)
         elif self.success:
             flash(
                 'Du har allerede svart på dette spørsmålet så du får ikke noe poeng. :-)',
                 'info')
     else:
         flash('Blankt svar', 'error')
     # Preserving order on submit
     ordering = request.form.get('order')
     if ordering:
         self.reorder_alternatives(ordering)
Beispiel #29
0
 def post(self, *args, **kwargs):
     self.get(*args, **kwargs)
     answer = request.form.get('answer')
     if answer:
         self.answered = True
         if self.question.multiple:
             self.success = self.alternatives_correct()
         else:
             bool_answer = answer.lower() == 'true'
             self.success = self.question.correct == bool_answer
         user = get_user()
         # Checking if question has already been answered
         if not models.Stats.answered(user, self.question):
             self.save_answer(user, self.success)
         elif self.success:
             flash(
                 'you have already answered this question so you will not get any points',
                 'info')
     else:
         flash('blank answer', 'error')
     # Preserving order on submit
     ordering = request.form.get('order')
     if ordering:
         self.reorder_alternatives(ordering)
Beispiel #30
0
def fetch_current_user_id():
    # Return None if we are outside of request context.
    if _request_ctx_stack.top is None:
        return
    return getattr(get_user(), 'id', None)
Beispiel #31
0
 def get(self):
     user = get_user()
     if user.registered:
         flash('Du er allerede logget inn', 'error')
         return redirect(url_for('quiz.main'))
     self.form = forms.RegisterForm()
Beispiel #32
0
def fetch_current_user_id():
    # Return None if we are outside of request context.
    if _request_ctx_stack.top is None:
        return
    return getattr(get_user(), 'id', None)
Beispiel #33
0
 def get(self):
     user = get_user()
     if user.registered:
         flash('Du er allerede logget inn', 'error')
         return redirect(url_for('quiz.main'))
     self.form = forms.RegisterForm()
Beispiel #34
0
 def get(self):
     user = get_user()
     if user.registered:
         flash('you are already logged in', 'error')
         return redirect(url_for('quiz.main'))
     self.form = forms.RegisterForm()
Beispiel #35
0
 def utility_processor():
     return dict(percentage=percentage, grade=grade, user=get_user())