Fix mistake on grade speaking task 1.
This commit is contained in:
123
app.py
123
app.py
@@ -5,7 +5,8 @@ import firebase_admin
|
|||||||
from firebase_admin import credentials
|
from firebase_admin import credentials
|
||||||
from helper.api_messages import QuestionType, get_grading_messages, get_question_gen_messages, get_question_tips
|
from helper.api_messages import QuestionType, get_grading_messages, get_question_gen_messages, get_question_tips
|
||||||
from helper.file_helper import delete_files_older_than_one_day
|
from helper.file_helper import delete_files_older_than_one_day
|
||||||
from helper.firebase_helper import download_firebase_file, upload_file_firebase
|
from helper.firebase_helper import download_firebase_file, upload_file_firebase, upload_file_firebase_get_url, \
|
||||||
|
save_to_db
|
||||||
from helper.speech_to_text_helper import speech_to_text, text_to_speech, has_words
|
from helper.speech_to_text_helper import speech_to_text, text_to_speech, has_words
|
||||||
from helper.token_counter import count_tokens
|
from helper.token_counter import count_tokens
|
||||||
from helper.openai_interface import make_openai_call
|
from helper.openai_interface import make_openai_call
|
||||||
@@ -15,6 +16,8 @@ import re
|
|||||||
|
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
from templates.question_templates import getListening1Template, getListening2Template
|
||||||
|
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
@@ -49,10 +52,37 @@ def get_listening_section_1_question():
|
|||||||
map(lambda x: x["content"], filter(lambda x: "content" in x, messages)), 0)
|
map(lambda x: x["content"], filter(lambda x: "content" in x, messages)), 0)
|
||||||
response = make_openai_call(GPT_3_5_TURBO_16K, messages, token_count, LISTENING_GEN_FIELDS,
|
response = make_openai_call(GPT_3_5_TURBO_16K, messages, token_count, LISTENING_GEN_FIELDS,
|
||||||
GEN_QUESTION_TEMPERATURE)
|
GEN_QUESTION_TEMPERATURE)
|
||||||
|
# file_name = str(uuid.uuid4()) + ".mp3"
|
||||||
|
# sound_file_path = AUDIO_FILES_PATH + file_name
|
||||||
|
# firebase_file_path = FIREBASE_LISTENING_AUDIO_FILES_PATH + file_name
|
||||||
|
# text_to_speech(response["transcript"], sound_file_path)
|
||||||
|
# upload_file_firebase(FIREBASE_BUCKET, firebase_file_path, sound_file_path)
|
||||||
|
# response["audio_file"] = firebase_file_path
|
||||||
return response
|
return response
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return str(e)
|
return str(e)
|
||||||
|
|
||||||
|
@app.route('/save_listening_section_1', methods=['POST'])
|
||||||
|
@jwt_required()
|
||||||
|
def save_listening_section_1_question():
|
||||||
|
try:
|
||||||
|
# data = request.get_json()
|
||||||
|
# question = data.get('question')
|
||||||
|
question = getListening1Template()
|
||||||
|
file_name = str(uuid.uuid4()) + ".mp3"
|
||||||
|
sound_file_path = AUDIO_FILES_PATH + file_name
|
||||||
|
firebase_file_path = FIREBASE_LISTENING_AUDIO_FILES_PATH + file_name
|
||||||
|
# TODO it's the conversation audio, still work to do on text-to-speech
|
||||||
|
text_to_speech(question["audio"]["conversation"], sound_file_path)
|
||||||
|
file_url = upload_file_firebase_get_url(FIREBASE_BUCKET, firebase_file_path, sound_file_path)
|
||||||
|
question["audio"]["source"] = file_url
|
||||||
|
if save_to_db("listening", question):
|
||||||
|
return question
|
||||||
|
else:
|
||||||
|
raise Exception("Failed to save question: " + question)
|
||||||
|
except Exception as e:
|
||||||
|
return str(e)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/listening_section_2', methods=['GET'])
|
@app.route('/listening_section_2', methods=['GET'])
|
||||||
@jwt_required()
|
@jwt_required()
|
||||||
@@ -75,6 +105,26 @@ def get_listening_section_2_question():
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
return str(e)
|
return str(e)
|
||||||
|
|
||||||
|
@app.route('/save_listening_section_2', methods=['POST'])
|
||||||
|
@jwt_required()
|
||||||
|
def save_listening_section_2_question():
|
||||||
|
try:
|
||||||
|
# data = request.get_json()
|
||||||
|
# question = data.get('question')
|
||||||
|
question = getListening2Template()
|
||||||
|
file_name = str(uuid.uuid4()) + ".mp3"
|
||||||
|
sound_file_path = AUDIO_FILES_PATH + file_name
|
||||||
|
firebase_file_path = FIREBASE_LISTENING_AUDIO_FILES_PATH + file_name
|
||||||
|
text_to_speech(question["audio"]["text"], sound_file_path)
|
||||||
|
file_url = upload_file_firebase_get_url(FIREBASE_BUCKET, firebase_file_path, sound_file_path)
|
||||||
|
question["audio"]["source"] = file_url
|
||||||
|
if save_to_db("listening", question):
|
||||||
|
return question
|
||||||
|
else:
|
||||||
|
raise Exception("Failed to save question: " + question)
|
||||||
|
except Exception as e:
|
||||||
|
return str(e)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/listening_section_3', methods=['GET'])
|
@app.route('/listening_section_3', methods=['GET'])
|
||||||
@jwt_required()
|
@jwt_required()
|
||||||
@@ -97,6 +147,26 @@ def get_listening_section_3_question():
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
return str(e)
|
return str(e)
|
||||||
|
|
||||||
|
@app.route('/save_listening_section_3', methods=['POST'])
|
||||||
|
@jwt_required()
|
||||||
|
def save_listening_section_3_question():
|
||||||
|
try:
|
||||||
|
# data = request.get_json()
|
||||||
|
# question = data.get('question')
|
||||||
|
question = getListening2Template()
|
||||||
|
file_name = str(uuid.uuid4()) + ".mp3"
|
||||||
|
sound_file_path = AUDIO_FILES_PATH + file_name
|
||||||
|
firebase_file_path = FIREBASE_LISTENING_AUDIO_FILES_PATH + file_name
|
||||||
|
text_to_speech(question["audio"]["text"], sound_file_path)
|
||||||
|
file_url = upload_file_firebase_get_url(FIREBASE_BUCKET, firebase_file_path, sound_file_path)
|
||||||
|
question["audio"]["source"] = file_url
|
||||||
|
if save_to_db("listening", question):
|
||||||
|
return question
|
||||||
|
else:
|
||||||
|
raise Exception("Failed to save question: " + question)
|
||||||
|
except Exception as e:
|
||||||
|
return str(e)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/listening_section_4', methods=['GET'])
|
@app.route('/listening_section_4', methods=['GET'])
|
||||||
@jwt_required()
|
@jwt_required()
|
||||||
@@ -119,6 +189,26 @@ def get_listening_section_4_question():
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
return str(e)
|
return str(e)
|
||||||
|
|
||||||
|
@app.route('/save_listening_section_4', methods=['POST'])
|
||||||
|
@jwt_required()
|
||||||
|
def save_listening_section_4_question():
|
||||||
|
try:
|
||||||
|
# data = request.get_json()
|
||||||
|
# question = data.get('question')
|
||||||
|
question = getListening2Template()
|
||||||
|
file_name = str(uuid.uuid4()) + ".mp3"
|
||||||
|
sound_file_path = AUDIO_FILES_PATH + file_name
|
||||||
|
firebase_file_path = FIREBASE_LISTENING_AUDIO_FILES_PATH + file_name
|
||||||
|
text_to_speech(question["audio"]["text"], sound_file_path)
|
||||||
|
file_url = upload_file_firebase_get_url(FIREBASE_BUCKET, firebase_file_path, sound_file_path)
|
||||||
|
question["audio"]["source"] = file_url
|
||||||
|
if save_to_db("listening", question):
|
||||||
|
return question
|
||||||
|
else:
|
||||||
|
raise Exception("Failed to save question: " + question)
|
||||||
|
except Exception as e:
|
||||||
|
return str(e)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/writing_task1', methods=['POST'])
|
@app.route('/writing_task1', methods=['POST'])
|
||||||
@jwt_required()
|
@jwt_required()
|
||||||
@@ -148,6 +238,21 @@ def grade_writing_task_1():
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
return str(e)
|
return str(e)
|
||||||
|
|
||||||
|
@app.route('/save_writing_task_1', methods=['POST'])
|
||||||
|
@jwt_required()
|
||||||
|
def save_writing_task_1_question():
|
||||||
|
try:
|
||||||
|
# data = request.get_json()
|
||||||
|
# question = data.get('question')
|
||||||
|
# TODO ADD SAVE IMAGE TO DB
|
||||||
|
question = getListening2Template()
|
||||||
|
if save_to_db("writing", question):
|
||||||
|
return question
|
||||||
|
else:
|
||||||
|
raise Exception("Failed to save question: " + question)
|
||||||
|
except Exception as e:
|
||||||
|
return str(e)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/writing_task2', methods=['POST'])
|
@app.route('/writing_task2', methods=['POST'])
|
||||||
@jwt_required()
|
@jwt_required()
|
||||||
@@ -211,6 +316,20 @@ def get_writing_task_2_question():
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
return str(e)
|
return str(e)
|
||||||
|
|
||||||
|
@app.route('/save_writing_task_2', methods=['POST'])
|
||||||
|
@jwt_required()
|
||||||
|
def save_writing_task_2_question():
|
||||||
|
try:
|
||||||
|
# data = request.get_json()
|
||||||
|
# question = data.get('question')
|
||||||
|
question = getListening2Template()
|
||||||
|
if save_to_db("writing", question):
|
||||||
|
return question
|
||||||
|
else:
|
||||||
|
raise Exception("Failed to save question: " + question)
|
||||||
|
except Exception as e:
|
||||||
|
return str(e)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/speaking_task_1', methods=['POST'])
|
@app.route('/speaking_task_1', methods=['POST'])
|
||||||
@jwt_required()
|
@jwt_required()
|
||||||
@@ -224,7 +343,7 @@ def grade_speaking_task_1():
|
|||||||
|
|
||||||
download_firebase_file(FIREBASE_BUCKET, answer_firebase_path, sound_file_name)
|
download_firebase_file(FIREBASE_BUCKET, answer_firebase_path, sound_file_name)
|
||||||
answer = speech_to_text(sound_file_name)
|
answer = speech_to_text(sound_file_name)
|
||||||
if has_words("ajajajajd"):
|
if has_words(answer):
|
||||||
messages = get_grading_messages(QuestionType.SPEAKING_1, question, answer)
|
messages = get_grading_messages(QuestionType.SPEAKING_1, question, answer)
|
||||||
token_count = reduce(lambda count, item: count + count_tokens(item)['n_tokens'],
|
token_count = reduce(lambda count, item: count + count_tokens(item)['n_tokens'],
|
||||||
map(lambda x: x["content"], filter(lambda x: "content" in x, messages)), 0)
|
map(lambda x: x["content"], filter(lambda x: "content" in x, messages)), 0)
|
||||||
|
|||||||
@@ -1,4 +1,11 @@
|
|||||||
from google.cloud import storage
|
from google.cloud import storage
|
||||||
|
import os
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
import firebase_admin
|
||||||
|
from firebase_admin import credentials, firestore
|
||||||
|
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
def download_firebase_file(bucket_name, source_blob_name, destination_file_name):
|
def download_firebase_file(bucket_name, source_blob_name, destination_file_name):
|
||||||
# Downloads a file from Firebase Storage.
|
# Downloads a file from Firebase Storage.
|
||||||
@@ -41,5 +48,18 @@ def upload_file_firebase_get_url(bucket_name, destination_blob_name, source_file
|
|||||||
print("Error uploading file to Google Cloud Storage:", e)
|
print("Error uploading file to Google Cloud Storage:", e)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def save_to_db(collection: str, item):
|
||||||
|
# Initialize Firebase Admin SDK
|
||||||
|
cred = credentials.Certificate(os.getenv("GOOGLE_APPLICATION_CREDENTIALS"))
|
||||||
|
firebase_admin.initialize_app(cred)
|
||||||
|
db = firestore.client()
|
||||||
|
collection_ref = db.collection(collection)
|
||||||
|
document_ref = collection_ref.add(item)
|
||||||
|
if document_ref:
|
||||||
|
print(f"Document added with ID: {document_ref}")
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
483
templates/question_templates.py
Normal file
483
templates/question_templates.py
Normal file
@@ -0,0 +1,483 @@
|
|||||||
|
import uuid
|
||||||
|
|
||||||
|
|
||||||
|
def getListening1Template():
|
||||||
|
return {
|
||||||
|
"audio": {
|
||||||
|
"repeatableTimes": 3,
|
||||||
|
"source": "https://firebasestorage.googleapis.com/v0/b/mti-ielts.appspot.com/o/listening_recordings%2Fhotel_reservation.mp3?alt=media&token=7c6a88f9-b71a-41f4-8581-d9a0574f4d44",
|
||||||
|
"conversation": [
|
||||||
|
{
|
||||||
|
"voice": "male",
|
||||||
|
"text": "voice line 1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"voice": "female",
|
||||||
|
"text": "voice line 2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"voice": "male",
|
||||||
|
"text": "voice line 3"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"exercises": [
|
||||||
|
{
|
||||||
|
"id": str(uuid.uuid4()),
|
||||||
|
"maxWords": 3,
|
||||||
|
"prompt": "You will hear a conversation between a customer and a receptionist at a hotel. Complete the form "
|
||||||
|
"below using no more than three words or a number.",
|
||||||
|
"solutions": [
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"solution": ["Johnson", "Mr. Johnson"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2",
|
||||||
|
"solution": ["15th of September", "fifteenth of September"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3",
|
||||||
|
"solution": ["Deluxe double room"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "4",
|
||||||
|
"solution": ["Three nights", "3 nights"]
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"text": "Name of Customer:{{1}}\\nDate of Arrival:{{2}}\\nType of Room:{{3}}\\nNumber of Nights:{{4}}",
|
||||||
|
"type": "writeBlanks"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isDiagnostic": True,
|
||||||
|
"minTimer": 7,
|
||||||
|
"module": "listening",
|
||||||
|
"section": 1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def getListening2Template():
|
||||||
|
return {
|
||||||
|
"audio": {
|
||||||
|
"repeatableTimes": 3,
|
||||||
|
"source": "https://firebasestorage.googleapis.com/v0/b/mti-ielts.appspot.com/o/listening_recordings%2Fmuseum_guide.mp3?alt=media&token=bfb9aea9-4006-4e11-af9a-1594232b4c20",
|
||||||
|
"text": "Listening section 2 text."
|
||||||
|
},
|
||||||
|
"exercises": [
|
||||||
|
{
|
||||||
|
"id": str(uuid.uuid4()),
|
||||||
|
"maxWords": 3,
|
||||||
|
"prompt": "You will hear a guide giving information about a museum exhibition. Complete the sentences using no more than three words or a number.",
|
||||||
|
"solutions": [
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"options": ["Art and Culture"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2",
|
||||||
|
"options": ["10 AM"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3",
|
||||||
|
"options": ["ID", "Card", "student ID", "senior citizen card"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "4",
|
||||||
|
"options": ["day"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "5",
|
||||||
|
"options": ["45"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"text": "The exhibition is titled \"Exploring the History of {{1}}.\"\\nThe museum opens at {{2}} on weekdays."
|
||||||
|
"\\nVisitors can get a discount with a valid {{3}}.\\nThe museum offers a guided tour every {{4}}."
|
||||||
|
"\\nThe guided tour lasts approximately {{5}} minutes.",
|
||||||
|
"type": "writeBlanks"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isDiagnostic": True,
|
||||||
|
"minTimer": 7,
|
||||||
|
"module": "listening",
|
||||||
|
"section": 2
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def getReading1Template():
|
||||||
|
return {
|
||||||
|
"exercises": [
|
||||||
|
{
|
||||||
|
"id": str(uuid.uuid4()),
|
||||||
|
"prompt": "Do the following statements agree with the information given in Reading Passage 1?",
|
||||||
|
"questions": [
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"prompt": "Bees are solely responsible for the pollination of all flowering plants mentioned in the passage.",
|
||||||
|
"solution": False
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2",
|
||||||
|
"prompt": "Bee populations have been declining due to factors such as habitat loss, pesticide exposure, and climate changes.",
|
||||||
|
"solution": True
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3",
|
||||||
|
"prompt": "The decline in bee populations has no impact on the agricultural industry or food prices.",
|
||||||
|
"solution": False
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "trueFalse"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": str(uuid.uuid4()),
|
||||||
|
"prompt": "Select the appropriate option.",
|
||||||
|
"questions": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"id": "A",
|
||||||
|
"text": "Providing shade to plants"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "B",
|
||||||
|
"text": "Controlling pest populations"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "C",
|
||||||
|
"text": "Attracting other pollinators"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "D",
|
||||||
|
"text": "Creating intricate webs"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"prompt": "What is the primary role of bees in ecosystems according to the passage?",
|
||||||
|
"solution": "B",
|
||||||
|
"variant": "text",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"id": "A",
|
||||||
|
"text": "30%"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "B",
|
||||||
|
"text": "50%"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "C",
|
||||||
|
"text": "80%"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "D",
|
||||||
|
"text": "100%"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"prompt": "Approximately how much of flowering plants rely on animal pollinators like bees for fertilization?",
|
||||||
|
"solution": "C",
|
||||||
|
"variant": "text",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"id": "A",
|
||||||
|
"text": "It leads to lower food prices"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "B",
|
||||||
|
"text": "It ensures larger crop sizes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "C",
|
||||||
|
"text": "It provides diverse and nutritious diets"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "D",
|
||||||
|
"text": "It reduces the need for pesticides"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"prompt": "Why is the role of bees in enhancing crop productivity beneficial for consumers?",
|
||||||
|
"solution": "C",
|
||||||
|
"variant": "text",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "multipleChoice",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isDiagnostic": True,
|
||||||
|
"minTimer": 20,
|
||||||
|
"text": {
|
||||||
|
"content": "Bees, often regarded as unassuming insects, play a pivotal role in the intricate web of ecosystems "
|
||||||
|
"around the world. Beyond their humble appearance, these industrious creatures contribute substantially "
|
||||||
|
"to the health and diversity of both natural environments and human communities.\\nAt the heart of their "
|
||||||
|
"significance lies their role as pollinators. Bees facilitate the reproduction of various plants by "
|
||||||
|
"transferring pollen between flowers as they collect nectar. This seemingly simple act has profound "
|
||||||
|
"consequences for the propagation of plant species. In fact, it's estimated that approximately 80% of "
|
||||||
|
"flowering plants rely on animal pollinators like bees for fertilization.\\nThe value of bee-mediated "
|
||||||
|
"pollination extends well beyond the plant kingdom. A significant portion of the global food supply "
|
||||||
|
"hinges on the pollination services that bees provide. Crops such as apples, blueberries, almonds, "
|
||||||
|
"and cucumbers owe their successful yields to the diligent work of bees. Their role in enhancing crop "
|
||||||
|
"productivity is not only beneficial for farmers but also for consumers who enjoy diverse and nutritious "
|
||||||
|
"diets.\\nHowever, the bee populations worldwide have been facing challenges and declines in recent "
|
||||||
|
"years. Multiple factors, including habitat loss, pesticide exposure, and climate changes, have "
|
||||||
|
"contributed to this decline. The consequences of dwindling bee populations reverberate throughout "
|
||||||
|
"ecosystems. Reduced pollination can lead to decreased plant diversity, affecting animals that rely "
|
||||||
|
"on these plants for food and habitat.\\nThe decline in bee populations also has economic implications. "
|
||||||
|
"The agricultural industry heavily relies on pollination, and the absence of sufficient bee populations "
|
||||||
|
"can result in lower crop yields and increased production costs. This, in turn, can impact food prices "
|
||||||
|
"and livelihoods.\\nEfforts to address the decline in bee populations encompass various strategies. "
|
||||||
|
"Conservation initiatives involve creating and preserving bee-friendly habitats, reducing pesticide "
|
||||||
|
"usage, and raising awareness about the importance of bees in ecosystems. Furthermore, researchers "
|
||||||
|
"are investigating bee biology and behavior to better understand their needs and vulnerabilities."
|
||||||
|
"\\nIn conclusion, bees, often underestimated in their significance, are integral components of ecosystems. "
|
||||||
|
"Their role as pollinators contributes to the survival of numerous plant species and the stability of "
|
||||||
|
"the food chain. Acknowledging their importance and taking steps to protect their populations are "
|
||||||
|
"vital for maintaining healthy ecosystems and ensuring sustainable food production for generations "
|
||||||
|
"to come.",
|
||||||
|
"title": "The Importance of Bees in Ecosystems"
|
||||||
|
},
|
||||||
|
"type": "academic"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def getReading2Template():
|
||||||
|
return {
|
||||||
|
"exercises": [
|
||||||
|
{
|
||||||
|
"id": str(uuid.uuid4()),
|
||||||
|
"prompt": "Do the following statements agree with the information given in Reading Passage 2?",
|
||||||
|
"questions": [
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"prompt": "Human rights are considered essential for social harmony and justice.",
|
||||||
|
"solution": "true"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2",
|
||||||
|
"prompt": "Human rights encompass civil, political, economic, social, and cultural aspects.",
|
||||||
|
"solution": "true"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3",
|
||||||
|
"prompt": "Economic, social, and cultural rights aim to address social inequalities.",
|
||||||
|
"solution": "true"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "4",
|
||||||
|
"prompt": "Respecting human rights is associated with stable and just societies.",
|
||||||
|
"solution": "true"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "5",
|
||||||
|
"prompt": "The digital age has not affected human rights concerns.",
|
||||||
|
"solution": "false"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "trueFalse"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": str(uuid.uuid4()),
|
||||||
|
"prompt": "Select the appropriate option.",
|
||||||
|
"questions": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"id": "A",
|
||||||
|
"text": "Enhancing economic growth"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "B",
|
||||||
|
"text": "Ensuring cultural diversity"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "C",
|
||||||
|
"text": "Safeguarding individual dignity and worth"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "D",
|
||||||
|
"text": "Promoting political ideologies"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"prompt": "What is the central purpose of human rights, according to the passage?",
|
||||||
|
"solution": "C",
|
||||||
|
"variant": "text",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"id": "A",
|
||||||
|
"text": "Economic rights"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "B",
|
||||||
|
"text": "Political rights"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "C",
|
||||||
|
"text": "Social rights"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "D",
|
||||||
|
"text": "Cultural rights"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"prompt": "Which rights enable citizens to participate in governance and express opinions freely?",
|
||||||
|
"solution": "B",
|
||||||
|
"variant": "text",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"id": "A",
|
||||||
|
"text": "Ignoring human rights abuses"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "B",
|
||||||
|
"text": "Upholding human rights and preventing abuses"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "C",
|
||||||
|
"text": "Encouraging social unrest"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "D",
|
||||||
|
"text": "Perpetrating human rights violations"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"prompt": "What role do international organizations and treaties play in relation to human rights?",
|
||||||
|
"solution": "B",
|
||||||
|
"variant": "text",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"id": "A",
|
||||||
|
"text": "Promoting social unrest"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "B",
|
||||||
|
"text": "Leading to instability"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "C",
|
||||||
|
"text": "Causing conflicts"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "D",
|
||||||
|
"text": "Fostering stability and justice"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"prompt": "What impact does respecting human rights have on societies, as mentioned in the passage?",
|
||||||
|
"solution": "D",
|
||||||
|
"variant": "text",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "multipleChoice",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isDiagnostic": True,
|
||||||
|
"minTimer": 20,
|
||||||
|
"text": {
|
||||||
|
"content": "Human rights, the fundamental principles that safeguard the inherent dignity and worth of every individual, "
|
||||||
|
"form the cornerstone of just and equitable societies. These rights are universally acknowledged and "
|
||||||
|
"are considered essential for maintaining social harmony, justice, and the well-being of humanity."
|
||||||
|
"\\nAt the heart of the concept of human rights is the recognition that every person is entitled to "
|
||||||
|
"certain inalienable rights, regardless of their nationality, ethnicity, gender, or any other characteristic. "
|
||||||
|
"These rights encompass civil, political, economic, social, and cultural dimensions, aiming to ensure that "
|
||||||
|
"individuals can lead a life of dignity, freedom, and opportunity.\\nCivil and political rights encompass "
|
||||||
|
"the rights to life, liberty, and personal security. They protect individuals from arbitrary arrests, "
|
||||||
|
"torture, and discrimination. These rights also include the freedom of expression, assembly, and association, "
|
||||||
|
"enabling citizens to participate in their governance and voice their opinions without fear of reprisal."
|
||||||
|
"\\nEconomic, social, and cultural rights focus on ensuring that all individuals have access to essential "
|
||||||
|
"resources for a decent standard of living. This includes the right to education, health care, housing, "
|
||||||
|
"and work. These rights are particularly critical for addressing social inequalities and providing opportunities "
|
||||||
|
"for marginalized groups.\\nThe importance of human rights is underscored by their role in promoting "
|
||||||
|
"peace and preventing conflicts. When human rights are respected, societies are more likely to be stable "
|
||||||
|
"and just. Conversely, the violation of human rights often leads to social unrest, tensions, and "
|
||||||
|
"even violence. International organizations and treaties play a crucial role in upholding human rights "
|
||||||
|
"globally, aiming to prevent human rights abuses and hold accountable those who perpetrate them.\\nDespite "
|
||||||
|
"the significant progress made in advancing human rights, challenges persist. Discrimination, gender "
|
||||||
|
"inequality, and the violation of the rights of minorities and vulnerable groups remain prevalent in "
|
||||||
|
"many parts of the world. Moreover, the digital age has introduced new dimensions to human rights concerns, "
|
||||||
|
"with issues such as online privacy and cyberbullying warranting attention.\\nIn conclusion, the "
|
||||||
|
"importance of human rights cannot be overstated. These rights provide a moral compass for societies "
|
||||||
|
"and governments, guiding them toward justice, equality, and respect for every individual. The continued "
|
||||||
|
"efforts to protect and uphold human rights are essential for fostering inclusive and harmonious "
|
||||||
|
"communities on both local and global scales.",
|
||||||
|
"title": "The Importance of Human Rights"
|
||||||
|
},
|
||||||
|
"type": "academic"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def getSpeaking1Template():
|
||||||
|
return {
|
||||||
|
"exercises": [
|
||||||
|
{
|
||||||
|
"id": str(uuid.uuid4()),
|
||||||
|
"prompts": [],
|
||||||
|
"text": "Do you enjoy traveling?\\nWhat was the last place you visited for a holiday?\\nDo you prefer traveling "
|
||||||
|
"by car or by plane?\\nWhat type of places do you like to visit when you travel?",
|
||||||
|
"title": "Travel",
|
||||||
|
"type": "speaking"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isDiagnostic": False,
|
||||||
|
"minTimer": 5,
|
||||||
|
"module": "speaking"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def getSpeaking2Template():
|
||||||
|
return {
|
||||||
|
"exercises": [
|
||||||
|
{
|
||||||
|
"id": str(uuid.uuid4()),
|
||||||
|
"prompts": [
|
||||||
|
"Explain the circumstances that led to your need to adapt to a new environment.",
|
||||||
|
"What were the major changes or differences in this new environment?",
|
||||||
|
"How did you handle the process of adapting to these changes?",
|
||||||
|
"Reflect on the impact this experience had on your adaptability and personal growth."
|
||||||
|
],
|
||||||
|
"text": "Describe an occasion when you had to adapt to a new environment.",
|
||||||
|
"title": "New Environment",
|
||||||
|
"type": "speaking"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isDiagnostic": False,
|
||||||
|
"minTimer": 5,
|
||||||
|
"module": "speaking"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def getWriting2Template():
|
||||||
|
return {
|
||||||
|
"exercises": [
|
||||||
|
{
|
||||||
|
"id": str(uuid.uuid4()),
|
||||||
|
"prefix": "You should spend about 40 minutes on this task.\nPresent a written argument or case to an educated "
|
||||||
|
"reader with no specialist knowledge of the following topic:",
|
||||||
|
"prompt": "In many countries, the levels of pollution and waste are increasing. What are the main causes of "
|
||||||
|
"this increase, and what measures could be taken to address these problems?",
|
||||||
|
"suffix": "You should write at least 250 words.\nUse your own ideas, knowledge and experience and support "
|
||||||
|
"your arguments with examples and relevant evidence.",
|
||||||
|
"type": "writing",
|
||||||
|
"wordCounter": {
|
||||||
|
"limit": 250,
|
||||||
|
"type": "min"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isDiagnostic": True,
|
||||||
|
"minTimer": 40,
|
||||||
|
"module": "writing",
|
||||||
|
"task": "2"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user