Spaces:
Sleeping
Sleeping
from fastapi import FastAPI | |
from pydantic import BaseModel | |
from google.oauth2.service_account import Credentials | |
import gspread | |
from google.auth.exceptions import GoogleAuthError | |
import os | |
import uvicorn | |
app = FastAPI() | |
# Define chapter categories | |
physics_chapters = { | |
"physics and measurement", "kinematics", "laws of motion", "work, energy, and power", "rotational motion", | |
"gravitation", "properties of solids and liquids", "thermodynamics", "kinetic theory of gases", | |
"oscillations and waves", "electrostatics", "current electricity", | |
"magnetic effects of current and magnetism", "electromagnetic induction and alternating currents", | |
"electromagnetic waves", "optics", "dual nature of matter and radiation", "atoms and nuclei", | |
"electronic devices" | |
} | |
chemistry_chapters = { | |
"some basic concepts in chemistry", "atomic structure", "chemical bonding and molecular structure", | |
"chemical thermodynamics", "solutions", "equilibrium", "redox reactions and electrochemistry", | |
"chemical kinetics", "classifications of elements and periodicity in properties", "p- block elements", | |
"d - and f - block elements", "co-ordination compounds", "purification and characterisation of organic compounds", | |
"some basic principles of organic chemistry", "hydrocarbons", "organic compounds containing halogens", | |
"organic compounds containing oxygen", "organic compounds containing nitrogen", "biomolecules" | |
} | |
maths_chapters = { | |
"sets, relation and functions", "complex numbers and quadratic equations", "matrices and determinants", | |
"permutations and combinations", "binomial theorem", "sequence and series", "limits, continuity, and diffrentiability", | |
"integral calculus", "diffrential equations", "co-ordinate geometry", "straight lines", "circle and conic sections", | |
"three dimensional geometry", "vector algebra", "statistics and probability", "trigonometry" | |
} | |
# class Chapter: | |
# def __init__(self): | |
# self.data = {} | |
# def add_marks(self, chapter_name, marks): | |
# if chapter_name not in self.data: | |
# self.data[chapter_name] = {"sum_marks": 0, "count": 0} | |
# self.data[chapter_name]["sum_marks"] += marks | |
# self.data[chapter_name]["count"] += 1 | |
# def print_averages(self): | |
# for chapter, stats in self.data.items(): | |
# if stats["count"] > 0: | |
# avg = stats["sum_marks"] / stats["count"] | |
# return f"{chapter}: Average = {round(avg, 1)}" | |
class Chapter: | |
def __init__(self): | |
self.data = {} | |
def add_marks(self, chapter_name, marks): | |
if chapter_name not in self.data: | |
self.data[chapter_name] = {"sum_marks": 0, "count": 0} | |
self.data[chapter_name]["sum_marks"] += marks | |
self.data[chapter_name]["count"] += 1 | |
def print_averages(self): | |
averages = {} | |
for chapter, stats in self.data.items(): | |
if stats["count"] > 0: | |
avg = stats["sum_marks"] / stats["count"] | |
averages[chapter] = round(avg, 1) | |
else: | |
averages[chapter] = 0 | |
return averages | |
class PhysicsChapter(Chapter): | |
pass | |
class ChemistryChapter(Chapter): | |
pass | |
class MathsChapter(Chapter): | |
pass | |
def get_credentials_from_env(): | |
service_account_info = { | |
"type": os.getenv("SERVICE_ACCOUNT_TYPE"), | |
"project_id": os.getenv("PROJECT_ID"), | |
"private_key_id": os.getenv("PRIVATE_KEY_ID"), | |
"private_key": os.getenv("PRIVATE_KEY").replace('\\n', '\n'), | |
"client_email": os.getenv("CLIENT_EMAIL"), | |
"client_id": os.getenv("CLIENT_ID"), | |
"auth_uri": os.getenv("AUTH_URI"), | |
"token_uri": os.getenv("TOKEN_URI"), | |
"auth_provider_x509_cert_url": os.getenv("AUTH_PROVIDER_X509_CERT_URL"), | |
"client_x509_cert_url": os.getenv("CLIENT_X509_CERT_URL"), | |
"universe_domain": os.getenv("UNIVERSE_DOMAIN") | |
} | |
scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive'] | |
creds = Credentials.from_service_account_info(service_account_info, scopes=scope) | |
return creds | |
def analyze_chapter_averages(): | |
try: | |
# Set up credentials | |
creds = get_credentials_from_env() | |
client = gspread.authorize(creds) | |
# Open the Google Sheet (replace with your sheet URL) | |
sheet = client.open_by_url('https://docs.google.com/spreadsheets/d/13PUHySUXWtKBusjugoe7Dbsm39PwBUfG4tGLipspIx4/edit?gid=0#gid=0').worksheet('Sheet1') | |
# Get all values from the sheet | |
data = sheet.get_all_values() | |
# Initialize objects for each subject | |
physics_tracker = PhysicsChapter() | |
chemistry_tracker = ChemistryChapter() | |
maths_tracker = MathsChapter() | |
# Iterate over each row in the data | |
for row in data[1:]: # Assuming the first row is headers | |
user_id = row[0] # First column is user_id | |
i = 1 | |
while i < len(row): | |
chapter_name = row[i] | |
# Ensure chapter_name is a string and marks are valid numbers | |
if isinstance(chapter_name, str): | |
chapter_name = chapter_name.strip().lower() | |
marks = row[i + 1] | |
if isinstance(marks, (int, float)): | |
# Check if the chapter belongs to Physics, Chemistry, or Maths | |
if chapter_name in physics_chapters: | |
physics_tracker.add_marks(chapter_name, marks) | |
elif chapter_name in chemistry_chapters: | |
chemistry_tracker.add_marks(chapter_name, marks) | |
elif chapter_name in maths_chapters: | |
maths_tracker.add_marks(chapter_name, marks) | |
i += 2 # Move to the next chapter and marks | |
# Return average marks per chapter for each subject | |
return { | |
"Physics Chapters": physics_tracker.print_averages(), | |
"Chemistry Chapters": chemistry_tracker.print_averages(), | |
"Maths Chapters": maths_tracker.print_averages() | |
} | |
except GoogleAuthError as e: | |
return {"error": f"Authentication error: {e}"} | |
except gspread.exceptions.SpreadsheetNotFound: | |
return {"error": "Spreadsheet not found. Please check the URL."} | |
except Exception as e: | |
return {"error": f"An error occurred: {e}"} | |
if __name__ == "__main__": | |
uvicorn.run(app, host="0.0.0.0", port=8000) | |