From 854aa6428eacbb6e38a4d384ba312e90bca2d8a5 Mon Sep 17 00:00:00 2001 From: Khushal Date: Sat, 12 Jul 2025 17:38:28 +0530 Subject: [PATCH 1/2] feat: allow late task submissions within 12-hour grace period and raise and raise a HTTPException if submission is more than 12 hours past deadline --- .env.sample | 2 +- .../eb395efd59b7_add_submitted_late.py | 32 +++++++++++++++++++ app/db/crud.py | 16 +++++++++- app/db/models.py | 3 +- app/routes/progress.py | 3 +- app/schemas/submission.py | 1 + docker-compose.yml | 2 ++ 7 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 alembic/versions/eb395efd59b7_add_submitted_late.py diff --git a/.env.sample b/.env.sample index 0572197..d04a7fe 100644 --- a/.env.sample +++ b/.env.sample @@ -1,3 +1,3 @@ AMMENTOR_DB_URL= SMTP_EMAIL= -SMTP_PASSWORD= +SMTP_PASSWORD= \ No newline at end of file diff --git a/alembic/versions/eb395efd59b7_add_submitted_late.py b/alembic/versions/eb395efd59b7_add_submitted_late.py new file mode 100644 index 0000000..7dc1b3b --- /dev/null +++ b/alembic/versions/eb395efd59b7_add_submitted_late.py @@ -0,0 +1,32 @@ +"""add submitted_late + +Revision ID: eb395efd59b7 +Revises: 786378e6e511 +Create Date: 2025-07-07 16:31:12.789234 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'eb395efd59b7' +down_revision: Union[str, None] = '786378e6e511' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/app/db/crud.py b/app/db/crud.py index f520c2f..0faee3d 100644 --- a/app/db/crud.py +++ b/app/db/crud.py @@ -2,7 +2,7 @@ from app.schemas.submission import SubmissionOut from sqlalchemy.orm import Session,joinedload from app.db import models -from datetime import datetime, date +from datetime import datetime, date, timedelta from sqlalchemy import func def get_user_by_email(db: Session, email: str): @@ -19,6 +19,19 @@ def submit_task(db: Session, mentee_id: int, task_id: int, reference_link: str, task = db.query(models.Task).filter(models.Task.id == task_id).first() if not task: raise Exception("Task not found") + + # convert start_date into a datetime object + start_date = datetime.combine(start_date, datetime.min.time()) + deadline = start_date + timedelta(days=task.deadline_days) + submitted_at = datetime.now() + + # Check if the submission is late + if deadline >= submitted_at: + submitted_late = False + elif deadline + timedelta(hours=12) >= submitted_at: + submitted_late = True + else: + return "late submission not allowed" submission = models.Submission( mentee_id=mentee_id, @@ -29,6 +42,7 @@ def submit_task(db: Session, mentee_id: int, task_id: int, reference_link: str, submitted_at=date.today(), status="submitted", start_date=start_date, + submitted_late=submitted_late ) db.add(submission) diff --git a/app/db/models.py b/app/db/models.py index a755358..9df17df 100644 --- a/app/db/models.py +++ b/app/db/models.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, UniqueConstraint +from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, UniqueConstraint, Boolean from sqlalchemy.orm import relationship from datetime import datetime from app.db.db import Base @@ -45,6 +45,7 @@ class Submission(Base): start_date = Column(DateTime, nullable=False) approved_at = Column(DateTime, nullable=True) mentor_feedback = Column(Text, nullable=True) + submitted_late = Column(Boolean, default=False) mentee = relationship("User") task = relationship("Task") diff --git a/app/routes/progress.py b/app/routes/progress.py index 0130b93..3f59c74 100644 --- a/app/routes/progress.py +++ b/app/routes/progress.py @@ -22,7 +22,8 @@ def submit_task(data: SubmissionCreate, db: Session = Depends(get_db)): submission = crud.submit_task(db, mentee_id=mentee.id, task_id=task.id, reference_link=data.reference_link, start_date=data.start_date) if not submission: raise HTTPException(status_code=400, detail="Task already submitted") - + if submission == "late submission not allowed": + raise HTTPException(status_code=400, detail="You cannot submit this task as the deadline has passed") return submission @router.patch("/approve-task", response_model=SubmissionOut) diff --git a/app/schemas/submission.py b/app/schemas/submission.py index 53f9472..48087f6 100644 --- a/app/schemas/submission.py +++ b/app/schemas/submission.py @@ -23,6 +23,7 @@ class SubmissionOut(BaseModel): approved_at: Optional[date] = None mentor_feedback: Optional[str] = None start_date: date + submitted_late: bool class Config: orm_mode = True diff --git a/docker-compose.yml b/docker-compose.yml index eee26ef..da66268 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,6 +11,8 @@ services: depends_on: - db command: uvicorn app.main:app --host 0.0.0.0 --port 8000 + volumes: + - ./alembic/versions:/app/alembic/versions db: image: postgres:14 From 89a1ece4a00192717d9bd6854fca5abf4ab3e2a6 Mon Sep 17 00:00:00 2001 From: Khushal Date: Thu, 17 Jul 2025 12:04:39 +0530 Subject: [PATCH 2/2] fix: remove grace submission period --- .../564b64825d51_remove_submitted_late.py | 28 +++++++++++++ app/db/crud.py | 41 ++++++++----------- app/db/models.py | 1 - app/schemas/submission.py | 1 - 4 files changed, 45 insertions(+), 26 deletions(-) create mode 100644 alembic/versions/564b64825d51_remove_submitted_late.py diff --git a/alembic/versions/564b64825d51_remove_submitted_late.py b/alembic/versions/564b64825d51_remove_submitted_late.py new file mode 100644 index 0000000..e6bc0eb --- /dev/null +++ b/alembic/versions/564b64825d51_remove_submitted_late.py @@ -0,0 +1,28 @@ +"""remove submitted_late + +Revision ID: 564b64825d51 +Revises: eb395efd59b7 +Create Date: 2025-07-15 10:31:44.975046 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '564b64825d51' +down_revision: Union[str, None] = 'eb395efd59b7' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + pass + + +def downgrade() -> None: + """Downgrade schema.""" + pass diff --git a/app/db/crud.py b/app/db/crud.py index 0faee3d..a04e09f 100644 --- a/app/db/crud.py +++ b/app/db/crud.py @@ -20,36 +20,29 @@ def submit_task(db: Session, mentee_id: int, task_id: int, reference_link: str, if not task: raise Exception("Task not found") - # convert start_date into a datetime object - start_date = datetime.combine(start_date, datetime.min.time()) + start_date = start_date + submitted_at = date.today() deadline = start_date + timedelta(days=task.deadline_days) - submitted_at = datetime.now() - # Check if the submission is late if deadline >= submitted_at: - submitted_late = False - elif deadline + timedelta(hours=12) >= submitted_at: - submitted_late = True + submission = models.Submission( + mentee_id=mentee_id, + task_id=task.id, + task_name=task.title, + task_no=task.task_no, + reference_link=reference_link, + submitted_at=date.today(), + status="submitted", + start_date=start_date, + ) + + db.add(submission) + db.commit() + db.refresh(submission) + return submission else: return "late submission not allowed" - submission = models.Submission( - mentee_id=mentee_id, - task_id=task.id, - task_name=task.title, - task_no=task.task_no, - reference_link=reference_link, - submitted_at=date.today(), - status="submitted", - start_date=start_date, - submitted_late=submitted_late - ) - - db.add(submission) - db.commit() - db.refresh(submission) - return submission - def approve_submission(db: Session, submission_id: int, mentor_feedback: str, status: str): sub = db.query(models.Submission).filter_by(id=submission_id).first() if not sub: diff --git a/app/db/models.py b/app/db/models.py index 9df17df..b1c8e31 100644 --- a/app/db/models.py +++ b/app/db/models.py @@ -45,7 +45,6 @@ class Submission(Base): start_date = Column(DateTime, nullable=False) approved_at = Column(DateTime, nullable=True) mentor_feedback = Column(Text, nullable=True) - submitted_late = Column(Boolean, default=False) mentee = relationship("User") task = relationship("Task") diff --git a/app/schemas/submission.py b/app/schemas/submission.py index 48087f6..53f9472 100644 --- a/app/schemas/submission.py +++ b/app/schemas/submission.py @@ -23,7 +23,6 @@ class SubmissionOut(BaseModel): approved_at: Optional[date] = None mentor_feedback: Optional[str] = None start_date: date - submitted_late: bool class Config: orm_mode = True