1+ import os
2+ import json
3+ import gspread
14from typing import Optional
25from app .schemas .submission import SubmissionOut
3- from sqlalchemy .orm import Session , joinedload
6+ from sqlalchemy .orm import Session
47from app .db import models
58from datetime import datetime , date , timedelta
69from sqlalchemy import func
710from app .db .db import SessionLocal
8- import gspread
9- from oauth2client .service_account import ServiceAccountCredentials
10- import os
1111
12- SCOPE = ["https://spreadsheets.google.com/feeds" , "https://www.googleapis.com/auth/drive" ]
13- CREDS_FILE = "credentials.json"
12+ def _get_gspread_client ():
13+ creds_json_str = os .getenv ("GOOGLE_CREDENTIALS_JSON" )
14+ if not creds_json_str :
15+ raise ValueError ("GOOGLE_CREDENTIALS_JSON environment variable is not set." )
16+
17+ creds_info = json .loads (creds_json_str )
18+ client = gspread .service_account_from_dict (creds_info )
19+ return client
1420
1521def get_user_by_email (db : Session , email : str ):
1622 return db .query (models .User ).filter (models .User .email == email ).first ()
@@ -21,20 +27,17 @@ def get_task(db: Session, track_id: int, task_no: int):
2127def submit_task (db : Session , mentee_id : int , task_id : int , reference_link : str , start_date : date , commit_hash : str ):
2228 existing = db .query (models .Submission ).filter_by (mentee_id = mentee_id , task_id = task_id ).first ()
2329 if existing :
24- return None # Already submitted
30+ return None
2531
2632 mentee = db .query (models .User ).filter (models .User .id == mentee_id ).first ()
27-
2833 task = db .query (models .Task ).filter (models .Task .id == task_id ).first ()
2934 if not task :
3035 raise Exception ("Task not found" )
3136
32- # convert start_date into a datetime object
3337 start_date = datetime .combine (start_date , datetime .min .time ())
3438 deadline = start_date + timedelta (days = task .deadline_days )
3539 submitted_at = datetime .now ()
3640
37- # Check if the submission is late
3841 if deadline >= submitted_at :
3942 submitted_late = False
4043 elif deadline + timedelta (hours = 12 ) >= submitted_at :
@@ -52,35 +55,29 @@ def submit_task(db: Session, mentee_id: int, task_id: int, reference_link: str,
5255 status = "submitted" ,
5356 start_date = start_date ,
5457 submitted_late = submitted_late ,
55- commit_hash = commit_hash
58+ commit_hash = commit_hash
5659 )
5760
58- credentials = ServiceAccountCredentials .from_json_keyfile_name (CREDS_FILE , SCOPE )
59- client = gspread .authorize (credentials )
60- if (task .track_id == 1 ):
61- sheet = client .open ("Copy of Praveshan 2025 Master DB" ).worksheet ("S1 Submissions" )
62- cell = sheet .find (mentee .name )
63- if not cell :
64- name_column = sheet .col_values (1 )
65- row = len (name_column ) + 1
66- sheet .update_cell (row , 1 , mentee .name )
67- sheet .update_cell (row , task .task_no + 2 , commit_hash )
68- else :
69- row = cell .row
70- sheet .update_cell (row , task .task_no + 2 , commit_hash )
71- elif (task .track_id == 2 ):
72- sheet = client .open ("Copy of Praveshan 2025 Master DB" ).worksheet ("S2 Submissions" )
61+ client = _get_gspread_client ()
62+ sheet_name = "Copy of Praveshan 2025 Master DB"
63+
64+ if task .track_id == 1 :
65+ worksheet_name = "S1 Submissions"
66+ elif task .track_id == 2 :
67+ worksheet_name = "S2 Submissions"
68+ else :
69+ worksheet_name = None
70+
71+ if worksheet_name :
72+ sheet = client .open (sheet_name ).worksheet (worksheet_name )
7373 cell = sheet .find (mentee .name )
7474 if not cell :
75- name_column = sheet .col_values (1 )
76- row = len (name_column ) + 1
75+ row = len (sheet .col_values (1 )) + 1
7776 sheet .update_cell (row , 1 , mentee .name )
78- sheet .update_cell (row , task .task_no + 2 , commit_hash )
77+ sheet .update_cell (row , task .task_no + 2 , commit_hash )
7978 else :
8079 row = cell .row
81- sheet .update_cell (row , task .task_no + 2 , commit_hash )
82-
83-
80+ sheet .update_cell (row , task .task_no + 2 , commit_hash )
8481
8582 db .add (submission )
8683 db .commit ()
@@ -106,7 +103,6 @@ def is_mentor_of(db: Session, mentor_id: int, mentee_id: int):
106103 return db .query (models .MentorMenteeMap ).filter_by (mentor_id = mentor_id , mentee_id = mentee_id ).first () is not None
107104
108105def get_leaderboard_data (db : Session , track_id : int ):
109-
110106 return (
111107 db .query (
112108 models .User .name ,
@@ -121,6 +117,7 @@ def get_leaderboard_data(db: Session, track_id: int):
121117 .order_by (func .sum (models .Task .points ).desc ())
122118 .all ()
123119 )
120+
124121def get_otp_by_email (db , email ):
125122 return db .query (models .OTP ).filter (models .OTP .email == email ).first ()
126123
@@ -134,7 +131,6 @@ def create_or_update_otp(db, email, otp, expires_at):
134131 db .add (entry )
135132 db .commit ()
136133
137-
138134def get_submissions_for_user (db : Session , email : str , track_id : Optional [int ] = None ) -> list [SubmissionOut ]:
139135 user = db .query (models .User ).filter (models .User .email == email ).first ()
140136 if not user :
@@ -167,9 +163,12 @@ def get_submissions_for_user(db: Session, email: str, track_id: Optional[int] =
167163 ]
168164
169165def get_sheet_data ():
170- creds = ServiceAccountCredentials .from_json_keyfile_name (CREDS_FILE , SCOPE )
171- client = gspread .authorize (creds )
172- worksheet = client .open_by_key (os .getenv ("GOOGLE_SHEET_ID" )).worksheet ("Praveshan Phase 3" ) # Change sheet name
166+ client = _get_gspread_client ()
167+ sheet_id = os .getenv ("GOOGLE_SHEET_ID" )
168+ if not sheet_id :
169+ raise ValueError ("GOOGLE_SHEET_ID environment variable not set." )
170+
171+ worksheet = client .open_by_key (sheet_id ).worksheet ("Form Responses 1" )
173172 expected_headers = ["Name" , "Email Address" ]
174173 data = worksheet .get_all_records (expected_headers = expected_headers )
175174 return data
@@ -178,7 +177,6 @@ def sync_users_from_sheet():
178177 db : Session = SessionLocal ()
179178 try :
180179 rows = get_sheet_data ()
181- print (f"Loaded { len (rows )} rows from sheet." )
182180 inserted_count = 0
183181 for row in rows :
184182 email = row .get ("Email Address" , "" ).strip ()
@@ -192,8 +190,5 @@ def sync_users_from_sheet():
192190 inserted_count += 1
193191
194192 db .commit ()
195- print (f"Inserted { inserted_count } new users." )
196- except Exception as e :
197- print (f"Error syncing users: { e } " )
198193 finally :
199194 db .close ()
0 commit comments