feat: Enhance data models and sorting logic for investors and projects
This commit is contained in:
+45
-5
@@ -24,19 +24,29 @@ router = APIRouter(tags=["Project Routes"])
|
||||
def read_projects(
|
||||
page: int = Query(1, ge=1, description="Page number (starts at 1)"),
|
||||
page_size: int = Query(10, ge=1, le=100, description="Items per page (max 100)"),
|
||||
include_archived: bool = Query(False, description="Include archived projects"),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
"""Get all projects with their related data (paginated)"""
|
||||
"""Get all projects with their related data (paginated)
|
||||
|
||||
By default, archived projects are excluded. Set include_archived=True to include them.
|
||||
"""
|
||||
# Calculate offset
|
||||
offset = (page - 1) * page_size
|
||||
|
||||
# Start with base query
|
||||
query = db.query(ProjectTable)
|
||||
|
||||
# Filter out archived projects by default
|
||||
if not include_archived:
|
||||
query = query.filter(ProjectTable.is_archived == 0)
|
||||
|
||||
# Get total count
|
||||
total_count = db.query(ProjectTable).count()
|
||||
total_count = query.count()
|
||||
|
||||
# Get paginated results
|
||||
projects = (
|
||||
db.query(ProjectTable)
|
||||
.options(
|
||||
query.options(
|
||||
selectinload(ProjectTable.sector),
|
||||
selectinload(ProjectTable.investors),
|
||||
selectinload(ProjectTable.companies),
|
||||
@@ -162,7 +172,7 @@ def update_project(
|
||||
|
||||
@router.delete("/projects/{project_id}")
|
||||
def delete_project(project_id: int, db: Session = Depends(get_db)):
|
||||
"""Delete a project"""
|
||||
"""Delete a project permanently"""
|
||||
db_project = db.query(ProjectTable).filter(ProjectTable.id == project_id).first()
|
||||
|
||||
if not db_project:
|
||||
@@ -174,6 +184,36 @@ def delete_project(project_id: int, db: Session = Depends(get_db)):
|
||||
return {"message": "Project deleted successfully"}
|
||||
|
||||
|
||||
@router.post("/projects/{project_id}/archive")
|
||||
def archive_project(project_id: int, db: Session = Depends(get_db)):
|
||||
"""Archive a project (soft delete)"""
|
||||
db_project = db.query(ProjectTable).filter(ProjectTable.id == project_id).first()
|
||||
|
||||
if not db_project:
|
||||
raise HTTPException(status_code=404, detail="Project not found")
|
||||
|
||||
db_project.is_archived = 1
|
||||
db.commit()
|
||||
db.refresh(db_project)
|
||||
|
||||
return {"message": "Project archived successfully", "project_id": project_id}
|
||||
|
||||
|
||||
@router.post("/projects/{project_id}/unarchive")
|
||||
def unarchive_project(project_id: int, db: Session = Depends(get_db)):
|
||||
"""Unarchive a project (restore from archive)"""
|
||||
db_project = db.query(ProjectTable).filter(ProjectTable.id == project_id).first()
|
||||
|
||||
if not db_project:
|
||||
raise HTTPException(status_code=404, detail="Project not found")
|
||||
|
||||
db_project.is_archived = 0
|
||||
db.commit()
|
||||
db.refresh(db_project)
|
||||
|
||||
return {"message": "Project unarchived successfully", "project_id": project_id}
|
||||
|
||||
|
||||
@router.get("/projects/filter", response_model=PaginatedResponse[ProjectData])
|
||||
def filter_projects(
|
||||
stage: Optional[InvestmentStage] = Query(
|
||||
|
||||
Reference in New Issue
Block a user