From 0d625e0d2501d5dcf1dc809ce5a011bf20a7499d Mon Sep 17 00:00:00 2001 From: Hridesh MG Date: Thu, 29 May 2025 14:13:08 +0530 Subject: [PATCH 01/11] fix: rename db url env variable --- alembic/env.py | 2 +- app/config.py | 2 +- app/db/db.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/alembic/env.py b/alembic/env.py index 540780c..a6f3383 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -8,7 +8,7 @@ load_dotenv() config = context.config -DATABASE_URL = os.getenv("DATABASE_URL") +DATABASE_URL = os.getenv("AMMENTOR_DB_URL") config.set_main_option("sqlalchemy.url", DATABASE_URL) from app.db.db import Base diff --git a/app/config.py b/app/config.py index 4cdb80e..f769c64 100644 --- a/app/config.py +++ b/app/config.py @@ -4,7 +4,7 @@ load_dotenv() class Settings: - DATABASE_URL: str = os.getenv("DATABASE_URL", "") + DATABASE_URL: str = os.getenv("AMMENTOR_DB_URL", "") ENV: str = os.getenv("ENV", "development") settings = Settings() \ No newline at end of file diff --git a/app/db/db.py b/app/db/db.py index 31e0de5..766da88 100644 --- a/app/db/db.py +++ b/app/db/db.py @@ -6,7 +6,7 @@ load_dotenv() -DATABASE_URL = os.getenv("DATABASE_URL") +DATABASE_URL = os.getenv("AMMENTOR_DB_URL") engine = create_engine(DATABASE_URL, pool_pre_ping=True) From 7a7fd5ee5b252c887acedaea1a8c7753b26062ac Mon Sep 17 00:00:00 2001 From: Naveen Date: Thu, 29 May 2025 20:10:57 +0530 Subject: [PATCH 02/11] Merge conflict --- app/db/crud.py | 20 +++++++++++++++++--- app/db/models.py | 5 ++++- app/routes/progress.py | 32 +++++++++++++++++++++++++++++--- app/schemas/submission.py | 15 +++++++++++++-- 4 files changed, 63 insertions(+), 9 deletions(-) diff --git a/app/db/crud.py b/app/db/crud.py index 135cbd3..8128d88 100644 --- a/app/db/crud.py +++ b/app/db/crud.py @@ -1,6 +1,6 @@ from sqlalchemy.orm import Session from app.db import models -from datetime import datetime +from datetime import datetime, date def get_user_by_email(db: Session, email: str): return db.query(models.User).filter(models.User.email == email).first() @@ -33,7 +33,7 @@ def approve_submission(db: Session, submission_id: int, mentor_feedback: str, st sub.status = status sub.mentor_feedback = mentor_feedback if status == "approved": - sub.approved_at = datetime.utcnow() + sub.approved_at = datetime.now() db.commit() db.refresh(sub) @@ -69,4 +69,18 @@ def create_or_update_otp(db, email, otp, expires_at): else: entry = models.OTP(email=email, otp=otp, expires_at=expires_at) db.add(entry) - db.commit() \ No newline at end of file + db.commit() + +def pause_task(db: Session, submission: int): + pause_row=db.query(models.Submission).filter_by(id=submission).first() + pause_row.pause=datetime.now() + db.commit() + db.refresh() + return pause_row + +def end_pause(db: Session, submission: int): + pause_row=db.query(models.Submission).filter_by(id=submission).first() + pause_row.total_paused_time+= datetime.combine(date.today(), datetime.now()) - datetime.combine(date.today(), pause_row.pause_start) + db.commit() + db.refresh() + return pause_row diff --git a/app/db/models.py b/app/db/models.py index d0fe03d..992bf0d 100644 --- a/app/db/models.py +++ b/app/db/models.py @@ -39,9 +39,12 @@ class Submission(Base): task_id = Column(Integer, ForeignKey("tasks.id"), nullable=False) reference_link = Column(Text, nullable=False) status = Column(String, default="submitted") # submitted / approved / paused / rejected - submitted_at = Column(DateTime, default=datetime.utcnow) + submitted_at = Column(DateTime, nullable=True) approved_at = Column(DateTime, nullable=True) mentor_feedback = Column(Text, nullable=True) + pause_start = Column(DateTime, nullable=True) + total_paused_time = Column(Integer, nullable=False, default=0) + mentee = relationship("User") task = relationship("Task") diff --git a/app/routes/progress.py b/app/routes/progress.py index e4eb9da..a5a0ac8 100644 --- a/app/routes/progress.py +++ b/app/routes/progress.py @@ -2,14 +2,14 @@ from sqlalchemy.orm import Session from app.db import crud, models from app.db.db import get_db -from app.schemas.submission import SubmissionCreate, SubmissionOut, SubmissionApproval +from app.schemas.submission import SubmissionCreate, SubmissionOut, SubmissionApproval, PauseTask, TasksList router = APIRouter() @router.post("/submit-task", response_model=SubmissionOut) def submit_task(data: SubmissionCreate, db: Session = Depends(get_db)): # 1. Validate mentee - mentee = crud.get_user_by_email(db, data.mentee_email) + mentee = crud.get_user_by_email(db, email=data.mentee_email) if not mentee or mentee.role != "mentee": raise HTTPException(status_code=403, detail="Invalid or missing mentee") @@ -48,4 +48,30 @@ def approve_task(data: SubmissionApproval, db: Session = Depends(get_db)): mentor_feedback=data.mentor_feedback, status=data.status ) - return updated \ No newline at end of file + return updated + +@router.post("/pause-task", response_model=PauseTask) +def pause_task(data: PauseTask, db: Session = Depends(get_db)): + mentor = crud.get_user_by_email(db, data.mentor_email) + mentee = crud.get_user_by_email(db, email=data.mentee_email) + if not crud.is_mentor_of(db, mentor.id, mentee.id): + raise HTTPException(status_code=403, detail="Mentor not authorized for this mentee") + task = crud.get_task(db, task_id=data.task_id) + mentee_task_submission = db.query(models.Submission).filter_by(mentee_id=mentee, task=task).first() + if mentee_task_submission.pause_start(): + return HTTPException(status_code=400, detail="This task is already paused") + paused = crud.pause_task(mentee_task_submission.id) + return paused + +@router.post("/pause-end", response_model=PauseTask) +def end_pause(data: PauseTask, db: Session = Depends(get_db)): + mentor = crud.get_user_by_email() + mentee = crud.get_user_by_email() + if not crud.is_mentor_of(db, mentor.id, mentee.id): + return HTTPException(status_code=403, detail="Mentor not authorized for this mentee") + task = crud.get_task(db, task_id=data.task_id) + mentee_task_submission = db.query(models.Submission).filter_by(mentee_id=mentee, task=task).first() + if mentee_task_submission.pause_start(): + return HTTPException(status_code=400, detail="This task is already paused") + paused = crud.end_pause(mentee_task_submission.id) + return paused diff --git a/app/schemas/submission.py b/app/schemas/submission.py index bfc36ca..8d69b98 100644 --- a/app/schemas/submission.py +++ b/app/schemas/submission.py @@ -11,7 +11,7 @@ class SubmissionCreate(SubmissionBase): mentee_email: str class SubmissionOut(BaseModel): - id: int + id: int # name check please mentee_id: int task_id: int reference_link: str @@ -27,4 +27,15 @@ class SubmissionApproval(BaseModel): submission_id: int mentor_email: str status: str # approved, paused, rejected - mentor_feedback: Optional[str] = None \ No newline at end of file + mentor_feedback: Optional[str] = None + +class PauseTask(BaseModel): + submission_id: int # is that the right name ? + pause_start: datetime + task_id: int + mentee_email: str + mentor_email: str + +class TasksList(BaseModel): + track_id: int + mentee_id: str \ No newline at end of file From 41d887b1a94b1dd5abeac746c07f763cad010772 Mon Sep 17 00:00:00 2001 From: Naveen Date: Thu, 29 May 2025 20:13:06 +0530 Subject: [PATCH 03/11] Merge conflict --- app/db/crud.py | 41 +++++++++++++++++++++++++++------------ app/db/models.py | 3 ++- app/routes/progress.py | 16 ++++++++++++--- app/schemas/submission.py | 10 +++++++--- 4 files changed, 51 insertions(+), 19 deletions(-) diff --git a/app/db/crud.py b/app/db/crud.py index 8128d88..fb44c53 100644 --- a/app/db/crud.py +++ b/app/db/crud.py @@ -9,18 +9,10 @@ def get_task(db: Session, track_id: int, task_no: int): return db.query(models.Task).filter_by(track_id=track_id, task_no=task_no).first() def submit_task(db: Session, mentee_id: int, task_id: int, reference_link: str): - existing = db.query(models.Submission).filter_by(mentee_id=mentee_id, task_id=task_id).first() - if existing: - return None # Already submitted - - submission = models.Submission( - mentee_id=mentee_id, - task_id=task_id, - reference_link=reference_link, - submitted_at=datetime.utcnow(), - status="submitted" - ) - db.add(submission) + submission = db.query(models.Submission).filter_by(mentee_id=mentee_id, task_id=task_id).first() + submission.status = "Submitted" + submission.submitted_at = datetime.now() + submission.reference_link = reference_link db.commit() db.refresh(submission) return submission @@ -84,3 +76,28 @@ def end_pause(db: Session, submission: int): db.commit() db.refresh() return pause_row + +def get_otp_by_email(db, email): + return db.query(models.OTP).filter(models.OTP.email == email).first() + +def create_or_update_otp(db, email, otp, expires_at): + entry = get_otp_by_email(db, email) + if entry: + entry.otp = otp + entry.expires_at = expires_at + else: + entry = models.OTP(email=email, otp=otp, expires_at=expires_at) + db.add(entry) + db.commit() + +def start_task(db: Session, task_id: int, mentee_id: int): + task_start = models.Submission( + mentee = mentee_id, + task = task_id, + start_date = datetime.now(), + status = "started" + ) + db.add(task_start) + db.commit() + db.refresh(task_start) + return task_start diff --git a/app/db/models.py b/app/db/models.py index 992bf0d..a420063 100644 --- a/app/db/models.py +++ b/app/db/models.py @@ -38,7 +38,8 @@ class Submission(Base): mentee_id = Column(Integer, ForeignKey("users.id"), nullable=False) task_id = Column(Integer, ForeignKey("tasks.id"), nullable=False) reference_link = Column(Text, nullable=False) - status = Column(String, default="submitted") # submitted / approved / paused / rejected + status = Column(String, default="ongoing") # submitted / approved / paused / rejected / ongoing + start_date = Column(String, nullable=False) submitted_at = Column(DateTime, nullable=True) approved_at = Column(DateTime, nullable=True) mentor_feedback = Column(Text, nullable=True) diff --git a/app/routes/progress.py b/app/routes/progress.py index a5a0ac8..a9999df 100644 --- a/app/routes/progress.py +++ b/app/routes/progress.py @@ -2,7 +2,7 @@ from sqlalchemy.orm import Session from app.db import crud, models from app.db.db import get_db -from app.schemas.submission import SubmissionCreate, SubmissionOut, SubmissionApproval, PauseTask, TasksList +from app.schemas.submission import SubmissionCreate, SubmissionOut, SubmissionApproval, PauseTask, StartTask router = APIRouter() @@ -65,8 +65,8 @@ def pause_task(data: PauseTask, db: Session = Depends(get_db)): @router.post("/pause-end", response_model=PauseTask) def end_pause(data: PauseTask, db: Session = Depends(get_db)): - mentor = crud.get_user_by_email() - mentee = crud.get_user_by_email() + mentor = crud.get_user_by_email(db, data.mentor_email) + mentee = crud.get_user_by_email(db, data.mentee_email) if not crud.is_mentor_of(db, mentor.id, mentee.id): return HTTPException(status_code=403, detail="Mentor not authorized for this mentee") task = crud.get_task(db, task_id=data.task_id) @@ -75,3 +75,13 @@ def end_pause(data: PauseTask, db: Session = Depends(get_db)): return HTTPException(status_code=400, detail="This task is already paused") paused = crud.end_pause(mentee_task_submission.id) return paused + +@router.post("/{track_id}/{task_id}/start-task", response_model=StartTask) +def start_task(data: StartTask, db: Session = Depends(get_db)): + mentee = crud.get_user_by_email() + task = crud.get_task(db, task_id=data.task_id) + existing = db.query(models.Submission).filter_by(mentee_id=mentee.id, task_id=task.id).first() + if existing: + return HTTPException(status_code=403, detail="Already Started") + start = crud.start_task(task_id=task.id, mentee_id=mentee.id) + return start \ No newline at end of file diff --git a/app/schemas/submission.py b/app/schemas/submission.py index 8d69b98..32b7c68 100644 --- a/app/schemas/submission.py +++ b/app/schemas/submission.py @@ -26,11 +26,11 @@ class Config: class SubmissionApproval(BaseModel): submission_id: int mentor_email: str - status: str # approved, paused, rejected + status: str mentor_feedback: Optional[str] = None class PauseTask(BaseModel): - submission_id: int # is that the right name ? + submission_id: int pause_start: datetime task_id: int mentee_email: str @@ -38,4 +38,8 @@ class PauseTask(BaseModel): class TasksList(BaseModel): track_id: int - mentee_id: str \ No newline at end of file + mentee_id: str + +class StartTask(BaseModel): + mentee_email: int + task_id: int \ No newline at end of file From 22bacf066eb21f10c6c842535000bff33fd61acb Mon Sep 17 00:00:00 2001 From: Naveen Date: Thu, 29 May 2025 20:13:30 +0530 Subject: [PATCH 04/11] Merge conflict --- app/db/crud.py | 8 ++++++++ app/routes/tracks.py | 15 +++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/app/db/crud.py b/app/db/crud.py index fb44c53..93a383b 100644 --- a/app/db/crud.py +++ b/app/db/crud.py @@ -101,3 +101,11 @@ def start_task(db: Session, task_id: int, mentee_id: int): db.commit() db.refresh(task_start) return task_start + +def find_time_spent_on_task(db: Session, submission: int): + submission = db.query(models.Submission).filter_by(id=submission).first() + if submission.submitted_at: + time_spent = datetime.combine(submission.submitted_at) - datetime.combine(submission.start_date) - submission.total_paused_time + else: + time_spent = datetime.combine(datetime.now()) - datetime.combine(submission.start_date) - submission.total_paused_time + return time_spent diff --git a/app/routes/tracks.py b/app/routes/tracks.py index f200351..dcf2187 100644 --- a/app/routes/tracks.py +++ b/app/routes/tracks.py @@ -4,6 +4,7 @@ from app.db.db import get_db from app.schemas.track import TrackOut from app.schemas.task import TaskOut +from app.db import crud router = APIRouter() @@ -16,5 +17,15 @@ def list_tasks_for_track(track_id: int, db: Session = Depends(get_db)): track = db.query(models.Track).filter_by(id=track_id).first() if not track: raise HTTPException(status_code=404, detail="Track not found") - - return db.query(models.Task).filter_by(track_id=track_id).order_by(models.Task.task_no).all() \ No newline at end of file + tasks = db.query(models.Task).filter_by(track_id=track_id).order_by(models.Task.task_no).all() + tasks_with_status={} + for task in tasks: + submission_of_task = db.query(models.Submission).filter_by(id=task.id).first() + if submission_of_task: + task['status'] = submission_of_task.status + task['time_spent'] = crud.find_time_spent_on_task(submission_of_task.id) + else: + task['status'] = "Not started" + task['time_spent'] = 0 + tasks_with_status.append(task) + return tasks_with_status \ No newline at end of file From 113742e2c991ee091b1bf6f21b2fc45b60e4cfde Mon Sep 17 00:00:00 2001 From: Naveen Date: Thu, 29 May 2025 20:14:52 +0530 Subject: [PATCH 05/11] Merge conflict --- app/db/crud.py | 12 +++++++++--- app/db/models.py | 2 +- app/routes/progress.py | 21 ++++++++++++++------- app/schemas/submission.py | 3 ++- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/app/db/crud.py b/app/db/crud.py index 93a383b..94c557c 100644 --- a/app/db/crud.py +++ b/app/db/crud.py @@ -66,6 +66,7 @@ def create_or_update_otp(db, email, otp, expires_at): def pause_task(db: Session, submission: int): pause_row=db.query(models.Submission).filter_by(id=submission).first() pause_row.pause=datetime.now() + pause_row.status = "paused" db.commit() db.refresh() return pause_row @@ -73,6 +74,7 @@ def pause_task(db: Session, submission: int): def end_pause(db: Session, submission: int): pause_row=db.query(models.Submission).filter_by(id=submission).first() pause_row.total_paused_time+= datetime.combine(date.today(), datetime.now()) - datetime.combine(date.today(), pause_row.pause_start) + pause_row.status = "ongoing" db.commit() db.refresh() return pause_row @@ -95,7 +97,7 @@ def start_task(db: Session, task_id: int, mentee_id: int): mentee = mentee_id, task = task_id, start_date = datetime.now(), - status = "started" + status = "ongoing" ) db.add(task_start) db.commit() @@ -105,7 +107,11 @@ def start_task(db: Session, task_id: int, mentee_id: int): def find_time_spent_on_task(db: Session, submission: int): submission = db.query(models.Submission).filter_by(id=submission).first() if submission.submitted_at: - time_spent = datetime.combine(submission.submitted_at) - datetime.combine(submission.start_date) - submission.total_paused_time + time_spent = (submission.submitted_at - submission.start_date - submission.total_paused_time).days else: - time_spent = datetime.combine(datetime.now()) - datetime.combine(submission.start_date) - submission.total_paused_time + time_spent = (datetime.now() - submission.start_date - submission.total_paused_time).days return time_spent + +def get_submission(db: Session, mentee_email: str, track_id: int, task_no: int): + mentee = get_user_by_email(mentee_email) + return db.query(models.Submission).filter_by(mentee_email=mentee.id, track_id=track_id, task_no=task_no) diff --git a/app/db/models.py b/app/db/models.py index a420063..dc683ac 100644 --- a/app/db/models.py +++ b/app/db/models.py @@ -38,7 +38,7 @@ class Submission(Base): mentee_id = Column(Integer, ForeignKey("users.id"), nullable=False) task_id = Column(Integer, ForeignKey("tasks.id"), nullable=False) reference_link = Column(Text, nullable=False) - status = Column(String, default="ongoing") # submitted / approved / paused / rejected / ongoing + status = Column(String, default="ongoing") # submitted / approved / paused / ongoing start_date = Column(String, nullable=False) submitted_at = Column(DateTime, nullable=True) approved_at = Column(DateTime, nullable=True) diff --git a/app/routes/progress.py b/app/routes/progress.py index a9999df..3105442 100644 --- a/app/routes/progress.py +++ b/app/routes/progress.py @@ -19,7 +19,7 @@ def submit_task(data: SubmissionCreate, db: Session = Depends(get_db)): raise HTTPException(status_code=404, detail="Task not found") # 3. Submit - submission = crud.submit_task(db, mentee_id=mentee.id, task_id=task.id, reference_link=data.reference_link) + submission = crud.submit_task(db, mentee_id=mentee.id, task_id=task.id, reference_link=data.reference_link, status = "submitted") if not submission: raise HTTPException(status_code=400, detail="Task already submitted") @@ -36,7 +36,14 @@ def approve_task(data: SubmissionApproval, db: Session = Depends(get_db)): sub = db.query(models.Submission).filter_by(id=data.submission_id).first() if not sub: raise HTTPException(status_code=404, detail="Submission not found") - + task = db.query(models.Tasks).filter_by(id=sub.task_id).first() + mentee = db.query(models.User).filter_by(mentee_id=sub.mentee_id) + + # 3. Check if late and add points + if sub.total_paused_time > task.deadline_days: + mentee.points += task.points/2 # Where are we storing points ???!!!! + else: + mentee.poins += task.points # 3. Confirm mentor is assigned to this mentee if not crud.is_mentor_of(db, mentor.id, sub.mentee_id): raise HTTPException(status_code=403, detail="Mentor not authorized for this mentee") @@ -46,7 +53,7 @@ def approve_task(data: SubmissionApproval, db: Session = Depends(get_db)): db, submission_id=sub.id, mentor_feedback=data.mentor_feedback, - status=data.status + status=data.status # approved, ongoing ) return updated @@ -76,11 +83,11 @@ def end_pause(data: PauseTask, db: Session = Depends(get_db)): paused = crud.end_pause(mentee_task_submission.id) return paused -@router.post("/{track_id}/{task_id}/start-task", response_model=StartTask) +@router.post("/start-task", response_model=StartTask) def start_task(data: StartTask, db: Session = Depends(get_db)): - mentee = crud.get_user_by_email() - task = crud.get_task(db, task_id=data.task_id) - existing = db.query(models.Submission).filter_by(mentee_id=mentee.id, task_id=task.id).first() + mentee = crud.get_user_by_email(email=data.mentee_email) + task = crud.get_task(db, track_id=data.track_id, task_no=data.task_no) + existing = crud.get_submission(db, mentee.email, task.track_id, task.task_no) if existing: return HTTPException(status_code=403, detail="Already Started") start = crud.start_task(task_id=task.id, mentee_id=mentee.id) diff --git a/app/schemas/submission.py b/app/schemas/submission.py index 32b7c68..3d94825 100644 --- a/app/schemas/submission.py +++ b/app/schemas/submission.py @@ -42,4 +42,5 @@ class TasksList(BaseModel): class StartTask(BaseModel): mentee_email: int - task_id: int \ No newline at end of file + task_no: int + track_id: int \ No newline at end of file From fb88ec6f9bc2183d8dafc3e6c3672993dd1ef28d Mon Sep 17 00:00:00 2001 From: Naveen Date: Thu, 29 May 2025 19:58:14 +0530 Subject: [PATCH 06/11] Implemented adding points and reduced points for late submission --- app/db/models.py | 2 +- app/routes/progress.py | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/db/models.py b/app/db/models.py index dc683ac..f4a153f 100644 --- a/app/db/models.py +++ b/app/db/models.py @@ -66,7 +66,7 @@ class LeaderboardEntry(Base): tasks_completed = Column(Integer, default=0) class OTP(Base): __tablename__ = "otp" - + email = Column(String, primary_key=True, index=True) otp = Column(String, nullable=False) expires_at = Column(DateTime, nullable=False) \ No newline at end of file diff --git a/app/routes/progress.py b/app/routes/progress.py index 3105442..dd90958 100644 --- a/app/routes/progress.py +++ b/app/routes/progress.py @@ -37,13 +37,12 @@ def approve_task(data: SubmissionApproval, db: Session = Depends(get_db)): if not sub: raise HTTPException(status_code=404, detail="Submission not found") task = db.query(models.Tasks).filter_by(id=sub.task_id).first() - mentee = db.query(models.User).filter_by(mentee_id=sub.mentee_id) - + points_storage = db.query(models.LeaderboardEntry).filter_by(track_id=sub.track_id, mentee_id=sub.mentee_id) # 3. Check if late and add points if sub.total_paused_time > task.deadline_days: - mentee.points += task.points/2 # Where are we storing points ???!!!! + points_storage.total_points += task.points/2 else: - mentee.poins += task.points + points_storage.total_points += task.points # 3. Confirm mentor is assigned to this mentee if not crud.is_mentor_of(db, mentor.id, sub.mentee_id): raise HTTPException(status_code=403, detail="Mentor not authorized for this mentee") From 9be0d003af4580571c1c29f2ce12d8bdbd78a0f5 Mon Sep 17 00:00:00 2001 From: Naveen Date: Fri, 30 May 2025 21:45:16 +0530 Subject: [PATCH 07/11] Corrected a few minor issues --- app/db/crud.py | 10 +++++----- app/db/models.py | 1 - app/routes/progress.py | 13 ++++++++----- app/routes/tracks.py | 35 ++++++++++++++++++++++------------- app/schemas/submission.py | 5 +++-- app/schemas/track.py | 17 ++++++++++++++++- 6 files changed, 54 insertions(+), 27 deletions(-) diff --git a/app/db/crud.py b/app/db/crud.py index 94c557c..bc137b0 100644 --- a/app/db/crud.py +++ b/app/db/crud.py @@ -1,6 +1,6 @@ from sqlalchemy.orm import Session from app.db import models -from datetime import datetime, date +from datetime import datetime, date, timedelta def get_user_by_email(db: Session, email: str): return db.query(models.User).filter(models.User.email == email).first() @@ -94,8 +94,8 @@ def create_or_update_otp(db, email, otp, expires_at): def start_task(db: Session, task_id: int, mentee_id: int): task_start = models.Submission( - mentee = mentee_id, - task = task_id, + mentee_id = mentee_id, + task_id = task_id, start_date = datetime.now(), status = "ongoing" ) @@ -107,9 +107,9 @@ def start_task(db: Session, task_id: int, mentee_id: int): def find_time_spent_on_task(db: Session, submission: int): submission = db.query(models.Submission).filter_by(id=submission).first() if submission.submitted_at: - time_spent = (submission.submitted_at - submission.start_date - submission.total_paused_time).days + time_spent = (submission.submitted_at - submission.start_date - timedelta(submission.total_paused_time)).days else: - time_spent = (datetime.now() - submission.start_date - submission.total_paused_time).days + time_spent = (datetime.now() - submission.start_date - timedelta(submission.total_paused_time)).days return time_spent def get_submission(db: Session, mentee_email: str, track_id: int, task_no: int): diff --git a/app/db/models.py b/app/db/models.py index f4a153f..7d3a770 100644 --- a/app/db/models.py +++ b/app/db/models.py @@ -1,6 +1,5 @@ from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, UniqueConstraint from sqlalchemy.orm import relationship -from datetime import datetime from app.db.db import Base class User(Base): diff --git a/app/routes/progress.py b/app/routes/progress.py index dd90958..0ea0108 100644 --- a/app/routes/progress.py +++ b/app/routes/progress.py @@ -37,12 +37,15 @@ def approve_task(data: SubmissionApproval, db: Session = Depends(get_db)): if not sub: raise HTTPException(status_code=404, detail="Submission not found") task = db.query(models.Tasks).filter_by(id=sub.task_id).first() - points_storage = db.query(models.LeaderboardEntry).filter_by(track_id=sub.track_id, mentee_id=sub.mentee_id) + points_storage = db.query(models.LeaderboardEntry).filter_by(track_id=sub.track_id, mentee_id=sub.mentee_id).first() + # 3. Check if late and add points if sub.total_paused_time > task.deadline_days: points_storage.total_points += task.points/2 else: points_storage.total_points += task.points + db.commit() + # 3. Confirm mentor is assigned to this mentee if not crud.is_mentor_of(db, mentor.id, sub.mentee_id): raise HTTPException(status_code=403, detail="Mentor not authorized for this mentee") @@ -62,9 +65,9 @@ def pause_task(data: PauseTask, db: Session = Depends(get_db)): mentee = crud.get_user_by_email(db, email=data.mentee_email) if not crud.is_mentor_of(db, mentor.id, mentee.id): raise HTTPException(status_code=403, detail="Mentor not authorized for this mentee") - task = crud.get_task(db, task_id=data.task_id) + task = crud.get_task(db, task_no=data.task_no, track_id=data.track_id) mentee_task_submission = db.query(models.Submission).filter_by(mentee_id=mentee, task=task).first() - if mentee_task_submission.pause_start(): + if mentee_task_submission.pause_start: return HTTPException(status_code=400, detail="This task is already paused") paused = crud.pause_task(mentee_task_submission.id) return paused @@ -76,8 +79,8 @@ def end_pause(data: PauseTask, db: Session = Depends(get_db)): if not crud.is_mentor_of(db, mentor.id, mentee.id): return HTTPException(status_code=403, detail="Mentor not authorized for this mentee") task = crud.get_task(db, task_id=data.task_id) - mentee_task_submission = db.query(models.Submission).filter_by(mentee_id=mentee, task=task).first() - if mentee_task_submission.pause_start(): + mentee_task_submission = db.query(models.Submission).filter_by(mentee_id=mentee, task_id=task).first() + if mentee_task_submission.pause_start: return HTTPException(status_code=400, detail="This task is already paused") paused = crud.end_pause(mentee_task_submission.id) return paused diff --git a/app/routes/tracks.py b/app/routes/tracks.py index dcf2187..9c1dcff 100644 --- a/app/routes/tracks.py +++ b/app/routes/tracks.py @@ -2,7 +2,7 @@ from sqlalchemy.orm import Session from app.db import models from app.db.db import get_db -from app.schemas.track import TrackOut +from app.schemas.track import TrackOut, MenteeTasks from app.schemas.task import TaskOut from app.db import crud @@ -12,20 +12,29 @@ def list_tracks(db: Session = Depends(get_db)): return db.query(models.Track).all() -@router.get("/{track_id}/tasks", response_model=list[TaskOut]) -def list_tasks_for_track(track_id: int, db: Session = Depends(get_db)): - track = db.query(models.Track).filter_by(id=track_id).first() - if not track: - raise HTTPException(status_code=404, detail="Track not found") +@router.get("/mentee/tasks", response_model=list[TaskOut]) +def mentee_specific_status(track_id: int, mentee_email: str, db: Session = Depends(get_db)): tasks = db.query(models.Task).filter_by(track_id=track_id).order_by(models.Task.task_no).all() - tasks_with_status={} + mentee = crud.get_user_by_email(db, mentee_email) + tasks_with_status=[] for task in tasks: - submission_of_task = db.query(models.Submission).filter_by(id=task.id).first() + submission_of_task = db.query(models.Submission).filter_by(task_id=task.id, mentee_id=mentee.id).first() if submission_of_task: - task['status'] = submission_of_task.status - task['time_spent'] = crud.find_time_spent_on_task(submission_of_task.id) + status = submission_of_task.status + time_spent = crud.find_time_spent_on_task(submission_of_task.id) else: - task['status'] = "Not started" - task['time_spent'] = 0 - tasks_with_status.append(task) + status = "Not started" + time_spent = 0 + tasks_with_status.append( + { + "task_no": task.task_no, + "title": task.title, + "points": task.points, + "deadline": task.deadline_days, + "status": status, + "time_spent": time_spent, + "description": task.description, + "track": task.track.title + } + ) return tasks_with_status \ No newline at end of file diff --git a/app/schemas/submission.py b/app/schemas/submission.py index 3d94825..fbc767a 100644 --- a/app/schemas/submission.py +++ b/app/schemas/submission.py @@ -11,7 +11,7 @@ class SubmissionCreate(SubmissionBase): mentee_email: str class SubmissionOut(BaseModel): - id: int # name check please + id: int mentee_id: int task_id: int reference_link: str @@ -32,7 +32,8 @@ class SubmissionApproval(BaseModel): class PauseTask(BaseModel): submission_id: int pause_start: datetime - task_id: int + task_no: int + track_id: int mentee_email: str mentor_email: str diff --git a/app/schemas/track.py b/app/schemas/track.py index 0ac8fdd..e6b982c 100644 --- a/app/schemas/track.py +++ b/app/schemas/track.py @@ -12,4 +12,19 @@ class TrackOut(TrackBase): id: int class Config: - orm_mode = True \ No newline at end of file + orm_mode = True + +class TaskOut(BaseModel): + task_no: int + title: str + points: int + deadline: int + status: str + time_spent: int + description: str + track: str + +class MenteeTasks(BaseModel): + mentee_email: str + task_no: int + track_id: int \ No newline at end of file From 41f71ae11750d1a44a3a33b959b548200f668ff2 Mon Sep 17 00:00:00 2001 From: Naveen Date: Fri, 30 May 2025 22:03:07 +0530 Subject: [PATCH 08/11] Changed the route for task details display --- app/routes/tracks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/routes/tracks.py b/app/routes/tracks.py index 9c1dcff..cf811d8 100644 --- a/app/routes/tracks.py +++ b/app/routes/tracks.py @@ -12,7 +12,7 @@ def list_tracks(db: Session = Depends(get_db)): return db.query(models.Track).all() -@router.get("/mentee/tasks", response_model=list[TaskOut]) +@router.get("/{track_id}/tasks", response_model=list[TaskOut]) def mentee_specific_status(track_id: int, mentee_email: str, db: Session = Depends(get_db)): tasks = db.query(models.Task).filter_by(track_id=track_id).order_by(models.Task.task_no).all() mentee = crud.get_user_by_email(db, mentee_email) From 365bb70458a8ba5c4f9f93e1b0389120af4f7b1f Mon Sep 17 00:00:00 2001 From: Naveen Date: Mon, 2 Jun 2025 10:02:28 +0530 Subject: [PATCH 09/11] changed time_spent to progress_bar --- app/routes/tracks.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/routes/tracks.py b/app/routes/tracks.py index cf811d8..a041efd 100644 --- a/app/routes/tracks.py +++ b/app/routes/tracks.py @@ -25,6 +25,7 @@ def mentee_specific_status(track_id: int, mentee_email: str, db: Session = Depen else: status = "Not started" time_spent = 0 + progress_bar = (time_spent/task.deadline_days) * 100 tasks_with_status.append( { "task_no": task.task_no, @@ -32,7 +33,7 @@ def mentee_specific_status(track_id: int, mentee_email: str, db: Session = Depen "points": task.points, "deadline": task.deadline_days, "status": status, - "time_spent": time_spent, + "progress_bar": progress_bar, "description": task.description, "track": task.track.title } From da23e595dcf7875660c0c795cf0262f5f5db1e9d Mon Sep 17 00:00:00 2001 From: Naveen Date: Tue, 3 Jun 2025 16:15:30 +0530 Subject: [PATCH 10/11] Resolved merge conflict --- app/db/crud.py | 22 +++++++++-------- app/db/models.py | 2 +- app/routes/progress.py | 50 ++++++++++++++++++++------------------- app/routes/tracks.py | 10 +++++--- app/schemas/submission.py | 4 +--- app/schemas/task.py | 5 ++-- 6 files changed, 50 insertions(+), 43 deletions(-) diff --git a/app/db/crud.py b/app/db/crud.py index ae19eeb..7454b15 100644 --- a/app/db/crud.py +++ b/app/db/crud.py @@ -66,7 +66,7 @@ def create_or_update_otp(db, email, otp, expires_at): def pause_task(db: Session, submission: int): pause_row=db.query(models.Submission).filter_by(id=submission).first() - pause_row.pause=datetime.now() + pause_row.pause_start=datetime.now() pause_row.status = "paused" db.commit() db.refresh(pause_row) @@ -74,8 +74,9 @@ def pause_task(db: Session, submission: int): def end_pause(db: Session, submission: int): pause_row=db.query(models.Submission).filter_by(id=submission).first() - pause_row.total_paused_time+= datetime.combine(date.today(), datetime.now()) - datetime.combine(date.today(), pause_row.pause_start) + pause_row.total_paused_time+= (datetime.now().date() - pause_row.pause_start.date()).days pause_row.status = "ongoing" + pause_row.pause_start = None db.commit() db.refresh(pause_row) return pause_row @@ -92,17 +93,17 @@ def start_task(db: Session, task_id: int, mentee_id: int): db.refresh(task_start) return task_start -def find_time_spent_on_task(db: Session, submission: int): - submission = db.query(models.Submission).filter_by(id=submission).first() - if submission.submitted_at: - time_spent = (submission.submitted_at - submission.start_date - timedelta(submission.total_paused_time)).days - else: - time_spent = (datetime.now() - submission.start_date - timedelta(submission.total_paused_time)).days +def find_time_spent_on_task(db: Session, submission_id: int): + submission = db.query(models.Submission).filter_by(id=submission_id).first() + start = datetime.fromisoformat(submission.start_date) if isinstance(submission.start_date, str) else submission.start_date + end = submission.submitted_at or datetime.now() + time_spent = (end - start - timedelta(days=submission.total_paused_time)).days return time_spent def get_submission(db: Session, mentee_email: str, track_id: int, task_no: int): - mentee = get_user_by_email(db, mentee_email) - return db.query(models.Submission).filter_by(mentee_email=mentee.id, track_id=track_id, task_no=task_no) + mentee = get_user_by_email(db, email=mentee_email) + task = get_task(db, track_id=track_id, task_no=task_no) + return db.query(models.Submission).filter_by(mentee_id=mentee.id, task_id=task.id).first() def get_submissions(db: Session, email: str, track_id: Optional[int] = None): user = db.query(models.User).filter(models.User.email == email).first() @@ -113,3 +114,4 @@ def get_submissions(db: Session, email: str, track_id: Optional[int] = None): query = query.join(models.Task, models.Submission.task_id == models.Task.id) query = query.filter(models.Task.track_id == track_id) return query.all() + \ No newline at end of file diff --git a/app/db/models.py b/app/db/models.py index 7d3a770..ce52779 100644 --- a/app/db/models.py +++ b/app/db/models.py @@ -36,7 +36,7 @@ class Submission(Base): id = Column(Integer, primary_key=True, index=True) mentee_id = Column(Integer, ForeignKey("users.id"), nullable=False) task_id = Column(Integer, ForeignKey("tasks.id"), nullable=False) - reference_link = Column(Text, nullable=False) + reference_link = Column(Text, nullable=True) status = Column(String, default="ongoing") # submitted / approved / paused / ongoing start_date = Column(String, nullable=False) submitted_at = Column(DateTime, nullable=True) diff --git a/app/routes/progress.py b/app/routes/progress.py index 0ea0108..032a457 100644 --- a/app/routes/progress.py +++ b/app/routes/progress.py @@ -6,7 +6,7 @@ router = APIRouter() -@router.post("/submit-task", response_model=SubmissionOut) +@router.post("/submit-task", response_model=SubmissionOut) # check if it has already been submitted, def submit_task(data: SubmissionCreate, db: Session = Depends(get_db)): # 1. Validate mentee mentee = crud.get_user_by_email(db, email=data.mentee_email) @@ -18,17 +18,19 @@ def submit_task(data: SubmissionCreate, db: Session = Depends(get_db)): if not task: raise HTTPException(status_code=404, detail="Task not found") - # 3. Submit - submission = crud.submit_task(db, mentee_id=mentee.id, task_id=task.id, reference_link=data.reference_link, status = "submitted") - if not submission: + # 3. Check if submission exists + sub = crud.get_submission(db,mentee_email=mentee.email, track_id=task.track_id, task_no=task.task_no) + if sub: raise HTTPException(status_code=400, detail="Task already submitted") + # 4. Submit task + submission = crud.submit_task(db, mentee_id=mentee.id, task_id=task.id, reference_link=data.reference_link, status = "submitted") return submission -@router.patch("/approve-task", response_model=SubmissionOut) +@router.patch("/approve-task", response_model=SubmissionOut) def approve_task(data: SubmissionApproval, db: Session = Depends(get_db)): # 1. Validate mentor - mentor = crud.get_user_by_email(db, data.mentor_email) + mentor = crud.get_user_by_email(db, email=data.mentor_email) if not mentor or mentor.role != "mentor": raise HTTPException(status_code=403, detail="Invalid or missing mentor") @@ -61,36 +63,36 @@ def approve_task(data: SubmissionApproval, db: Session = Depends(get_db)): @router.post("/pause-task", response_model=PauseTask) def pause_task(data: PauseTask, db: Session = Depends(get_db)): - mentor = crud.get_user_by_email(db, data.mentor_email) + mentor = crud.get_user_by_email(db, email=data.mentor_email) mentee = crud.get_user_by_email(db, email=data.mentee_email) if not crud.is_mentor_of(db, mentor.id, mentee.id): raise HTTPException(status_code=403, detail="Mentor not authorized for this mentee") task = crud.get_task(db, task_no=data.task_no, track_id=data.track_id) - mentee_task_submission = db.query(models.Submission).filter_by(mentee_id=mentee, task=task).first() + mentee_task_submission = crud.get_submission(db, mentee.email, task.track_id, task.task_no) if mentee_task_submission.pause_start: - return HTTPException(status_code=400, detail="This task is already paused") - paused = crud.pause_task(mentee_task_submission.id) - return paused + raise HTTPException(status_code=400, detail="This task is already paused") + crud.pause_task(db, mentee_task_submission.id) + return PauseTask(task_no=task.task_no, track_id=task.track_id, mentee_email=mentee.email, mentor_email=mentor.email) @router.post("/pause-end", response_model=PauseTask) def end_pause(data: PauseTask, db: Session = Depends(get_db)): - mentor = crud.get_user_by_email(db, data.mentor_email) - mentee = crud.get_user_by_email(db, data.mentee_email) + mentor = crud.get_user_by_email(db, email=data.mentor_email) + mentee = crud.get_user_by_email(db, email=data.mentee_email) if not crud.is_mentor_of(db, mentor.id, mentee.id): - return HTTPException(status_code=403, detail="Mentor not authorized for this mentee") - task = crud.get_task(db, task_id=data.task_id) - mentee_task_submission = db.query(models.Submission).filter_by(mentee_id=mentee, task_id=task).first() - if mentee_task_submission.pause_start: - return HTTPException(status_code=400, detail="This task is already paused") - paused = crud.end_pause(mentee_task_submission.id) - return paused + raise HTTPException(status_code=403, detail="Mentor not authorized for this mentee") + task = crud.get_task(db, task_no=data.task_no, track_id=data.track_id) + mentee_task_submission = db.query(models.Submission).filter_by(mentee_id=mentee.id, task_id=task.id).first() + if not mentee_task_submission.pause_start: + raise HTTPException(status_code=400, detail="This task is not paused") + crud.end_pause(db, mentee_task_submission.id) + return PauseTask(task_no=task.task_no, track_id=task.track_id, mentee_email=mentee.email, mentor_email=mentor.email) @router.post("/start-task", response_model=StartTask) def start_task(data: StartTask, db: Session = Depends(get_db)): - mentee = crud.get_user_by_email(email=data.mentee_email) + mentee = crud.get_user_by_email(db, email=data.mentee_email) task = crud.get_task(db, track_id=data.track_id, task_no=data.task_no) existing = crud.get_submission(db, mentee.email, task.track_id, task.task_no) if existing: - return HTTPException(status_code=403, detail="Already Started") - start = crud.start_task(task_id=task.id, mentee_id=mentee.id) - return start \ No newline at end of file + raise HTTPException(status_code=403, detail="Already Started") + crud.start_task(db, task_id=task.id, mentee_id=mentee.id) + return mentee.email, task.task_no, task.track.id \ No newline at end of file diff --git a/app/routes/tracks.py b/app/routes/tracks.py index a041efd..57ec4b0 100644 --- a/app/routes/tracks.py +++ b/app/routes/tracks.py @@ -15,17 +15,21 @@ def list_tracks(db: Session = Depends(get_db)): @router.get("/{track_id}/tasks", response_model=list[TaskOut]) def mentee_specific_status(track_id: int, mentee_email: str, db: Session = Depends(get_db)): tasks = db.query(models.Task).filter_by(track_id=track_id).order_by(models.Task.task_no).all() + if not tasks: + raise HTTPException(status_code=404, detail='Track not found') mentee = crud.get_user_by_email(db, mentee_email) + if not mentee: + raise HTTPException(status_code=404, detail="Mentee not found") tasks_with_status=[] for task in tasks: submission_of_task = db.query(models.Submission).filter_by(task_id=task.id, mentee_id=mentee.id).first() if submission_of_task: status = submission_of_task.status - time_spent = crud.find_time_spent_on_task(submission_of_task.id) + time_spent = crud.find_time_spent_on_task(db, submission_of_task.id) else: status = "Not started" time_spent = 0 - progress_bar = (time_spent/task.deadline_days) * 100 + progress_bar = int((time_spent/task.deadline_days) * 100) tasks_with_status.append( { "task_no": task.task_no, @@ -35,7 +39,7 @@ def mentee_specific_status(track_id: int, mentee_email: str, db: Session = Depen "status": status, "progress_bar": progress_bar, "description": task.description, - "track": task.track.title + "track_id": task.track_id } ) return tasks_with_status \ No newline at end of file diff --git a/app/schemas/submission.py b/app/schemas/submission.py index fbc767a..34638f5 100644 --- a/app/schemas/submission.py +++ b/app/schemas/submission.py @@ -30,8 +30,6 @@ class SubmissionApproval(BaseModel): mentor_feedback: Optional[str] = None class PauseTask(BaseModel): - submission_id: int - pause_start: datetime task_no: int track_id: int mentee_email: str @@ -42,6 +40,6 @@ class TasksList(BaseModel): mentee_id: str class StartTask(BaseModel): - mentee_email: int + mentee_email: str task_no: int track_id: int \ No newline at end of file diff --git a/app/schemas/task.py b/app/schemas/task.py index 0a2de6b..4e0998d 100644 --- a/app/schemas/task.py +++ b/app/schemas/task.py @@ -8,13 +8,14 @@ class TaskBase(BaseModel): title: str description: Optional[str] = None points: int = 10 - deadline: Optional[datetime] = None + deadline: Optional[int] = None class TaskCreate(TaskBase): pass class TaskOut(TaskBase): - id: int + progress_bar: int + status: str class Config: orm_mode = True \ No newline at end of file From bdf05e916708c41e283bff0981c3ae95ee0cb861 Mon Sep 17 00:00:00 2001 From: Naveen Date: Wed, 4 Jun 2025 23:45:55 +0530 Subject: [PATCH 11/11] /review-task works --- app/db/crud.py | 26 ++++++++++++++++++----- app/routes/progress.py | 43 +++++++++++++++++++++++---------------- app/schemas/submission.py | 2 ++ 3 files changed, 48 insertions(+), 23 deletions(-) diff --git a/app/db/crud.py b/app/db/crud.py index a0ff29e..55d0aa5 100644 --- a/app/db/crud.py +++ b/app/db/crud.py @@ -31,15 +31,16 @@ def submit_task(db: Session, mentee_id: int, task_id: int, reference_link: str,s db.refresh(submission) return submission -def approve_submission(db: Session, submission_id: int, mentor_feedback: str, status: str): +def approve_submission(db: Session, submission_id: int, mentor_feedback: str, points_awarded: int): sub = db.query(models.Submission).filter_by(id=submission_id).first() if not sub: return None - sub.status = status sub.mentor_feedback = mentor_feedback - if status == "approved": - sub.approved_at = datetime.now() + sub.approved_at = datetime.now() + sub.points_awarded += points_awarded + sub.total_paused_time = (datetime.now() - sub.submitted_at).days + sub.status = "approved" db.commit() db.refresh(sub) @@ -127,4 +128,19 @@ def get_submissions(db: Session, email: str, track_id: Optional[int] = None): query = query.join(models.Task, models.Submission.task_id == models.Task.id) query = query.filter(models.Task.track_id == track_id) return query.all() - \ No newline at end of file + +def reject_submission(db: Session, submission_id: int, mentor_feedback: str): + sub = db.query(models.Submission).filter_by(id=submission_id).first() + if not sub: + return None + + sub.reference_link = None + sub.mentor_feedback = mentor_feedback + sub.total_paused_time = (datetime.now() - sub.submitted_at).days + sub.submitted_at = None + sub.status = "ongoing" + sub.start_date = None + + db.commit() + db.refresh(sub) + return sub \ No newline at end of file diff --git a/app/routes/progress.py b/app/routes/progress.py index 86559e8..dc0f6c6 100644 --- a/app/routes/progress.py +++ b/app/routes/progress.py @@ -28,7 +28,7 @@ def submit_task(data: SubmissionCreate, db: Session = Depends(get_db)): return submission -@router.patch("/approve-task", response_model=SubmissionOut) +@router.patch("/review-task", response_model=SubmissionOut) def approve_task(data: SubmissionApproval, db: Session = Depends(get_db)): # 1. Validate mentor mentor = crud.get_user_by_email(db, email=data.mentor_email) @@ -40,27 +40,34 @@ def approve_task(data: SubmissionApproval, db: Session = Depends(get_db)): if not sub: raise HTTPException(status_code=404, detail="Submission not found") task = db.query(models.Tasks).filter_by(id=sub.task_id).first() - points_storage = db.query(models.LeaderboardEntry).filter_by(track_id=sub.track_id, mentee_id=sub.mentee_id).first() - - # 3. Check if late and add points - if sub.total_paused_time > task.deadline_days: - points_storage.total_points += task.points/2 - else: - points_storage.total_points += task.points - db.commit() # 3. Confirm mentor is assigned to this mentee if not crud.is_mentor_of(db, mentor.id, sub.mentee_id): raise HTTPException(status_code=403, detail="Mentor not authorized for this mentee") - - # 4. Approve or pause - updated = crud.approve_submission( - db, - submission_id=sub.id, - mentor_feedback=data.mentor_feedback, - status=data.status # approved, ongoing - ) - return updated + + # 4. See if accepted or rejected + if data.accepted: + if data.points_awarded > task.points: + raise HTTPException(status_code=422, detail='Awarded points exceed maximum points of the task') + else: + crud.approve_submission( + db, + submission_id=sub.id, + mentor_feedback=data.mentor_feedback, + points_awarded=data.points_awarded + ) + else: + crud.reject_submission( + db, + submission_id=sub.id, + mentor_feedback=data.mentor_feedback, + ) + return SubmissionOut(mentee_id=sub.mentee_id, + task_id=sub.task_id, + reference_link=sub.reference_link or None, + status=sub.status, + submitted_at=sub.submitted_at or None + ) @router.post("/pause-task", response_model=PauseTask) def pause_task(data: PauseTask, db: Session = Depends(get_db)): diff --git a/app/schemas/submission.py b/app/schemas/submission.py index db8f58b..227d802 100644 --- a/app/schemas/submission.py +++ b/app/schemas/submission.py @@ -29,6 +29,8 @@ class SubmissionApproval(BaseModel): mentor_email: str status: str mentor_feedback: Optional[str] = None + accepted: bool + points_awarded: int class PauseTask(BaseModel): task_no: int