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

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 

19 

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 

24 

25 

26class OSRProposalReviewORMRepository(OSRProposalReviewRepository): 

27 def __init__(self, session: Session): 

28 self.session = session 

29 

30 def by_id(self, proposal_id: int) -> OSRProposalReview: 

31 return get_object_by_id(self.session, proposal_id, OSRProposalReview, OSRProposalReview.proposal_id) 

32 

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 

45 

46 def list_all(self) -> list[OSRProposalReview]: 

47 return list_entities(self.session, OSRProposalReview, OSRProposalReview.proposal_id) 

48 

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 ) 

56 

57 def add(self, osr_proposal_review: OSRProposalReview) -> int: 

58 add_entity(self.session, osr_proposal_review) 

59 return osr_proposal_review.proposal_id 

60 

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() 

74 

75 def delete(self, osr_proposal_review: OSRProposalReview) -> None: 

76 self.session.delete(osr_proposal_review) 

77 self.session.flush()