Spaces:
Runtime error
Runtime error
| from fastapi import APIRouter, HTTPException, Query, Path | |
| from pydantic import BaseModel | |
| from typing import List, Optional | |
| from uuid import UUID | |
| from datetime import datetime | |
| from src.config import logger | |
| from src.services import ProposalAIAnalysisService | |
| from src.models import QueryType, CreateOrUpdateType, Category | |
| class ProposalAIAnalysis(BaseModel): | |
| id: UUID | |
| proposal_id: UUID | |
| ai_score: float | |
| created_at: datetime | |
| updated_at: datetime | |
| class ProposalStrength(BaseModel): | |
| id: UUID | |
| proposal_id: UUID | |
| strength_point: str | |
| category: Category | |
| created_at: datetime | |
| updated_at: datetime | |
| class ProposalWeakness(BaseModel): | |
| id: UUID | |
| proposal_id: UUID | |
| weakness_point: str | |
| category: Category | |
| created_at: datetime | |
| updated_at: datetime | |
| class ProposalRejectionReason(BaseModel): | |
| id: UUID | |
| proposal_id: UUID | |
| reason: str | |
| category: Category | |
| created_at: datetime | |
| updated_at: datetime | |
| class ProposalImprovement(BaseModel): | |
| id: UUID | |
| proposal_id: UUID | |
| improvement_point: str | |
| category: Category | |
| created_at: datetime | |
| updated_at: datetime | |
| class ProposalAllStrengthsResponse(BaseModel): | |
| status: str | |
| data: Optional[List[str]] | |
| class ProposalAllWeaknessesResponse(BaseModel): | |
| status: str | |
| data: Optional[List[str]] | |
| class ProposalAllRejectionReasonsResponse(BaseModel): | |
| status: str | |
| data: Optional[List[str]] | |
| class ProposalAllImprovementsResponse(BaseModel): | |
| status: str | |
| data: Optional[List[str]] | |
| class ProposalAIAnalysisResponse(BaseModel): | |
| status: str | |
| data: Optional[List[ProposalAIAnalysis]] | |
| class ProposalStrengthResponse(BaseModel): | |
| status: str | |
| data: Optional[List[ProposalStrength]] | |
| class ProposalWeaknessResponse(BaseModel): | |
| status: str | |
| data: Optional[List[ProposalWeakness]] | |
| class ProposalRejectionReasonResponse(BaseModel): | |
| status: str | |
| data: Optional[List[ProposalRejectionReason]] | |
| class ProposalImprovementResponse(BaseModel): | |
| status: str | |
| data: Optional[List[ProposalImprovement]] | |
| class Analysis(BaseModel): | |
| strengths: Optional[List[str]] = None | |
| weaknesses: Optional[List[str]] = None | |
| rejection_reasons: Optional[List[str]] = None | |
| improvements: Optional[List[str]] = None | |
| class ProposalCompleteAnalysis(BaseModel): | |
| ai_score: float | |
| technical: Optional[Analysis] = None | |
| management: Optional[Analysis] = None | |
| past_performance: Optional[Analysis] = None | |
| price: Optional[Analysis] = None | |
| class ProposalCompleteAnalysisResponse(BaseModel): | |
| status: str | |
| data: Optional[List[ProposalCompleteAnalysis]] | |
| class DeleteResponse(BaseModel): | |
| status: str | |
| class ProposalStrengthRequest(BaseModel): | |
| proposal_id: UUID | |
| strength_point: str | |
| category: Category | |
| class UpdateProposalStrengthRequest(BaseModel): | |
| proposal_id: Optional[UUID] = None | |
| strength_point: Optional[str] = None | |
| category: Optional[Category] = None | |
| class ProposalWeaknessRequest(BaseModel): | |
| proposal_id: UUID | |
| weakness_point: str | |
| category: Category | |
| class UpdateProposalWeaknessRequest(BaseModel): | |
| proposal_id: Optional[UUID] = None | |
| weakness_point: Optional[str] = None | |
| category: Optional[Category] = None | |
| class ProposalRejectionReasonRequest(BaseModel): | |
| proposal_id: UUID | |
| reason: str | |
| category: Category | |
| class UpdateProposalRejectionReasonRequest(BaseModel): | |
| proposal_id: Optional[UUID] = None | |
| reason: Optional[str] = None | |
| category: Optional[Category] = None | |
| class ProposalImprovementRequest(BaseModel): | |
| proposal_id: UUID | |
| improvement_point: str | |
| category: Category | |
| class UpdateProposalImprovementRequest(BaseModel): | |
| proposal_id: Optional[UUID] = None | |
| improvement_point: Optional[str] = None | |
| category: Optional[Category] = None | |
| class CreateAiAnalysisRequest(BaseModel): | |
| proposal_id: UUID | |
| ai_score: float | |
| class CreateAIAnalysisRequestByProposalId(BaseModel): | |
| ai_score: float | |
| class UpdateAiAnalysisRequest(BaseModel): | |
| proposal_id: Optional[UUID] = None | |
| ai_score: Optional[float] = None | |
| class UpdateAIAnalysisRequestByProposalId(BaseModel): | |
| ai_score: Optional[float] = None | |
| class CreateAllProposalStrengthsRequest(BaseModel): | |
| strength_point: List[str] | |
| category: Category | |
| class UpdateAllProposalStrengthsRequest(BaseModel): | |
| strength_point: Optional[List[str]] = None | |
| class CreateAllProposalWeaknessRequest(BaseModel): | |
| weakness_point: List[str] | |
| category: Category | |
| class CreateAllProposalRejectionReasonsRequest(BaseModel): | |
| reason: List[str] | |
| category: Category | |
| class CreateAllProposalImprovementsRequest(BaseModel): | |
| improvement_point: List[str] | |
| category: Category | |
| class CreateAllProposalAnalysisRequest(BaseModel): | |
| ai_score: float | |
| technical: Optional[Analysis] = None | |
| management: Optional[Analysis] = None | |
| past_performance: Optional[Analysis] = None | |
| price: Optional[Analysis] = None | |
| class UpdateAllProposalAnalysisRequest(BaseModel): | |
| ai_score: Optional[float] = None | |
| technical: Optional[Analysis] = None | |
| management: Optional[Analysis] = None | |
| past_performance: Optional[Analysis] = None | |
| price: Optional[Analysis] = None | |
| class ProposalAIController: | |
| def __init__(self): | |
| self.__service = ProposalAIAnalysisService | |
| self.router = APIRouter() | |
| # self.router.add_api_route( | |
| # "/proposal-strengths", | |
| # self.get_proposal_strengths, | |
| # methods=["GET"], | |
| # tags=["Proposal Strengths"], | |
| # response_model=ProposalStrengthResponse, | |
| # ) | |
| # self.router.add_api_route( | |
| # "/proposal-strengths/{id}", | |
| # self.get_proposal_strengths_by_id, | |
| # methods=["GET"], | |
| # tags=["Proposal Strengths by ID"], | |
| # response_model=ProposalStrengthResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/strengths", | |
| self.get_proposal_strengths_by_proposal_id, | |
| methods=["GET"], | |
| tags=["Proposal Strengths by Proposal ID"], | |
| response_model=ProposalAllStrengthsResponse, | |
| ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/strengths/{category}", | |
| self.get_proposal_strengths_by_proposal_and_category, | |
| methods=["GET"], | |
| tags=["Proposal Strengths by Proposal and Category"], | |
| response_model=ProposalAllStrengthsResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/rfps/{rfp_id}/proposals/{proposal_id}/strengths/{id}", | |
| # self.get_proposal_strengths_by_proposal_and_id, | |
| # methods=["GET"], | |
| # tags=["Proposal Strengths by Proposal and ID"], | |
| # response_model=ProposalStrengthResponse, | |
| # ) | |
| # self.router.add_api_route( | |
| # "/proposal-strengths", | |
| # self.create_proposal_strengths, | |
| # methods=["POST"], | |
| # tags=["Proposal Strengths"], | |
| # response_model=ProposalStrengthResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/strengths", | |
| self.create_all_proposal_strengths, | |
| methods=["POST"], | |
| tags=["Proposal Strengths by Proposal ID"], | |
| response_model=ProposalAllStrengthsResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/proposal-strengths/{id}", | |
| # self.update_proposal_strengths, | |
| # methods=["PUT"], | |
| # tags=["Proposal Strengths by ID"], | |
| # response_model=ProposalStrengthResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/strengths/{category}", | |
| self.update_all_proposal_strengths, | |
| methods=["PUT"], | |
| tags=["Proposal Strengths by Proposal and Category"], | |
| response_model=ProposalAllStrengthsResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/proposal-strengths/{id}", | |
| # self.delete_proposal_strength, | |
| # methods=["DELETE"], | |
| # tags=["Proposal Strengths by ID"], | |
| # response_model=DeleteResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/strengths", | |
| self.delete_all_proposal_strengths, | |
| methods=["DELETE"], | |
| tags=["Proposal Strengths by Proposal ID"], | |
| response_model=DeleteResponse, | |
| ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/strengths/{category}", | |
| self.delete_proposal_strengths_by_proposal_and_category, | |
| methods=["DELETE"], | |
| tags=["Proposal Strengths by Proposal and Category"], | |
| response_model=DeleteResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "rfps/{rfp_id}/proposals/{proposal_id}/strengths/{id}", | |
| # self.delete_proposal_strengths_by_proposal_and_id, | |
| # methods=["DELETE"], | |
| # tags=["Proposal Strengths by Proposal and ID"], | |
| # response_model=DeleteResponse, | |
| # ) | |
| # self.router.add_api_route( | |
| # "/proposal-weakness", | |
| # self.get_proposal_weakness, | |
| # methods=["GET"], | |
| # tags=["Proposal Weakness"], | |
| # response_model=ProposalWeaknessResponse, | |
| # ) | |
| # self.router.add_api_route( | |
| # "/proposal-weakness/{id}", | |
| # self.get_proposal_weakness_by_id, | |
| # methods=["GET"], | |
| # tags=["Proposal Weakness by ID"], | |
| # response_model=ProposalWeaknessResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/weakness", | |
| self.get_proposal_weakness_by_proposal_id, | |
| methods=["GET"], | |
| tags=["Proposal Weakness by Proposal ID"], | |
| response_model=ProposalAllWeaknessesResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/rfps/{rfp_id}/proposals/{proposal_id}/weakness/{id}", | |
| # self.get_proposal_weakness_by_proposal_and_id, | |
| # methods=["GET"], | |
| # tags=["Proposal Weakness by Proposal and ID"], | |
| # response_model=ProposalWeaknessResponse, | |
| # ) | |
| # self.router.add_api_route( | |
| # "/proposal-weakness", | |
| # self.create_proposal_weakness, | |
| # methods=["POST"], | |
| # tags=["Proposal Weakness"], | |
| # response_model=ProposalWeaknessResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/weakness", | |
| self.create_all_proposal_weakness, | |
| methods=["POST"], | |
| tags=["Proposal Weakness by Proposal ID"], | |
| response_model=ProposalAllWeaknessesResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/proposal-weakness/{id}", | |
| # self.update_proposal_weakness, | |
| # methods=["PUT"], | |
| # tags=["Proposal Weakness by ID"], | |
| # response_model=ProposalWeaknessResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/weakness", | |
| self.update_all_proposal_weakness, | |
| methods=["PUT"], | |
| tags=["Proposal Weakness by Proposal ID"], | |
| response_model=ProposalAllWeaknessesResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/proposal-weakness/{id}", | |
| # self.delete_proposal_weakness, | |
| # methods=["DELETE"], | |
| # tags=["Proposal Weakness by ID"], | |
| # response_model=DeleteResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/weakness", | |
| self.delete_all_proposal_weakness, | |
| methods=["DELETE"], | |
| tags=["Proposal Weakness by Proposal ID"], | |
| response_model=DeleteResponse, | |
| ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/weakness/{category}", | |
| self.delete_proposal_weakness_by_proposal_and_category, | |
| methods=["DELETE"], | |
| tags=["Proposal Weakness by Proposal and Category"], | |
| response_model=DeleteResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/rfps/{rfp_id}/proposals/{proposal_id}/weakness/{id}", | |
| # self.delete_proposal_weakness_by_proposal_and_id, | |
| # methods=["DELETE"], | |
| # tags=["Proposal Weakness by Proposal and ID"], | |
| # response_model=DeleteResponse, | |
| # ) | |
| # self.router.add_api_route( | |
| # "/proposal-rejections", | |
| # self.get_proposal_rejections, | |
| # methods=["GET"], | |
| # tags=["Proposal Rejections"], | |
| # response_model=ProposalRejectionReasonResponse, | |
| # ) | |
| # self.router.add_api_route( | |
| # "/proposal-rejections/{id}", | |
| # self.get_proposal_rejections_by_id, | |
| # methods=["GET"], | |
| # tags=["Proposal Rejections by ID"], | |
| # response_model=ProposalRejectionReasonResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/rejections", | |
| self.get_proposal_rejections_by_proposal_id, | |
| methods=["GET"], | |
| tags=["Proposal Rejections by Proposal ID"], | |
| response_model=ProposalAllRejectionReasonsResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/rfps/{rfp_id}/proposals/{proposal_id}/rejections/{id}", | |
| # self.get_proposal_rejections_by_proposal_and_id, | |
| # methods=["GET"], | |
| # tags=["Proposal Rejections by Proposal and ID"], | |
| # response_model=ProposalRejectionReasonResponse, | |
| # ) | |
| # self.router.add_api_route( | |
| # "/proposal-rejections", | |
| # self.create_proposal_rejections, | |
| # methods=["POST"], | |
| # tags=["Proposal Rejections"], | |
| # response_model=ProposalRejectionReasonResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/rejections", | |
| self.create_all_proposal_rejections, | |
| methods=["POST"], | |
| tags=["Proposal Rejections by Proposal ID"], | |
| response_model=ProposalAllRejectionReasonsResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/proposal-rejections/{id}", | |
| # self.update_proposal_rejections, | |
| # methods=["PUT"], | |
| # tags=["Proposal Rejections by ID"], | |
| # response_model=ProposalRejectionReasonResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/rejections", | |
| self.update_all_proposal_rejections, | |
| methods=["PUT"], | |
| tags=["Proposal Rejections by Proposal ID"], | |
| response_model=ProposalAllRejectionReasonsResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/proposal-rejections/{id}", | |
| # self.delete_proposal_rejections, | |
| # methods=["DELETE"], | |
| # tags=["Proposal Rejections by ID"], | |
| # response_model=DeleteResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/rejections", | |
| self.delete_all_proposal_rejections, | |
| methods=["DELETE"], | |
| tags=["Proposal Rejections by Proposal ID"], | |
| response_model=DeleteResponse, | |
| ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/rejections/{category}", | |
| self.delete_proposal_rejections_by_proposal_and_category, | |
| methods=["DELETE"], | |
| tags=["Proposal Rejections by Proposal and Category"], | |
| response_model=DeleteResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/rfps/{rfp_id}/proposals/{proposal_id}/proposal-rejections/{id}", | |
| # self.delete_proposal_rejections_by_proposal_and_id, | |
| # methods=["DELETE"], | |
| # tags=["Proposal Rejections by Proposal and ID"], | |
| # response_model=DeleteResponse, | |
| # ) | |
| # self.router.add_api_route( | |
| # "/proposal-improvements", | |
| # self.get_proposal_improvements, | |
| # methods=["GET"], | |
| # tags=["Proposal Improvements"], | |
| # response_model=ProposalImprovementResponse, | |
| # ) | |
| # self.router.add_api_route( | |
| # "/proposal-improvements/{id}", | |
| # self.get_proposal_improvements_by_id, | |
| # methods=["GET"], | |
| # tags=["Proposal Improvements by ID"], | |
| # response_model=ProposalImprovementResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/improvements", | |
| self.get_proposal_improvements_by_proposal_id, | |
| methods=["GET"], | |
| tags=["Proposal Improvements by Proposal ID"], | |
| response_model=ProposalAllImprovementsResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/proposals/{proposal_id}/proposal-improvements/{id}", | |
| # self.get_proposal_improvements_by_proposal_and_id, | |
| # methods=["GET"], | |
| # tags=["Proposal Improvements by Proposal and ID"], | |
| # response_model=ProposalImprovementResponse, | |
| # ) | |
| # self.router.add_api_route( | |
| # "/proposal-improvements", | |
| # self.create_proposal_improvements, | |
| # methods=["POST"], | |
| # tags=["Proposal Improvements"], | |
| # response_model=ProposalImprovementResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/improvements", | |
| self.create_all_proposal_improvements, | |
| methods=["POST"], | |
| tags=["Proposal Improvements by Proposal ID"], | |
| response_model=ProposalAllImprovementsResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/proposal-improvements/{id}", | |
| # self.update_proposal_improvements, | |
| # methods=["PUT"], | |
| # tags=["Proposal Improvements by ID"], | |
| # response_model=ProposalImprovementResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/improvements", | |
| self.update_all_proposal_improvements, | |
| methods=["PUT"], | |
| tags=["Proposal Improvements by Proposal ID"], | |
| response_model=ProposalAllImprovementsResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/proposal-improvements/{id}", | |
| # self.delete_proposal_improvements, | |
| # methods=["DELETE"], | |
| # tags=["Proposal Improvements by ID"], | |
| # response_model=DeleteResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/improvements", | |
| self.delete_all_proposal_improvements, | |
| methods=["DELETE"], | |
| tags=["Proposal Improvements by Proposal ID"], | |
| response_model=DeleteResponse, | |
| ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/improvements/{category}", | |
| self.delete_proposal_improvements_by_proposal_and_category, | |
| methods=["DELETE"], | |
| tags=["Proposal Improvements by Proposal and Category"], | |
| response_model=DeleteResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/proposals/{proposal_id}/proposal-improvements/{id}", | |
| # self.delete_proposal_improvements_by_proposal_and_id, | |
| # methods=["DELETE"], | |
| # tags=["Proposal Improvements by Proposal and ID"], | |
| # response_model=DeleteResponse, | |
| # ) | |
| # self.router.add_api_route( | |
| # "/proposal-ai-score", | |
| # self.get_proposal_ai_score, | |
| # methods=["GET"], | |
| # tags=["Proposal AI Score"], | |
| # response_model=ProposalAIAnalysisResponse, | |
| # ) | |
| # self.router.add_api_route( | |
| # "/proposal-ai-score/{id}", | |
| # self.get_proposal_ai_score_by_id, | |
| # methods=["GET"], | |
| # tags=["Proposal AI Score by ID"], | |
| # response_model=ProposalAIAnalysisResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/ai-score", | |
| self.get_proposal_ai_score_by_proposal_id, | |
| methods=["GET"], | |
| tags=["Proposal AI Score by Proposal ID"], | |
| response_model=ProposalAIAnalysisResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/proposals/{proposal_id}/proposal-ai-score/{id}", | |
| # self.get_proposal_ai_score_by_proposal_and_id, | |
| # methods=["GET"], | |
| # tags=["Proposal AI Score by Proposal and ID"], | |
| # response_model=ProposalAIAnalysisResponse, | |
| # ) | |
| # self.router.add_api_route( | |
| # "/proposal-ai-score", | |
| # self.create_proposal_ai_score, | |
| # methods=["POST"], | |
| # tags=["Proposal AI Score"], | |
| # response_model=ProposalAIAnalysisResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/ai-score", | |
| self.create_proposal_ai_score_by_proposal_id, | |
| methods=["POST"], | |
| tags=["Proposal AI Score by Proposal ID"], | |
| response_model=ProposalAIAnalysisResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/proposal-ai-score/{id}", | |
| # self.update_proposal_ai_score, | |
| # methods=["PUT"], | |
| # tags=["Proposal AI Score by ID"], | |
| # response_model=ProposalAIAnalysisResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/ai-score", | |
| self.update_proposal_ai_score_by_proposal_id, | |
| methods=["PUT"], | |
| tags=["Proposal AI Score by Proposal ID"], | |
| response_model=ProposalAIAnalysisResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/proposal-ai-score/{id}", | |
| # self.delete_proposal_ai_score, | |
| # methods=["DELETE"], | |
| # tags=["Proposal AI Score by ID"], | |
| # response_model=DeleteResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/ai-score", | |
| self.delete_proposal_ai_score_by_proposal_id, | |
| methods=["DELETE"], | |
| tags=["Proposal AI Score by Proposal ID"], | |
| response_model=DeleteResponse, | |
| ) | |
| # self.router.add_api_route( | |
| # "/proposals/{proposal_id}/proposal-ai-score/{id}", | |
| # self.delete_proposal_ai_score_by_proposal_and_id, | |
| # methods=["DELETE"], | |
| # tags=["Proposal AI Score by Proposal and ID"], | |
| # response_model=DeleteResponse, | |
| # ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/analysis", | |
| self.get_all_proposal_analysis, | |
| methods=["GET"], | |
| tags=["Proposal Complete Analysis"], | |
| response_model=ProposalCompleteAnalysisResponse, | |
| ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/analysis", | |
| self.create_proposal_analysis, | |
| methods=["POST"], | |
| tags=["Proposal Complete Analysis"], | |
| response_model=ProposalCompleteAnalysisResponse, | |
| ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/analysis", | |
| self.update_proposal_analysis, | |
| methods=["PUT"], | |
| tags=["Proposal Complete Analysis"], | |
| response_model=ProposalCompleteAnalysisResponse, | |
| ) | |
| self.router.add_api_route( | |
| "/rfps/{rfp_id}/proposals/{proposal_id}/analysis", | |
| self.delete_proposal_analysis, | |
| methods=["DELETE"], | |
| tags=["Proposal Complete Analysis"], | |
| response_model=DeleteResponse, | |
| ) | |
| async def get_proposal_strengths( | |
| self | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| strengths = await service.get_all_data( | |
| query_type=QueryType.STRENGTHS | |
| ) | |
| return ProposalStrengthResponse( | |
| status="success", data=[ProposalStrength(**s) for s in strengths] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve strengths." | |
| ) | |
| async def get_proposal_strengths_by_id(self, id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| strength = await service.get_all_data( | |
| query_type=QueryType.STRENGTHS, id=id | |
| ) | |
| return ProposalStrengthResponse( | |
| status="success", data=[ProposalStrength(**s) for s in strength] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve strength." | |
| ) | |
| async def get_proposal_strengths_by_proposal_id(self, rfp_id: UUID = Path(...), proposal_id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| strength = await service.get_all_data( | |
| query_type=QueryType.STRENGTHS, proposal_id=proposal_id | |
| ) | |
| return ProposalAllStrengthsResponse( | |
| status="success", data=[s["strength_point"] for s in strength] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve strength." | |
| ) | |
| async def get_proposal_strengths_by_proposal_and_category(self, rfp_id: UUID = Path(...), proposal_id: UUID = Path(...), category: Category = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| strength = await service.get_all_data( | |
| query_type=QueryType.STRENGTHS, proposal_id=proposal_id, category=category | |
| ) | |
| return ProposalAllStrengthsResponse( | |
| status="success", data=[s["strength_point"] for s in strength] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve strength." | |
| ) | |
| async def get_proposal_strengths_by_proposal_and_id(self, rfp_id: UUID = Path(...), proposal_id: UUID = Path(...), id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| strength = await service.get_all_data( | |
| query_type=QueryType.STRENGTHS, proposal_id=proposal_id, id=id | |
| ) | |
| return ProposalStrengthResponse( | |
| status="success", data=[ProposalStrength(**s) for s in strength] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve strength." | |
| ) | |
| async def create_proposal_strengths(self, strength: ProposalStrengthRequest): | |
| async with self.__service() as service: | |
| try: | |
| created = await service.create_data( | |
| query_type=QueryType.STRENGTHS, | |
| create_or_update_type=CreateOrUpdateType.ID, | |
| data=strength.model_dump(mode="json"), | |
| ) | |
| return ProposalStrengthResponse( | |
| status="success", data=[ProposalStrength(**s) for s in created] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to create strength." | |
| ) | |
| async def create_all_proposal_strengths( | |
| self, strengths: CreateAllProposalStrengthsRequest, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| strengths_request = strengths.model_dump(mode="json", exclude_unset=True) | |
| strengths_request["proposal_id"] = proposal_id | |
| created = await service.create_data( | |
| query_type=QueryType.STRENGTHS, | |
| create_or_update_type=CreateOrUpdateType.ALL, | |
| data=strengths_request, | |
| ) | |
| return ProposalAllStrengthsResponse( | |
| status="success", data=[s["strength_point"] for s in created] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to create strengths." | |
| ) | |
| async def update_proposal_strengths(self, strength: UpdateProposalStrengthRequest, id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| strength_request = strength.model_dump(mode="json", exclude_unset=True) | |
| strength_request["id"] = id | |
| updated = await service.update_data( | |
| query_type=QueryType.STRENGTHS, | |
| create_or_update_type=CreateOrUpdateType.ID, | |
| data=strength_request, | |
| ) | |
| return ProposalStrengthResponse( | |
| status="success", data=[ProposalStrength(**s) for s in updated] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to update strength." | |
| ) | |
| async def update_all_proposal_strengths( | |
| self, strengths: UpdateAllProposalStrengthsRequest, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...), category: Category = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| strengths_request = strengths.model_dump(mode="json", exclude_unset=True) | |
| strengths_request["proposal_id"] = proposal_id | |
| strengths_request["category"] = category | |
| updated = await service.update_data( | |
| query_type=QueryType.STRENGTHS, | |
| create_or_update_type=CreateOrUpdateType.ALL, | |
| data=strengths_request, | |
| ) | |
| return ProposalAllStrengthsResponse( | |
| status="success", data=[s["strength_point"] for s in updated] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to update strengths." | |
| ) | |
| async def delete_proposal_strength( | |
| self, id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.STRENGTHS, id=id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete strength." | |
| ) | |
| async def delete_all_proposal_strengths(self, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.STRENGTHS, proposal_id=proposal_id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete strengths." | |
| ) | |
| async def delete_proposal_strengths_by_proposal_and_category(self, proposal_id: UUID = Path(...), category: Category = Path(...), rfp_id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.STRENGTHS, proposal_id=proposal_id, category=category | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete strength." | |
| ) | |
| async def delete_proposal_strengths_by_proposal_and_id(self, proposal_id: UUID = Path(...), id: UUID = Path(...), rfp_id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.STRENGTHS, proposal_id=proposal_id, id=id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete strength." | |
| ) | |
| async def get_proposal_weakness( | |
| self | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| weaknesses = await service.get_all_data( | |
| query_type=QueryType.WEAKNESSES | |
| ) | |
| return ProposalWeaknessResponse( | |
| status="success", data=[ProposalWeakness(**w) for w in weaknesses] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve weaknesses." | |
| ) | |
| async def get_proposal_weakness_by_id(self, id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| weakness = await service.get_all_data( | |
| query_type=QueryType.WEAKNESSES, id=id | |
| ) | |
| return ProposalWeaknessResponse( | |
| status="success", data=[ProposalWeakness(**w) for w in weakness] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve weakness." | |
| ) | |
| async def get_proposal_weakness_by_proposal_id(self, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...), category: Category = Query(None)): | |
| async with self.__service() as service: | |
| try: | |
| weakness = await service.get_all_data( | |
| query_type=QueryType.WEAKNESSES, proposal_id=proposal_id, category=category | |
| ) | |
| return ProposalAllWeaknessesResponse( | |
| status="success", data=[w["weakness_point"] for w in weakness] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve weakness." | |
| ) | |
| async def get_proposal_weakness_by_proposal_and_id(self, proposal_id: UUID = Path(...), id: UUID = Path(...), rfp_id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| weakness = await service.get_all_data( | |
| query_type=QueryType.WEAKNESSES, proposal_id=proposal_id, id=id | |
| ) | |
| return ProposalWeaknessResponse( | |
| status="success", data=[ProposalWeakness(**w) for w in weakness] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve weakness." | |
| ) | |
| async def create_proposal_weakness(self, weakness: ProposalWeaknessRequest): | |
| async with self.__service() as service: | |
| try: | |
| created = await service.create_data( | |
| query_type=QueryType.WEAKNESSES, | |
| create_or_update_type=CreateOrUpdateType.ID, | |
| data=weakness.model_dump(mode="json"), | |
| ) | |
| return ProposalWeaknessResponse( | |
| status="success", data=[ProposalWeakness(**w) for w in created] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to create weakness." | |
| ) | |
| async def create_all_proposal_weakness( | |
| self, weaknesses: CreateAllProposalWeaknessRequest, proposal_id: UUID | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| weakness_request = weaknesses.model_dump(mode="json", exclude_unset=True) | |
| weakness_request["proposal_id"] = proposal_id | |
| created = await service.create_data( | |
| query_type=QueryType.WEAKNESSES, | |
| create_or_update_type=CreateOrUpdateType.ALL, | |
| data=weakness_request, | |
| ) | |
| return ProposalAllWeaknessesResponse( | |
| status="success", data=[w["weakness_point"] for w in created] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to create weaknesses." | |
| ) | |
| async def update_proposal_weakness(self, weakness: UpdateProposalWeaknessRequest, id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| weakness_request = weakness.model_dump(mode="json", exclude_unset=True) | |
| weakness_request["id"] = id | |
| updated = await service.update_data( | |
| query_type=QueryType.WEAKNESSES, | |
| create_or_update_type=CreateOrUpdateType.ID, | |
| data=weakness_request, | |
| ) | |
| return ProposalWeaknessResponse( | |
| status="success", data=[ProposalWeakness(**w) for w in updated] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to update weakness." | |
| ) | |
| async def update_all_proposal_weakness( | |
| self, weaknesses: CreateAllProposalWeaknessRequest, proposal_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| weakness_request = weaknesses.model_dump(mode="json", exclude_unset=True) | |
| weakness_request["proposal_id"] = proposal_id | |
| updated = await service.update_data( | |
| query_type=QueryType.WEAKNESSES, | |
| create_or_update_type=CreateOrUpdateType.ALL, | |
| data=weakness_request, | |
| ) | |
| return ProposalAllWeaknessesResponse( | |
| status="success", data=[w["weakness_point"] for w in updated] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to update weaknesses." | |
| ) | |
| async def delete_proposal_weakness( | |
| self, id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.WEAKNESSES, id=id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete weakness." | |
| ) | |
| async def delete_all_proposal_weakness( | |
| self, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.WEAKNESSES, proposal_id=proposal_id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete weaknesses." | |
| ) | |
| async def delete_proposal_weakness_by_proposal_and_category(self, proposal_id: UUID = Path(...), category: Category = Path(...), rfp_id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.WEAKNESSES, proposal_id=proposal_id, category=category | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete weakness." | |
| ) | |
| async def delete_proposal_weakness_by_proposal_and_id(self, proposal_id: UUID = Path(...), id: UUID = Path(...), rfp_id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.WEAKNESSES, proposal_id=proposal_id, id=id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete weakness." | |
| ) | |
| async def get_proposal_rejections( | |
| self | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| rejection_reasons = await service.get_all_data( | |
| query_type=QueryType.REJECTION_REASONS | |
| ) | |
| return ProposalRejectionReasonResponse( | |
| status="success", | |
| data=[ProposalRejectionReason(**r) for r in rejection_reasons], | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve rejection reasons." | |
| ) | |
| async def get_proposal_rejections_by_id(self, id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| rejection_reason = await service.get_all_data( | |
| query_type=QueryType.REJECTION_REASONS, id=id | |
| ) | |
| return ProposalRejectionReasonResponse( | |
| status="success", data=[ProposalRejectionReason(**r) for r in rejection_reason] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve rejection reason." | |
| ) | |
| async def get_proposal_rejections_by_proposal_id(self, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...), category: Category = Query(None)): | |
| async with self.__service() as service: | |
| try: | |
| rejection_reason = await service.get_all_data( | |
| query_type=QueryType.REJECTION_REASONS, proposal_id=proposal_id, category=category | |
| ) | |
| return ProposalAllRejectionReasonsResponse( | |
| status="success", data=[r["reason"] for r in rejection_reason] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve rejection reason." | |
| ) | |
| async def get_proposal_rejections_by_proposal_and_id(self, proposal_id: UUID = Path(...), id: UUID = Path(...), rfp_id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| rejection_reason = await service.get_all_data( | |
| query_type=QueryType.REJECTION_REASONS, proposal_id=proposal_id, id=id | |
| ) | |
| return ProposalRejectionReasonResponse( | |
| status="success", data=[ProposalRejectionReason(**r) for r in rejection_reason] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve rejection reason." | |
| ) | |
| async def create_proposal_rejections( | |
| self, rejection_reason: ProposalRejectionReasonRequest | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| created = await service.create_data( | |
| query_type=QueryType.REJECTION_REASONS, | |
| create_or_update_type=CreateOrUpdateType.ID, | |
| data=rejection_reason.model_dump(mode="json"), | |
| ) | |
| return ProposalRejectionReasonResponse( | |
| status="success", | |
| data=[ProposalRejectionReason(**r) for r in created], | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to create rejection reason." | |
| ) | |
| async def create_all_proposal_rejections( | |
| self, rejection_reasons: CreateAllProposalRejectionReasonsRequest, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| rejection_reasons_data = rejection_reasons.model_dump(mode="json", exclude_unset=True) | |
| rejection_reasons_data["proposal_id"] = proposal_id | |
| created = await service.create_data( | |
| query_type=QueryType.REJECTION_REASONS, | |
| create_or_update_type=CreateOrUpdateType.ALL, | |
| data=rejection_reasons_data, | |
| ) | |
| return ProposalAllRejectionReasonsResponse( | |
| status="success", | |
| data=[r["reason"] for r in created], | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to create rejection reasons." | |
| ) | |
| async def update_proposal_rejections( | |
| self, rejection_reason: UpdateProposalRejectionReasonRequest, id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| rejection_reason_data = rejection_reason.model_dump(mode="json", exclude_unset=True) | |
| rejection_reason_data["id"] = id | |
| updated = await service.update_data( | |
| query_type=QueryType.REJECTION_REASONS, | |
| create_or_update_type=CreateOrUpdateType.ID, | |
| data=rejection_reason_data, | |
| ) | |
| return ProposalRejectionReasonResponse( | |
| status="success", | |
| data=[ProposalRejectionReason(**r) for r in updated], | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to update rejection reason." | |
| ) | |
| async def update_all_proposal_rejections( | |
| self, rejection_reasons: CreateAllProposalRejectionReasonsRequest, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| rejection_reasons_data = rejection_reasons.model_dump(mode="json", exclude_unset=True) | |
| rejection_reasons_data["proposal_id"] = proposal_id | |
| updated = await service.update_data( | |
| query_type=QueryType.REJECTION_REASONS, | |
| create_or_update_type=CreateOrUpdateType.ALL, | |
| data=rejection_reasons_data, | |
| ) | |
| return ProposalAllRejectionReasonsResponse( | |
| status="success", | |
| data=[r["reason"] for r in updated], | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to update rejection reasons." | |
| ) | |
| async def delete_proposal_rejections( | |
| self, id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.REJECTION_REASONS, | |
| id=id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete rejection reason." | |
| ) | |
| async def delete_all_proposal_rejections( | |
| self, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.REJECTION_REASONS, | |
| proposal_id=proposal_id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete rejection reasons." | |
| ) | |
| async def delete_proposal_rejections_by_proposal_and_category( | |
| self, proposal_id: UUID = Path(...), category: str = Path(...), rfp_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.REJECTION_REASONS, | |
| category=category, | |
| proposal_id=proposal_id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete rejection reason." | |
| ) | |
| async def delete_proposal_rejections_by_proposal_and_id( | |
| self, proposal_id: UUID = Path(...), id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.REJECTION_REASONS, | |
| id=id, | |
| proposal_id=proposal_id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete rejection reason." | |
| ) | |
| async def get_proposal_improvements( | |
| self | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| improvements = await service.get_all_data( | |
| query_type=QueryType.IMPROVEMENTS | |
| ) | |
| return ProposalImprovementResponse( | |
| status="success", | |
| data=[ProposalImprovement(**r) for r in improvements], | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve improvements." | |
| ) | |
| async def get_proposal_improvements_by_id( | |
| self, id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| improvements = await service.get_all_data( | |
| query_type=QueryType.IMPROVEMENTS, | |
| id=id | |
| ) | |
| return ProposalImprovementResponse( | |
| status="success", | |
| data=[ProposalImprovement(**r) for r in improvements], | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve improvements." | |
| ) | |
| async def get_proposal_improvements_by_proposal_id( | |
| self, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...), category: Category = Query(None) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| improvements = await service.get_all_data( | |
| query_type=QueryType.IMPROVEMENTS, | |
| proposal_id=proposal_id, | |
| category=category | |
| ) | |
| return ProposalAllImprovementsResponse( | |
| status="success", | |
| data=[r["improvement_point"] for r in improvements], | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve improvements." | |
| ) | |
| async def get_proposal_improvements_by_proposal_and_id( | |
| self, proposal_id: UUID = Path(...), id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| improvements = await service.get_all_data( | |
| query_type=QueryType.IMPROVEMENTS, | |
| id=id, | |
| proposal_id=proposal_id | |
| ) | |
| return ProposalImprovementResponse( | |
| status="success", | |
| data=[ProposalImprovement(**r) for r in improvements], | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve improvements." | |
| ) | |
| async def create_proposal_improvements( | |
| self, improvement: ProposalImprovementRequest | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| created = await service.create_data( | |
| query_type=QueryType.IMPROVEMENTS, | |
| create_or_update_type=CreateOrUpdateType.ID, | |
| data=improvement.model_dump(mode="json"), | |
| ) | |
| return ProposalImprovementResponse( | |
| status="success", data=[ProposalImprovement(**r) for r in created] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to create improvement." | |
| ) | |
| async def create_all_proposal_improvements( | |
| self, improvements: CreateAllProposalImprovementsRequest, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| data = improvements.model_dump(mode="json", exclude_unset=True) | |
| data["proposal_id"] = proposal_id | |
| created = await service.create_data( | |
| query_type=QueryType.IMPROVEMENTS, | |
| create_or_update_type=CreateOrUpdateType.ALL, | |
| data=data, | |
| ) | |
| return ProposalAllImprovementsResponse( | |
| status="success", data=[r["improvement_point"] for r in created] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to create improvements." | |
| ) | |
| async def update_proposal_improvements( | |
| self, improvement: UpdateProposalImprovementRequest, id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| data = improvement.model_dump(mode="json", exclude_unset=True) | |
| data["id"] = id | |
| updated = await service.update_data( | |
| query_type=QueryType.IMPROVEMENTS, | |
| create_or_update_type=CreateOrUpdateType.ID, | |
| data=data, | |
| ) | |
| return ProposalImprovementResponse( | |
| status="success", data=[ProposalImprovement(**r) for r in updated] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to update improvement." | |
| ) | |
| async def update_all_proposal_improvements( | |
| self, improvements: CreateAllProposalImprovementsRequest, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| data = improvements.model_dump(mode="json", exclude_unset=True) | |
| data["proposal_id"] = proposal_id | |
| updated = await service.update_data( | |
| query_type=QueryType.IMPROVEMENTS, | |
| create_or_update_type=CreateOrUpdateType.ALL, | |
| data=data, | |
| ) | |
| return ProposalAllImprovementsResponse( | |
| status="success", data=[r["improvement_point"] for r in updated] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to update improvements." | |
| ) | |
| async def delete_proposal_improvements( | |
| self, id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.IMPROVEMENTS, id=id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete improvement." | |
| ) | |
| async def delete_all_proposal_improvements( | |
| self, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.IMPROVEMENTS, proposal_id=proposal_id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete improvements." | |
| ) | |
| async def delete_proposal_improvements_by_proposal_and_category( | |
| self, category: str = Path(...), proposal_id: UUID = Path(...), rfp_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.IMPROVEMENTS, category=category, proposal_id=proposal_id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete improvement." | |
| ) | |
| async def delete_proposal_improvements_by_proposal_and_id( | |
| self, id: UUID = Path(...), proposal_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.IMPROVEMENTS, id=id, proposal_id=proposal_id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete improvement." | |
| ) | |
| async def get_proposal_ai_score( | |
| self | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| scores = await service.get_all_data( | |
| query_type=QueryType.AI_SCORE | |
| ) | |
| return ProposalAIAnalysisResponse( | |
| status="success", data=[ProposalAIAnalysis(**r) for r in scores] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve AI scores." | |
| ) | |
| async def get_proposal_ai_score_by_id( | |
| self, id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| scores = await service.get_all_data( | |
| query_type=QueryType.AI_SCORE, id=id | |
| ) | |
| return ProposalAIAnalysisResponse( | |
| status="success", data=[ProposalAIAnalysis(**r) for r in scores] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve AI scores." | |
| ) | |
| async def get_proposal_ai_score_by_proposal_id( | |
| self, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| scores = await service.get_all_data( | |
| query_type=QueryType.AI_SCORE, proposal_id=proposal_id | |
| ) | |
| return ProposalAIAnalysisResponse( | |
| status="success", data=[ProposalAIAnalysis(**r) for r in scores] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve AI scores." | |
| ) | |
| async def get_proposal_ai_score_by_proposal_and_id( | |
| self, id: UUID = Path(...), proposal_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| scores = await service.get_all_data( | |
| query_type=QueryType.AI_SCORE, id=id, proposal_id=proposal_id | |
| ) | |
| return ProposalAIAnalysisResponse( | |
| status="success", data=[ProposalAIAnalysis(**r) for r in scores] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve AI scores." | |
| ) | |
| async def create_proposal_ai_score(self, score: CreateAiAnalysisRequest): | |
| async with self.__service() as service: | |
| try: | |
| created = await service.create_data( | |
| query_type=QueryType.AI_SCORE, | |
| create_or_update_type=CreateOrUpdateType.ID, | |
| data=score.model_dump(mode="json"), | |
| ) | |
| return ProposalAIAnalysisResponse( | |
| status="success", data=[ProposalAIAnalysis(**r) for r in created] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to create AI score." | |
| ) | |
| async def create_proposal_ai_score_by_proposal_id(self, score: CreateAIAnalysisRequestByProposalId, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| data = score.model_dump(mode="json", exclude_unset=True) | |
| data["proposal_id"] = proposal_id | |
| created = await service.create_data( | |
| query_type=QueryType.AI_SCORE, | |
| create_or_update_type=CreateOrUpdateType.ID, | |
| data=data, | |
| ) | |
| return ProposalAIAnalysisResponse( | |
| status="success", data=[ProposalAIAnalysis(**r) for r in created] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to create AI score." | |
| ) | |
| async def update_proposal_ai_score(self, score: UpdateAiAnalysisRequest, id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| if id: | |
| data = score.model_dump(mode="json", exclude_unset=True) | |
| data["id"] = id | |
| updated = await service.update_data( | |
| query_type=QueryType.AI_SCORE, | |
| create_or_update_type=CreateOrUpdateType.ID, | |
| data=data, | |
| ) | |
| return ProposalAIAnalysisResponse( | |
| status="success", data=[ProposalAIAnalysis(**r) for r in updated] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to update AI score." | |
| ) | |
| async def update_proposal_ai_score_by_proposal_id(self, score: UpdateAIAnalysisRequestByProposalId, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| data = score.model_dump(mode="json", exclude_unset=True) | |
| data["proposal_id"] = proposal_id | |
| updated = await service.update_data( | |
| query_type=QueryType.AI_SCORE, | |
| create_or_update_type=CreateOrUpdateType.ALL, | |
| data=data, | |
| ) | |
| return ProposalAIAnalysisResponse( | |
| status="success", data=[ProposalAIAnalysis(**r) for r in updated] | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to update AI score." | |
| ) | |
| async def delete_proposal_ai_score( | |
| self, id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.AI_SCORE, id=id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete AI score." | |
| ) | |
| async def delete_proposal_ai_score_by_proposal_id( | |
| self, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.AI_SCORE, proposal_id=proposal_id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete AI score." | |
| ) | |
| async def delete_proposal_ai_score_by_proposal_and_id( | |
| self, id: UUID = Path(...), proposal_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.AI_SCORE, id=id, proposal_id=proposal_id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete AI score." | |
| ) | |
| async def get_all_proposal_analysis(self, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| analysis = await service.get_all_data( | |
| query_type=QueryType.ALL, proposal_id=proposal_id | |
| ) | |
| return ProposalCompleteAnalysisResponse( | |
| status="success", | |
| data=[ProposalCompleteAnalysis(**analysis)], | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to retrieve analysis." | |
| ) | |
| async def create_proposal_analysis( | |
| self, analysis: CreateAllProposalAnalysisRequest, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| data = analysis.model_dump(mode="json", exclude_unset=True) | |
| data["proposal_id"] = proposal_id | |
| created = await service.create_data( | |
| query_type=QueryType.ALL, | |
| create_or_update_type=CreateOrUpdateType.ALL, | |
| data=data, | |
| ) | |
| return ProposalCompleteAnalysisResponse( | |
| status="success", | |
| data=[ProposalCompleteAnalysis(**created)], | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to create analysis." | |
| ) | |
| async def update_proposal_analysis( | |
| self, analysis: UpdateAllProposalAnalysisRequest, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...) | |
| ): | |
| async with self.__service() as service: | |
| try: | |
| data = analysis.model_dump(mode="json", exclude_unset=True) | |
| data["proposal_id"] = proposal_id | |
| updated = await service.update_data( | |
| query_type=QueryType.ALL, | |
| create_or_update_type=CreateOrUpdateType.ALL, | |
| data=data, | |
| ) | |
| return ProposalCompleteAnalysisResponse( | |
| status="success", | |
| data=[ProposalCompleteAnalysis(**updated)], | |
| ) | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to update analysis." | |
| ) | |
| async def delete_proposal_analysis(self, proposal_id: UUID = Path(...), rfp_id: UUID = Path(...)): | |
| async with self.__service() as service: | |
| try: | |
| result = await service.delete_data( | |
| query_type=QueryType.ALL, proposal_id=proposal_id | |
| ) | |
| return DeleteResponse(status="success") | |
| except Exception as e: | |
| logger.exception(e) | |
| raise HTTPException( | |
| status_code=500, detail="Failed to delete analysis." | |
| ) | |