Spaces:
Sleeping
Sleeping
from fasthtml_hf import setup_hf_backup | |
import pandas as pd | |
import random | |
import json | |
import traceback | |
from fasthtml.common import * | |
# Initialize the fastHtml application | |
app, rt = fast_app() | |
basepath = "/Users/manaranjanp/Documents/Work/MyLearnings/fastHTML/ClassApp" | |
topics = ['Science', 'Social'] | |
chapters = { | |
'Science': ['Separation_of_Substances', | |
'Components_of_Food', | |
'Getting_to_Know_Plants', | |
'Motion_and_Measurements', | |
'Lights_and_Reflections'], | |
'Social': ['History', 'Civics'] | |
} | |
class QuestionLoader: | |
def __init__(self, json_file): | |
# Load the Excel file and store each sheet as a dictionary of dictionaries | |
self.data = self.load_json_file(json_file) | |
def load_json_file(self, file_path): | |
with open(file_path, 'r') as file: | |
json_data = json.load(file) # Load the JSON data as a Python dictionary | |
return json_data | |
def random_question(self): | |
# Select a random sheet | |
random_sheet = random.choice(list(self.data.keys())) | |
# Select a random question from the sheet | |
random_question = random.choice(self.data[random_sheet]) | |
print(f"Sheet {random_sheet}") | |
print(f"Question: {random_question}") | |
return random_sheet, random_question | |
# default_file_path = os.path.join(basepath, "Science_Separation_of_Substances.json") | |
def load_questions(qpath): | |
return QuestionLoader(qpath) | |
# q_loader = load_questions(default_file_path) | |
def mk_opts(nm, cs): | |
return ( | |
Option(f'-- select {nm} --', disabled='', selected='', value=''), | |
*map(Option, cs)) | |
def getchapters(topic: str): | |
print(topic) | |
return Div(Select(*mk_opts('chapter', chapters[topic]), name='chapter')) | |
# Define the route for the homepage | |
def homepage(): | |
return Titled('Grade 6: Study Companion', Grid( getConfigForm(), | |
Div( | |
Div(id="result", style ="font-family:Helvetica; font-size=24pt;") | |
) | |
, style="grid-template-columns: 400px 1000px; gap: 50px;" | |
), style="color:#DC143C; font-size:25px;") | |
# Function to generate the configuration form for the web interface | |
def getConfigForm(): | |
topics_dropdown = Select( | |
*mk_opts('topic', topics), | |
name='topic', | |
get='getchapters', hx_target='#chapters') | |
return Card(Form(hx_post="/submit", hx_target="#result", hx_swap_oob="innerHTML")( | |
Div( | |
Label("Topics:", for_="topics"), | |
topics_dropdown), | |
Div( | |
Label("Chapters:", for_="chapter"), | |
# Div(Div(id='chapters'))), | |
Div(Select(*mk_opts('chapter', chapters["Science"]), name='chapter'), id='chapters')), | |
Div( | |
Button("Load Questions") | |
), | |
Div( | |
Br(), | |
A("Developed by Manaranjan Pradhan", href="http://www.manaranjanp.com/", | |
target="_blank", | |
style = 'color: red; font-size: 16px;') | |
))) | |
def format_questions(sheet, question_data): | |
if(sheet == "MCQ"): | |
return Div(Label(Strong(sheet) , style="color:#F4A460; font-size:40px;"), | |
Label(Strong(question_data['question']), style="color:#3498db; font-size:25px;"), | |
Label("A. " + question_data['option_a']), | |
Label("B. " + question_data['option_b']), | |
Label("C. " + question_data['option_c']), | |
Label("D. " + question_data['option_d']), | |
Div(Div(id='qanswer'), Form(hx_post="/getanswer", hx_target="#qanswer")( | |
Hidden(question_data['answer'], id = 'answer'), | |
Button("Show Answer")), id='qanswer')) | |
else: | |
return Div(Label(Strong(sheet) , style="color:#F4A460; font-size:40px;"), | |
Label(Strong(question_data['question']), style="color:#3498db; font-size:25px;"), | |
Div(Div(id='qanswer'), Form(hx_post="/getanswer", hx_target="#qanswer")( | |
Hidden(question_data['answer'], id = 'answer'), | |
Button("Show Answer")), id='qanswer')) | |
# Define the route for form submission | |
async def post(d:dict): | |
try: | |
# Check if a file was uploaded | |
# file_path = os.path.join(basepath, d['topic'] + "_" + d['chapter'] + ".json") | |
q_loader = load_questions(d['topic'] + "_" + d['chapter'] + ".json") | |
sheet_name, question_data = q_loader.random_question() | |
return Card( | |
Div(format_questions(sheet_name, question_data)), | |
P(), | |
Div(Form(hx_post="/submit", hx_target="#result")( | |
Hidden(d['topic'], id = 'topic'), | |
Hidden(d['chapter'], id = 'chapter'), | |
Button("Next Question")))) | |
return | |
except BaseException as e: | |
print(traceback.format_exc()) | |
return str(e) | |
# Define the route for form submission | |
async def getanswer(d:dict): | |
try: | |
print(f"Answer: {d['answer']}") | |
return Div( | |
P(Label(Strong("Answer"), style="color:#F4A460; font-size:40px;")), | |
Label(Strong(d['answer']), style="color:#FF4500; font-size:25px;")) | |
except BaseException as e: | |
print(traceback.format_exc()) | |
return str(e) | |
setup_hf_backup(app) | |
# Start the FastAPI server | |
serve() | |