Coverage for middle_layer/review/application_layer/orm_repositories/conflict_declaration.py: 100.00%
39 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 import or_
19from sqlalchemy.orm import Session
21from common.application_layer.orm_repositories import add_entity, get_object_by_id, list_entities
22from propose.domain_layer.entities.proposal import Proposal
23from review.domain_layer.entities.conflict_declaration import ConflictDeclaration
24from review.domain_layer.entities.individual_science_review import IndividualScienceReview
25from review.domain_layer.entities.science_reviewer import ScienceReviewer
26from review.domain_layer.repositories.conflict_declaration import ConflictDeclarationRepository
29class ConflictDeclarationORMRepository(ConflictDeclarationRepository):
30 def __init__(self, session: Session) -> None:
31 self.session = session
33 def by_id(self, conflict_declaration_id: int) -> ConflictDeclaration:
34 return get_object_by_id(
35 self.session, conflict_declaration_id, ConflictDeclaration, ConflictDeclaration.conflict_declaration_id
36 )
38 def by_isr_id(self, isr_id: int) -> ConflictDeclaration | None:
39 return get_object_by_id(
40 self.session, isr_id, ConflictDeclaration, ConflictDeclaration.individual_science_review_id
41 )
43 def by_reviewer_id_and_proposal_id(self, reviewer_id: int, proposal_id: int) -> ConflictDeclaration | None:
44 return (
45 self.session.query(ConflictDeclaration)
46 .join(IndividualScienceReview)
47 .join(ScienceReviewer)
48 .filter(ScienceReviewer.science_reviewer_id == reviewer_id)
49 .join(Proposal)
50 .filter(Proposal.proposal_id == proposal_id)
51 .one_or_none()
52 )
54 def list_all(self) -> list[ConflictDeclaration]:
55 return list_entities(self.session, ConflictDeclaration, ConflictDeclaration.conflict_declaration_id)
57 def add(self, conflict_declaration: ConflictDeclaration) -> int:
58 add_entity(self.session, conflict_declaration)
59 return conflict_declaration.conflict_declaration_id
61 def update(self, conflict_declaration: ConflictDeclaration) -> None:
62 c = self.by_id(conflict_declaration.conflict_declaration_id)
63 c.individual_science_review_id = conflict_declaration.individual_science_review_id
64 c.conflict_state = conflict_declaration.conflict_state
65 c.reason = conflict_declaration.reason
66 self.session.flush()
68 def delete(self, conflict_declaration: ConflictDeclaration) -> None:
69 self.session.delete(conflict_declaration)
70 self.session.flush()
72 def list_by_proposal(self, proposal_id: int) -> list[ConflictDeclaration]:
73 return (
74 self.session.query(ConflictDeclaration)
75 .join(IndividualScienceReview)
76 .filter(IndividualScienceReview.proposal_id == proposal_id)
77 .order_by(ConflictDeclaration.conflict_declaration_id)
78 .all()
79 )
81 def list_by_proposal_with_state_unknown_or_available(self, proposal_id: int) -> list[ConflictDeclaration]:
82 return (
83 self.session.query(ConflictDeclaration)
84 .join(IndividualScienceReview)
85 .filter(IndividualScienceReview.proposal_id == proposal_id)
86 .filter(
87 or_(ConflictDeclaration.conflict_state == "Unknown", ConflictDeclaration.conflict_state == "Available")
88 )
89 .order_by(ConflictDeclaration.conflict_declaration_id)
90 .all()
91 )
93 def list_by_science_reviewer(self, science_reviewer_id: int) -> list[ConflictDeclaration]:
94 return list(
95 self.session.query(ConflictDeclaration)
96 .join(IndividualScienceReview)
97 .filter(IndividualScienceReview.science_reviewer_id == science_reviewer_id)
98 .order_by(ConflictDeclaration.conflict_declaration_id)
99 .all()
100 )
102 def list_by_solicitation(self, solicitation_id: int) -> list[ConflictDeclaration]:
103 return (
104 self.session.query(ConflictDeclaration)
105 .join(IndividualScienceReview)
106 .join(Proposal)
107 .filter(Proposal.solicitation_id == solicitation_id)
108 .order_by(ConflictDeclaration.conflict_declaration_id)
109 .all()
110 )