diff --git a/src/backend/app/submissions/submission_crud.py b/src/backend/app/submissions/submission_crud.py index 4da26ee78e..5a50a9dc02 100644 --- a/src/backend/app/submissions/submission_crud.py +++ b/src/backend/app/submissions/submission_crud.py @@ -27,9 +27,11 @@ from collections import Counter from datetime import datetime, timedelta from io import BytesIO +from typing import Optional import sozipfile.sozipfile as zipfile from asgiref.sync import async_to_sync +from dateutil import parser from fastapi import HTTPException, Response from fastapi.responses import FileResponse from loguru import logger as log @@ -765,7 +767,15 @@ async def get_submissions_by_date( return response -async def get_submission_by_project(project_id: int, skip: 0, limit: 100, db: Session): +async def get_submission_by_project( + project_id: int, + skip: 0, + limit: 100, + db: Session, + submitted_by: Optional[str] = None, + review_state: Optional[str] = None, + submitted_date: Optional[str] = None, +): """Get submission by project. Retrieves a paginated list of submissions for a given project. @@ -775,6 +785,9 @@ async def get_submission_by_project(project_id: int, skip: 0, limit: 100, db: Se skip (int): The number of submissions to skip. limit (int): The maximum number of submissions to retrieve. db (Session): The database session. + submitted_by: username of submitter. + review_state: reviewState of the submission. + submitted_date: date of submissions. Returns: Tuple[int, List]: A tuple containing the total number of submissions and @@ -795,9 +808,25 @@ async def get_submission_by_project(project_id: int, skip: 0, limit: 100, db: Se with zipfile.ZipFile(file, "r") as zip_ref: with zip_ref.open("submissions.json") as file_in_zip: - content = file_in_zip.read() + content = json.loads(file_in_zip.read()) + if submitted_by: + content = [ + sub for sub in content if submitted_by.lower() in sub["username"].lower() + ] + if review_state: + content = [ + sub + for sub in content + if sub.get("__system", {}).get("reviewState") == review_state + ] + if submitted_date: + content = [ + sub + for sub in content + if parser.parse(sub.get("end")).date() + == parser.parse(submitted_date).date() + ] - content = json.loads(content) start_index = skip end_index = skip + limit paginated_content = content[start_index:end_index] @@ -805,7 +834,10 @@ async def get_submission_by_project(project_id: int, skip: 0, limit: 100, db: Se async def get_submission_by_task( - project: db_models.DbProject, task_id: int, filters: dict, db: Session + project: db_models.DbProject, + task_id: int, + filters: dict, + db: Session, ): """Get submissions and count by task. diff --git a/src/backend/app/submissions/submission_routes.py b/src/backend/app/submissions/submission_routes.py index cab6269590..637f27882b 100644 --- a/src/backend/app/submissions/submission_routes.py +++ b/src/backend/app/submissions/submission_routes.py @@ -382,6 +382,11 @@ async def submission_table( project_id: int, page: int = Query(1, ge=1), results_per_page: int = Query(13, le=100), + submitted_by: Optional[str] = None, + review_state: Optional[str] = None, + submitted_date: Optional[str] = Query( + None, title="Submitted Date", description="Date in format (e.g., 'YYYY-MM-DD')" + ), db: Session = Depends(database.get_db), current_user: AuthUser = Depends(mapper), ): @@ -396,7 +401,7 @@ async def submission_table( skip = (page - 1) * results_per_page limit = results_per_page count, data = await submission_crud.get_submission_by_project( - project_id, skip, limit, db + project_id, skip, limit, db, submitted_by, review_state, submitted_date ) background_task_id = await project_crud.insert_background_task_into_database( db, "sync_submission", project_id @@ -419,6 +424,11 @@ async def task_submissions( project: db_models.DbProject = Depends(project_deps.get_project_by_id), page: int = Query(1, ge=1), limit: int = Query(13, le=100), + submitted_by: Optional[str] = None, + review_state: Optional[str] = None, + submitted_date: Optional[str] = Query( + None, title="Submitted Date", description="Date in format (e.g., 'YYYY-MM-DD')" + ), db: Session = Depends(database.get_db), current_user: AuthUser = Depends(mapper), ): @@ -438,6 +448,24 @@ async def task_submissions( "$wkt": True, } + if submitted_date: + filters["$filter"] = ( + "__system/submissionDate ge {}T00:00:00+00:00 " + "and __system/submissionDate le {}T23:59:59.999+00:00" + ).format(submitted_date, submitted_date) + + if submitted_by: + if "$filter" in filters: + filters["$filter"] += f"and (username eq '{submitted_by}')" + else: + filters["$filter"] = f"username eq '{submitted_by}'" + + if review_state: + if "$filter" in filters: + filters["$filter"] += f" and (__system/reviewState eq '{review_state}')" + else: + filters["$filter"] = f"__system/reviewState eq '{review_state}'" + data, count = await submission_crud.get_submission_by_task( project, task_id, filters, db )