Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added backend/._s2v_old
Binary file not shown.
100 changes: 100 additions & 0 deletions backend/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@
from flask_cors import CORS
from pprint import pprint
import nltk
import requests
import subprocess
import os
import glob
import logging

from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import TfidfVectorizer
Expand Down Expand Up @@ -32,6 +34,12 @@
SERVICE_ACCOUNT_FILE = './service_account_key.json'
SCOPES = ['https://www.googleapis.com/auth/documents.readonly']

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

CANVAS_TOKEN = "enter your token here" # Hardcoded for demo
CANVAS_URL = "https://k12.instructure.com"

MCQGen = main.MCQGenerator()
answer = main.AnswerPredictor()
BoolQGen = main.BoolQGenerator()
Expand Down Expand Up @@ -459,6 +467,98 @@ def get_transcript():

return jsonify({"transcript": transcript_text})

@app.route('/export/canvas', methods=['POST'])
def export_to_canvas():
try:
data = request.json
logger.debug(f"Received data: {data}")
course_id = data.get("course_id")
quiz_data = data.get("quiz")

# Validate required fields
if not course_id or not quiz_data:
logger.error("Missing course_id or quiz data")
return jsonify({"error": "Missing course_id or quiz data"}), 400
if not quiz_data.get("title"):
logger.error("Missing quiz title")
return jsonify({"error": "Missing quiz title"}), 400
if not quiz_data.get("questions"):
logger.error("Missing quiz questions")
return jsonify({"error": "Missing quiz questions"}), 400

headers = {"Authorization": f"Bearer {CANVAS_TOKEN}"}
logger.debug(f"Headers: {headers}")

# Step 1: Create the quiz in Canvas
quiz_payload = {
"quiz[title]": quiz_data["title"],
"quiz[description]": quiz_data.get("description", "Generated by EduAid"), # Use provided description or default
"quiz[quiz_type]": "assignment",
"quiz[published]": True
}
quiz_url = f"{CANVAS_URL}/api/v1/courses/{course_id}/quizzes"
logger.debug(f"Creating quiz at: {quiz_url}")
quiz_response = requests.post(quiz_url, headers=headers, data=quiz_payload)

if quiz_response.status_code not in (200, 201):
logger.error(f"Failed to create quiz: {quiz_response.status_code} - {quiz_response.text}")
return jsonify({"error": "Failed to create quiz in Canvas", "details": quiz_response.text}), 500

quiz_id = quiz_response.json()["id"]
logger.debug(f"Quiz created with ID: {quiz_id}")

# Step 2: Add questions to the quiz
question_url = f"{CANVAS_URL}/api/v1/courses/{course_id}/quizzes/{quiz_id}/questions"
for q in quiz_data["questions"]:
logger.debug(f"Processing question: {q}")
if q["question_type"] == "MCQ":
options = q.get("options", [])
if q["answer"] not in options:
options.append(q["answer"]) # Ensure answer is in options
question_payload = {
"question[question_text]": q["question"],
"question[question_type]": "multiple_choice_question",
"question[points_possible]": 1,
}
# Dynamically add all options
for i, option in enumerate(options):
question_payload[f"question[answers][{i}][text]"] = option
question_payload[f"question[answers][{i}][weight]"] = 100 if option == q["answer"] else 0

elif q["question_type"] == "Boolean":
question_payload = {
"question[question_text]": q["question"],
"question[question_type]": "true_false_question",
"question[points_possible]": 1,
"question[answers][0][text]": "True",
"question[answers][0][weight]": 100 if q["answer"].lower() == "true" else 0,
"question[answers][1][text]": "False",
"question[answers][1][weight]": 100 if q["answer"].lower() == "false" else 0,
}
elif q["question_type"] == "Short":
question_payload = {
"question[question_text]": q["question"],
"question[question_type]": "essay_question",
"question[points_possible]": 1
}
else:
logger.warning(f"Skipping unsupported question type: {q['question_type']}")
continue

logger.debug(f"Posting question: {question_payload}")
question_response = requests.post(question_url, headers=headers, data=question_payload)
if question_response.status_code not in (200, 201):
logger.error(f"Failed to add question: {question_response.status_code} - {question_response.text}")
return jsonify({"error": "Failed to add question", "details": question_response.text}), 500

quiz_link = f"{CANVAS_URL}/courses/{course_id}/quizzes/{quiz_id}"
logger.info(f"Quiz exported successfully: {quiz_link}")
return jsonify({"message": "Quiz exported to Canvas", "url": quiz_link})

except Exception as e:
logger.exception("An error occurred in export_to_canvas")
return jsonify({"error": "Server error", "details": str(e)}), 500

if __name__ == "__main__":
os.makedirs("subtitles", exist_ok=True)
app.run()
20 changes: 16 additions & 4 deletions eduaid_web/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading