diff --git a/met-api/src/met_api/constants/user.py b/met-api/src/met_api/constants/user.py index 760192f72..219bcce3c 100644 --- a/met-api/src/met_api/constants/user.py +++ b/met-api/src/met_api/constants/user.py @@ -15,3 +15,4 @@ SYSTEM_USER = 1 +SYSTEM_REVIEWER = 'System' diff --git a/met-api/src/met_api/models/submission.py b/met-api/src/met_api/models/submission.py index 5ccfef073..1ae1fde29 100644 --- a/met-api/src/met_api/models/submission.py +++ b/met-api/src/met_api/models/submission.py @@ -3,14 +3,17 @@ Manages the Submission """ from __future__ import annotations + from datetime import datetime from typing import List + from sqlalchemy import ForeignKey from sqlalchemy.dialects import postgresql from met_api.constants.comment_status import Status -from met_api.models.survey import Survey +from met_api.constants.user import SYSTEM_REVIEWER from met_api.models.participant import Participant +from met_api.models.survey import Survey from met_api.schemas.submission import SubmissionSchema from .base_model import BaseModel @@ -63,7 +66,7 @@ def create(cls, submission: SubmissionSchema, session=None) -> Submission: const_review_date = None else: const_comment_status = Status.Approved.value - const_reviewed_by = 'System' + const_reviewed_by = SYSTEM_REVIEWER const_review_date = datetime.utcnow() new_submission = Submission( diff --git a/met-api/src/met_api/schemas/engagement.py b/met-api/src/met_api/schemas/engagement.py index 804d1e4f2..60f707c4c 100644 --- a/met-api/src/met_api/schemas/engagement.py +++ b/met-api/src/met_api/schemas/engagement.py @@ -7,11 +7,12 @@ from marshmallow import EXCLUDE, Schema, ValidationError, fields, validate, validates_schema -from met_api.constants.engagement_status import Status, SubmissionStatus from met_api.constants.comment_status import Status as CommentStatus +from met_api.constants.engagement_status import Status, SubmissionStatus +from met_api.schemas.engagement_status_block import EngagementStatusBlockSchema from met_api.schemas.engagement_survey import EngagementSurveySchema +from met_api.schemas.utils import count_comments_by_status from met_api.utils.datetime import local_datetime -from met_api.schemas.engagement_status_block import EngagementStatusBlockSchema from .engagement_status import EngagementStatusSchema @@ -61,18 +62,14 @@ def get_submissions_meta_data(self, obj): submissions = obj.surveys[0].submissions return { 'total': len(submissions), - 'pending': self._count_comments_by_status(submissions, CommentStatus.Pending.value), - 'approved': self._count_comments_by_status(submissions, CommentStatus.Approved.value), - 'rejected': self._count_comments_by_status(submissions, CommentStatus.Rejected.value), - 'needs_further_review': self._count_comments_by_status( + 'pending': count_comments_by_status(submissions, CommentStatus.Pending.value), + 'approved': count_comments_by_status(submissions, CommentStatus.Approved.value), + 'rejected': count_comments_by_status(submissions, CommentStatus.Rejected.value), + 'needs_further_review': count_comments_by_status( submissions, CommentStatus.Needs_further_review.value) } - def _count_comments_by_status(self, submissios, status): - return len([submission for submission in submissios - if submission.comment_status_id == status]) - def get_submission_status(self, obj): """Get the submission status of the engagement.""" if obj.status_id == Status.Draft.value or obj.status_id == Status.Scheduled.value: diff --git a/met-api/src/met_api/schemas/survey.py b/met-api/src/met_api/schemas/survey.py index 7d1a2ab18..9773dd9e6 100644 --- a/met-api/src/met_api/schemas/survey.py +++ b/met-api/src/met_api/schemas/survey.py @@ -4,8 +4,11 @@ """ from marshmallow import EXCLUDE, Schema, fields -from .engagement import EngagementSchema + from met_api.constants.comment_status import Status +from met_api.schemas.utils import count_comments_by_status + +from .engagement import EngagementSchema class SurveySchema(Schema): @@ -34,14 +37,10 @@ def get_comments_meta_data(self, obj): """Get the meta data of the comments made in the survey.""" return { 'total': len(obj.submissions), - 'pending': self._count_comments_by_status(obj.submissions, Status.Pending.value), - 'approved': self._count_comments_by_status(obj.submissions, Status.Approved.value), - 'rejected': self._count_comments_by_status(obj.submissions, Status.Rejected.value), - 'needs_further_review': self._count_comments_by_status( + 'pending': count_comments_by_status(obj.submissions, Status.Pending.value), + 'approved': count_comments_by_status(obj.submissions, Status.Approved.value), + 'rejected': count_comments_by_status(obj.submissions, Status.Rejected.value), + 'needs_further_review': count_comments_by_status( obj.submissions, Status.Needs_further_review.value) } - - def _count_comments_by_status(self, submissios, status): - return len([submission for submission in submissios - if submission.comment_status_id == status]) diff --git a/met-api/src/met_api/schemas/utils.py b/met-api/src/met_api/schemas/utils.py index a16e5562c..01361b3dd 100644 --- a/met-api/src/met_api/schemas/utils.py +++ b/met-api/src/met_api/schemas/utils.py @@ -20,6 +20,7 @@ from typing import Tuple from jsonschema import Draft7Validator, RefResolver, SchemaError, draft7_format_checker +from met_api.constants.user import SYSTEM_REVIEWER BASE_URI = 'https://met.gov.bc.ca/.well_known/schemas' @@ -115,3 +116,18 @@ def serialize(errors): for error in errors: error_message.append(error.message) return error_message + + +def count_comments_by_status(submissions, status): + """Count the comments by their status. + + :param submissions: List of submissions + :param status: Status of the comments + :return: Number of comments with the provided status + """ + return len([ + submission + for submission in submissions + if (submission.comment_status_id == status and + submission.reviewed_by != SYSTEM_REVIEWER) + ])