Coverage for middle_layer/review/application_layer/orm_repositories/osr_proposal_review.py: 100.00%
38 statements
« prev ^ index » next coverage.py v7.10.5, created at 2026-03-09 06:13 +0000
« prev ^ index » next coverage.py v7.10.5, created at 2026-03-09 06:13 +0000
1# Copyright 2024 Associated Universities, Inc.
2#
3# This file is part of Telescope Time Allocation Tools (TTAT).
4#
5# TTAT is free software: you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation, either version 3 of the License, or
8# any later version.
9#
10# TTAT is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with TTAT. If not, see <https://www.gnu.org/licenses/>.
17#
18from sqlalchemy.orm import Session
20from common.application_layer.orm_repositories import add_entity, get_object_by_id, list_entities
21from propose.domain_layer.entities.proposal import Proposal
22from review.domain_layer.entities.osr_proposal_review import OSRProposalReview
23from review.domain_layer.repositories.osr_proposal_review import OSRProposalReviewRepository
26class OSRProposalReviewORMRepository(OSRProposalReviewRepository):
27 def __init__(self, session: Session):
28 self.session = session
30 def by_id(self, proposal_id: int) -> OSRProposalReview:
31 return get_object_by_id(self.session, proposal_id, OSRProposalReview, OSRProposalReview.proposal_id)
33 def by_proposal_id(self, proposal_id: int) -> OSRProposalReview | None:
34 osr_proposal_review = (
35 self.session.query(OSRProposalReview)
36 .join(Proposal)
37 .filter(Proposal.proposal_id == proposal_id)
38 .one_or_none()
39 )
40 if osr_proposal_review is None:
41 # Raise a ValueError if no Proposal exists with the given proposal_id
42 # Otherwise, Proposal exists but there's no OSRProposalReview for it, so return None
43 get_object_by_id(self.session, proposal_id, Proposal, Proposal.proposal_id)
44 return osr_proposal_review
46 def list_all(self) -> list[OSRProposalReview]:
47 return list_entities(self.session, OSRProposalReview, OSRProposalReview.proposal_id)
49 def list_by_solicitation_id(self, solicitation_id: int) -> list[OSRProposalReview]:
50 return (
51 self.session.query(OSRProposalReview)
52 .join(Proposal)
53 .filter(Proposal.solicitation_id == solicitation_id)
54 .all()
55 )
57 def add(self, osr_proposal_review: OSRProposalReview) -> int:
58 add_entity(self.session, osr_proposal_review)
59 return osr_proposal_review.proposal_id
61 def update(self, osr_proposal_review: OSRProposalReview) -> None:
62 r = self.by_id(osr_proposal_review.proposal_id)
63 r.last_saved_by_user_id = osr_proposal_review.last_saved_by_user_id
64 r.proposal = osr_proposal_review.proposal
65 r.review_state = osr_proposal_review.review_state
66 r.external_science_review_comments = osr_proposal_review.external_science_review_comments
67 r.internal_science_review_comments = osr_proposal_review.internal_science_review_comments
68 r.external_technical_review_comments = osr_proposal_review.external_technical_review_comments
69 r.internal_technical_review_comments = osr_proposal_review.internal_technical_review_comments
70 r.external_data_management_review_comments = osr_proposal_review.external_data_management_review_comments
71 r.internal_data_management_review_comments = osr_proposal_review.internal_data_management_review_comments
72 r.scientific_merit_metric = osr_proposal_review.scientific_merit_metric
73 self.session.flush()
75 def delete(self, osr_proposal_review: OSRProposalReview) -> None:
76 self.session.delete(osr_proposal_review)
77 self.session.flush()