From 699a0b942de84d0bac71829cb068cc3f7498bd83 Mon Sep 17 00:00:00 2001 From: Nate Shim Date: Thu, 7 Mar 2024 07:08:08 -0800 Subject: [PATCH] [DEV-11438] Get reviews (#296) * get reviews * edits * update docstring --------- Co-authored-by: Nathanael Shim --- indico/queries/submission.py | 44 +++++++++++++++++++- indico/queries/workflow.py | 2 +- indico/types/submission.py | 25 +++++++++++ tests/integration/queries/test_submission.py | 14 ++++++- 4 files changed, 82 insertions(+), 3 deletions(-) diff --git a/indico/queries/submission.py b/indico/queries/submission.py index 832a3542..f2ef3172 100644 --- a/indico/queries/submission.py +++ b/indico/queries/submission.py @@ -8,7 +8,7 @@ from indico.errors import IndicoInputError, IndicoTimeoutError from indico.filters import SubmissionFilter from indico.queries import JobStatus -from indico.types import Job, Submission +from indico.types import Job, Submission, SubmissionReviewFull from indico.types.submission import VALID_SUBMISSION_STATUSES from indico.types.utils import Timer @@ -488,6 +488,48 @@ def process_response(self, response) -> Job: return Job(id=response["jobId"]) +class GetReviews(GraphQLRequest): + """ + Given a submission Id, return all the full Review objects back with changes + + Args: + submission_id (int): Id of submission to submit reviewEnabled for + Options: + + Returns: + A list of Review objects with changes + """ + + query = """ + query GetReview($submissionId: Int!) + { + submission(id: $submissionId) { + id + reviews { + id + submissionId + createdAt + createdBy + startedAt + completedAt + rejected + reviewType + notes + changes + } + } + } + """ + + def __init__(self, submission_id: int): + super().__init__(self.query, variables={"submissionId": submission_id}) + + def process_response(self, response) -> List[SubmissionReviewFull]: + return [ + SubmissionReviewFull(**review) for review in super().process_response(response)["submission"]["reviews"] + ] + + class RetrySubmission(GraphQLRequest): """ Given a list of submission ids, retry those failed submissions. diff --git a/indico/queries/workflow.py b/indico/queries/workflow.py index 29501380..6e698c70 100644 --- a/indico/queries/workflow.py +++ b/indico/queries/workflow.py @@ -571,4 +571,4 @@ def __init__(self, workflow_id: int): super().__init__(self.query, variables={"workflowId": workflow_id}) def process_response(self, response) -> bool: - return super().process_response(response)["deleteWorkflow"]["success"] + return super().process_response(response)["deleteWorkflow"]["success"] \ No newline at end of file diff --git a/indico/types/submission.py b/indico/types/submission.py index 8bbd4816..22a26da1 100644 --- a/indico/types/submission.py +++ b/indico/types/submission.py @@ -65,6 +65,31 @@ class SubmissionReview(BaseType): review_type: str notes: str +class SubmissionReviewFull(BaseType): + f""" + Information about a submission's Reviews. Includes changes + + Attributes: + id (int): The ID of the review. + submission_id (int): The ID of the submission that is being reviewed. + created_at (str): Timestamp of when the document was checked out + created_by (int): The ID of the User who submitted the review. + completed_at (str): Timestamp of when the review was submitted. + rejected (bool): Whether a submission has been rejected. + review_type (str): Type of review. One of {VALID_REVIEW_TYPES} + notes (str): Rejection reasons provided by user. + changes (dict): Changes for this review. + """ + id: int + submission_id: int + created_at: str + created_by: int + completed_at: str + rejected: bool + review_type: str + notes: str + changes: dict + class Submission(BaseType): f""" diff --git a/tests/integration/queries/test_submission.py b/tests/integration/queries/test_submission.py index b2f0499e..d62dd2e5 100644 --- a/tests/integration/queries/test_submission.py +++ b/tests/integration/queries/test_submission.py @@ -3,7 +3,8 @@ from indico.client import IndicoClient, IndicoConfig from indico.filters import DateRangeFilter, SubmissionFilter, SubmissionReviewFilter -from indico.queries import ListSubmissions +from indico.queries import ListSubmissions, GetReviews +from indico.types import SubmissionReviewFull def test_list_submissions(indico): @@ -64,3 +65,14 @@ def test_list_submissions_filter_created_at(indico): assert len(subs) > 0 subs = client.call(ListSubmissions(filters=SubmissionFilter(updated_at=date_filter), limit=10)) assert len(subs) > 0 + + +def test_get_reviews(indico): + client = IndicoClient() + + subs = client.call(ListSubmissions(limit=10)) + assert len(subs) > 0 + for sub in subs: + reviews = client.call(GetReviews(sub.id)) + for review in reviews: + assert (isinstance(review, SubmissionReviewFull)) \ No newline at end of file