parent
716e5cffb4
commit
607902fd48
@ -1,3 +1,48 @@ |
||||
from flask import Blueprint |
||||
from flask import Blueprint, url_for, jsonify, g |
||||
from utils.auth import auth_required |
||||
from db.model import db, Badge, UserBadge |
||||
from sqlalchemy import select |
||||
badge_route = Blueprint('badge', __name__) |
||||
|
||||
badge = Blueprint('badge', __name__) |
||||
@badge_route.route('/listAllBadges') |
||||
def all_badges(): |
||||
badges: list[Badge] = db.session.execute(select(Badge)).scalars() |
||||
data: list = [] |
||||
for bgd in badges: |
||||
data.append({ |
||||
'id': bgd.id, |
||||
'name': bgd.name, |
||||
'description': bgd.description, |
||||
'createDate': bgd.createDate, |
||||
'icon': url_for('send_file', filename=bgd.icon) |
||||
'canClaim': bgd.canClaim |
||||
}) |
||||
return jsonify({ |
||||
'count': len(data), |
||||
'data': data |
||||
}) |
||||
|
||||
@badge_route.route('/myBadges') |
||||
@auth_required() |
||||
def my_badges(): |
||||
user_badges: list[UserBadge] = db.session.execute(select(UserBadge).where( |
||||
UserBadge.userID == g.current_user.id |
||||
)).scalars() |
||||
data: list = [] |
||||
for ub in user_badges: |
||||
bgd = ub.badge |
||||
data.append({ |
||||
'id': ub.id, |
||||
'badgeID': bgd.id, |
||||
'userID': ub.userID, |
||||
'name': bgd.name, |
||||
'description': bgd.description, |
||||
'createDate': bgd.createDate, |
||||
'icon': url_for('send_file', filename=bgd.icon) |
||||
'canClaim': bgd.canClaim, |
||||
'claimedDate': ub.claimedDate, |
||||
}) |
||||
return jsonify({ |
||||
'count': len(data), |
||||
'data': data |
||||
}) |
@ -0,0 +1,226 @@ |
||||
import json |
||||
import os |
||||
import uuid |
||||
import requests |
||||
from flask import Blueprint, request, jsonify, g, url_for |
||||
from uuid import UUID |
||||
from ...db.model import db, User, Course, Enrollment,Chat, Quiz, QuizAttempt |
||||
from utils.auth import auth_required |
||||
import requests |
||||
from config import SPAM_SCORE_THRESHOLD, AI_SPAM_SERVICES_MICROSERVICE, USER_UPLOADS_DIR, AI_QUIZ_SERVICES_MICROSERVICE |
||||
from sqlalchemy import desc, select, and_ |
||||
|
||||
quiz = Blueprint('chat', __name__) |
||||
|
||||
|
||||
@quiz.route('/generate') |
||||
@auth_required() |
||||
def generate_quiz(): |
||||
try: |
||||
course_id: uuid.UUID = uuid.UUID(request.form['course_id']) |
||||
current_page: int = int(request.form['page']) |
||||
except KeyError: |
||||
return jsonify({'message': 'course_id and page must be specified'}), 401 |
||||
enrollment_record: Enrollment = db.session.execute( |
||||
select(Enrollment).where(and_( |
||||
Enrollment.courseID == course_id, |
||||
Enrollment.userID == g.current_user.id) |
||||
) |
||||
).scalar() |
||||
if not enrollment_record: |
||||
return jsonify({"error": "You are not enrolled in this course."}), 403 |
||||
if current_page > enrollment_record.course.totalPages or current_page < 1: |
||||
return jsonify({ |
||||
'message': 'Page range out of bound. No such page' |
||||
}), 404 |
||||
# Everything is alright, now get the text in current page and generate quiz |
||||
current_page_text: str = '' |
||||
with open( |
||||
os.path.join( |
||||
USER_UPLOADS_DIR, |
||||
enrollment_record.course.serverFilename+"_parts", |
||||
f"{current_page}.txt") |
||||
) as f: |
||||
current_page_text = f.read() |
||||
quiz_data_resp = requests.post(AI_QUIZ_SERVICES_MICROSERVICE, json={"string_message": current_page_text}) |
||||
if quiz_data_resp.status_code != 200: |
||||
return jsonify({"error": "Failed to make quiz request."}), 500 |
||||
quiz_data = quiz_data_resp.json() |
||||
# Insert the quiz into table |
||||
rows: list[Quiz] = [] |
||||
for quiz_item in quiz_data['questions']: |
||||
rows.append( |
||||
Quiz( |
||||
creatorUserID=g.current_user.id, |
||||
creatorUser=g.current_user, |
||||
quiz_attempts=[], |
||||
courseID=course_id, |
||||
course=enrollment_record.course, |
||||
quizQuestion=quiz_item['question'], |
||||
quizAnswers=json.dumps(quiz_item['options']), |
||||
quizCorrectAnswer=quiz_item['correct_answer'] |
||||
) |
||||
) |
||||
db.session.add_all(rows) |
||||
db.session.commit() |
||||
return jsonify({'message': 'quizzes were generated for the current page'}) |
||||
|
||||
@quiz.route('/get/personalIncomplete') |
||||
@auth_required() |
||||
def get_incomplete_quiz(): |
||||
try: |
||||
course_id: uuid.UUID = uuid.UUID(request.args['course_id']) |
||||
except KeyError: |
||||
return jsonify({'message': 'course_id must be specified'}), 401 |
||||
quiz_rows: list[Quiz] = db.session.execute(select(Quiz).where( |
||||
and_(Quiz.creatorUserID == g.current_user.id, Quiz.creatorHasAttempted == False) |
||||
)).scalars() |
||||
data: list = [] |
||||
for quiz_row in quiz_rows: |
||||
data.append( |
||||
{ |
||||
'id': quiz_row.id, |
||||
'isActive': quiz_row.isActive, |
||||
'creationDate': quiz_row.creationDate, |
||||
'quizAnswers': quiz_row.quizAnswers, |
||||
'quizQuestion': quiz_row.quizQuestion, |
||||
'course': { |
||||
'id': quiz_row.course.id, |
||||
'name': quiz_row.course.name, |
||||
'description': quiz_row.course.description |
||||
}, |
||||
'creator': { |
||||
'id': quiz_row.creatorUserID, |
||||
'firstName': quiz_row.creatorUser.firstName, |
||||
'lastName': quiz_row.creatorUser.lastName, |
||||
'username': quiz_row.creatorUser.username, |
||||
'pfpFilename': url_for('send_file', filename=quiz_row.creatorUser.pfpFilename) |
||||
} |
||||
} |
||||
) |
||||
return jsonify({ |
||||
'count': len(data), |
||||
'data': data |
||||
}), 200 |
||||
|
||||
|
||||
@quiz.route('/get/allComplete') |
||||
@auth_required() |
||||
def get_incomplete_quiz(): |
||||
try: |
||||
course_id: uuid.UUID = uuid.UUID(request.args['course_id']) |
||||
except KeyError: |
||||
return jsonify({'message': 'course_id must be specified'}), 401 |
||||
quiz_attempts: list[QuizAttempt] = db.session.execute( |
||||
select(QuizAttempt).where(and_( |
||||
QuizAttempt.userID == g.current_user.id, |
||||
Course.id == course_id |
||||
))).scalars() # IF THIS DOES NOT WORK, ADD COURSE IF TO QUIZ_ATTEMPT TABLE ITSELF |
||||
completes: list = [] |
||||
for attempt in quiz_attempts: |
||||
quiz_row: Quiz = attempt.quiz |
||||
completes.append( |
||||
{ |
||||
'id': attempt.id, |
||||
'quizID': quiz_row.id, |
||||
'isActive': quiz_row.isActive, |
||||
'creationDate': quiz_row.creationDate, |
||||
'quizAnswers': quiz_row.quizAnswers, |
||||
'quizQuestion': quiz_row.quizQuestion, |
||||
'userAnswer': attempt.userAnswer, |
||||
'quizCorrectAnswer': quiz_row.quizCorrectAnswer, |
||||
'isCorrect': attempt.isCorrect, |
||||
'course': { |
||||
'id': quiz_row.course.id, |
||||
'name': quiz_row.course.name, |
||||
'description': quiz_row.course.description |
||||
}, |
||||
'creator': { |
||||
'id': quiz_row.creatorUserID, |
||||
'firstName': quiz_row.creatorUser.firstName, |
||||
'lastName': quiz_row.creatorUser.lastName, |
||||
'username': quiz_row.creatorUser.username, |
||||
'pfpFilename': url_for('send_file', filename=quiz_row.creatorUser.pfpFilename) |
||||
} |
||||
} |
||||
) |
||||
return jsonify({ |
||||
'count': len(completes), |
||||
'data': completes |
||||
}), 200 |
||||
|
||||
|
||||
@quiz.route('/submit') |
||||
@auth_required() |
||||
def get_incomplete_quiz(): |
||||
try: |
||||
answer: str = request.form['answer'].strip() |
||||
quiz_id: uuid.UUID = uuid.UUID(request.form['course_id']) |
||||
except KeyError: |
||||
return jsonify({'message': 'course_id and answer must be specified'}), 401 |
||||
quiz_already_attempted: QuizAttempt = db.session.execute(select(QuizAttempt).where( |
||||
and_(QuizAttempt.quizID == quiz_id, QuizAttempt.userID == g.current_user.id ) |
||||
)).scalar() |
||||
if quiz_already_attempted: |
||||
return jsonify({'message': 'Already attempted this quiz'}), 401 |
||||
quiz_row: Quiz = db.session.execute(select(Quiz).where(Quiz.id == quiz_id)).scalar() |
||||
if not quiz_row: |
||||
return jsonify({'message': 'Quiz does not exist'}), 404 |
||||
valid_answers: list = json.loads(quiz_row.quizAnswers) |
||||
is_correct: bool = False |
||||
if answer not in valid_answers: |
||||
return jsonify({'message': 'No such choice of answer given'}), 404 |
||||
if answer == quiz_row.quizCorrectAnswer: |
||||
is_correct = True |
||||
new_attempt: QuizAttempt = QuizAttempt( |
||||
userID=g.current_user.id, |
||||
user=g.current_user, |
||||
quizID=quiz_id, |
||||
quiz=quiz_row, |
||||
userAnswer=answer, |
||||
isCorrect=int(is_correct) |
||||
) |
||||
db.session.add(new_attempt) |
||||
if Quiz.creatorUser.id == g.current_user.id: |
||||
Quiz.creatorHasAttempted = True |
||||
db.session.commit() |
||||
return jsonify({ |
||||
'message': 'Answer submitted', |
||||
'isCorrect': is_correct, |
||||
'attemptID': new_attempt.id, |
||||
'quizID': quiz_row.id, |
||||
'quizAnswers': quiz_row.quizAnswers, |
||||
'quizQuestion': quiz_row.quizQuestion, |
||||
'quizCorrectAnswer': quiz_row.quizCorrectAnswer, |
||||
'userAnswer': answer |
||||
}) |
||||
|
||||
@quiz.route('/quizData') |
||||
@auth_required() |
||||
def get_quiz_info(): |
||||
try: |
||||
quiz_id: uuid.UUID = uuid.UUID(request.args['quiz_id']) |
||||
except KeyError: |
||||
return jsonify({'message': 'quiz_id must be specified'}), 401 |
||||
quiz_row: Quiz = db.session.execute(select(Quiz).where(Quiz.id == quiz_id)).scalar() |
||||
if not quiz_row: |
||||
return jsonify({'message': 'Quiz does not exist'}), 404 |
||||
return jsonify({ |
||||
'id': quiz_row.id, |
||||
'isActive': quiz_row.isActive, |
||||
'creationDate': quiz_row.creationDate, |
||||
'quizAnswers': quiz_row.quizAnswers, |
||||
'quizQuestion': quiz_row.quizQuestion, |
||||
'course': { |
||||
'id': quiz_row.course.id, |
||||
'name': quiz_row.course.name, |
||||
'description': quiz_row.course.description |
||||
}, |
||||
'creator': { |
||||
'id': quiz_row.creatorUserID, |
||||
'firstName': quiz_row.creatorUser.firstName, |
||||
'lastName': quiz_row.creatorUser.lastName, |
||||
'username': quiz_row.creatorUser.username, |
||||
'pfpFilename': url_for('send_file', filename=quiz_row.creatorUser.pfpFilename) |
||||
} |
||||
}), 200 |
Loading…
Reference in new issue