From 22e9a8223d9c53fcac58ebba933e55994828f1a3 Mon Sep 17 00:00:00 2001 From: saravanpa-aot Date: Thu, 6 Feb 2025 00:26:59 -0800 Subject: [PATCH 1/3] Added more activity logs --- submit-api/docker-compose.yml | 33 ----------- .../src/submit_api/enums/activity_type.py | 6 +- .../services/activity_log_service.py | 5 +- submit-api/src/submit_api/services/package.py | 55 +++++++++++++++---- .../submit_api/services/submission_review.py | 39 +++++++++++++ 5 files changed, 90 insertions(+), 48 deletions(-) diff --git a/submit-api/docker-compose.yml b/submit-api/docker-compose.yml index f0df65ae..1bf8503f 100644 --- a/submit-api/docker-compose.yml +++ b/submit-api/docker-compose.yml @@ -13,39 +13,6 @@ services: - 54332:5432/tcp restart: unless-stopped - submit-api-db-test: - image: postgres - volumes: - - db-data:/var/lib/postgresql/data3 - environment: - - POSTGRES_USER=admin - - POSTGRES_PASSWORD:admin - - POSTGRES_HOST_AUTH_METHOD=trust - ports: - - 54333:5432/tcp - restart: unless-stopped - - keycloak: - image: quay.io/keycloak/keycloak:12.0.2 - ports: - - "8081:8081" - environment: - - KEYCLOAK_USER=admin - - KEYCLOAK_PASSWORD=admin - command: -b 0.0.0.0 -Djboss.http.port=8081 -Dkeycloak.migration.action=import -Dkeycloak.migration.provider=dir -Dkeycloak.migration.dir=/tmp/keycloak/test -Dkeycloak.migration.strategy=OVERWRITE_EXISTING - healthcheck: - test: - [ - "CMD", - "curl", - "--fail", - "http://localhost:8081/auth/realms/demo || exit 1", - ] - interval: 30s - timeout: 10s - retries: 10 - volumes: - - ./setup:/tmp/keycloak/test/ volumes: db-data: diff --git a/submit-api/src/submit_api/enums/activity_type.py b/submit-api/src/submit_api/enums/activity_type.py index 6322a435..e0666286 100644 --- a/submit-api/src/submit_api/enums/activity_type.py +++ b/submit-api/src/submit_api/enums/activity_type.py @@ -17,7 +17,7 @@ class ActivityTypeEnum(enum.Enum): class ActorTypeEnum(enum.Enum): """Enum for activity type statuses.""" - USER = 'USER' + ENTITY = 'ENTITY' STAFF = "STAFF" @@ -33,10 +33,10 @@ class ActivityActionType(enum.Enum): ORIGINAL_SUBMISSION = "Original Submission" START_CONSULTATION_CHECK = "Start Consultation Check" - UPDATED_SUBMISSION_UPDATE_REQUESTED = "Updated Submission (Update Requested)" + UPDATE_REQUESTED = "Update Requested" PASSED_CONSULTATION_CHECK = "Passed Consultation Check" FAILED_CONSULTATION_CHECK = "Failed Consultation Check" START_MP_REVIEW = "Start MP Review" MP_APPROVED = "MP Accepted/Approved/Satisfied" MP_REVIEW_REJECTED = "MP Review Rejected" - UPDATED_SUBMISSION_REVISION_REQUIRED = "Updated Submission (Revision Required)" + REVISION_REQUIRED = "Revision Required" diff --git a/submit-api/src/submit_api/services/activity_log_service.py b/submit-api/src/submit_api/services/activity_log_service.py index d5251c96..7e0b213d 100644 --- a/submit-api/src/submit_api/services/activity_log_service.py +++ b/submit-api/src/submit_api/services/activity_log_service.py @@ -11,6 +11,7 @@ from submit_api.enums.activity_type import ActivityTypeEnum, VisibilityTypeEnum, ActorTypeEnum from submit_api.models.activity_log import ActivityLog from submit_api.models.db import session_scope +from submit_api.utils.token_info import TokenInfo class ActivityLogService: @@ -20,7 +21,7 @@ class ActivityLogService: def log_activity( # pylint: disable=too-many-arguments entity_id: int, action: str, - actor_id: int, + actor_id: int = TokenInfo.get_id(), actor_type: str = ActorTypeEnum.STAFF.value, entity_type=ActivityTypeEnum.SUBMISSION.value, entity_version: int = 1, @@ -62,7 +63,7 @@ def get_activity_logs(entity_type: str, entity_id: int, for_staff: bool = True) query = ActivityLog.query.filter_by(entity_type=entity_type, entity_id=entity_id) if not for_staff: - query = query.filter(ActivityLog.visibility == "public") + query = query.filter(ActivityLog.visibility == VisibilityTypeEnum.PUBLIC.value) logs = query.order_by(ActivityLog.activity_at.desc()).all() return logs diff --git a/submit-api/src/submit_api/services/package.py b/submit-api/src/submit_api/services/package.py index 3dbbc120..ff14b6b9 100644 --- a/submit-api/src/submit_api/services/package.py +++ b/submit-api/src/submit_api/services/package.py @@ -4,7 +4,7 @@ from flask import current_app -from submit_api.enums.activity_type import ActorTypeEnum, ActivityActionType, VisibilityTypeEnum +from submit_api.enums.activity_type import ActorTypeEnum, ActivityActionType from submit_api.enums.item_status import ItemStatus from submit_api.exceptions import BadRequestError, ResourceNotFoundError from submit_api.models import Item as ItemModel, User @@ -312,18 +312,21 @@ def submit_package(cls, package_id): else: submitted_package: PackageModel = cls._submit_package(package, session) - ActivityLogService.log_activity( - entity_id=package.id, - action=ActivityActionType.ORIGINAL_SUBMISSION.value, - actor_id=TokenInfo.get_id(), - actor_type=ActorTypeEnum.USER.value, - entity_version=submitted_package.version_id, - visibility=VisibilityTypeEnum.PUBLIC.value, - session=session - ) + cls._log_activity_submission(package, submitted_package, session) return submitted_package + @staticmethod + def _log_activity_submission(package, submitted_package, session): + """Log activity for package submission.""" + ActivityLogService.log_activity( + entity_id=package.id, + action=ActivityActionType.ORIGINAL_SUBMISSION.value, + actor_type=ActorTypeEnum.ENTITY.value, + entity_version=submitted_package.version_id, + session=session + ) + @classmethod def _submit_package(cls, package, session): """Submit the package by updating its status and items.""" @@ -386,6 +389,17 @@ def start_mp_review_process(cls, package, package_id, session): PackageMetadataFields.REVIEW_START_DATE.value: item_data.get('review_start_date') } cls._update_package_metadata(session, package_id, new_metadata) + cls._log_activity_start_mp_review(package, session) + + @staticmethod + def _log_activity_start_mp_review(package, session): + """Log activity for starting management plan review.""" + ActivityLogService.log_activity( + entity_id=package.id, + action=ActivityActionType.START_MP_REVIEW.value, + entity_version=package.version_id, + session=session + ) @classmethod def start_cr_check(cls, package_id): @@ -403,10 +417,21 @@ def start_cr_check(cls, package_id): PackageMetadataFields.CONSULTATION_CHECK_START_DATE.value: item_data.get('review_start_date') } cls._update_package_metadata(session, package_id, new_metadata) + cls._log_activity_start_consultation_check(package, session) session.flush() session.commit() return package + @staticmethod + def _log_activity_start_consultation_check(package, session): + """Log activity for starting consultation check.""" + ActivityLogService.log_activity( + entity_id=package.id, + action=ActivityActionType.START_CONSULTATION_CHECK.value, + entity_version=package.version_id, + session=session + ) + @staticmethod def _unsupported_status(*args, **kwargs): """Handle unsupported status.""" @@ -447,6 +472,7 @@ def create_update_request(cls, package_id, request_data): """Create an update request for the package.""" package = cls._get_and_validate_package_for_update_request(package_id) cls._create_update_request(package, request_data) + cls._log_activity_update_request(package) cls._update_request_creation_email_queue(package.id) return package @@ -471,6 +497,15 @@ def _update_request_creation_email_queue(cls, package_id): ) email_queue.save() + @staticmethod + def _log_activity_update_request(package): + """Log activity for update request creation.""" + ActivityLogService.log_activity( + entity_id=package.id, + action=ActivityActionType.UPDATE_REQUESTED.value, + entity_version=package.version_id, + ) + @classmethod def _get_and_validate_package_for_update_request(cls, package_id): """Validate package status for update request.""" diff --git a/submit-api/src/submit_api/services/submission_review.py b/submit-api/src/submit_api/services/submission_review.py index 41fb63da..1a64c327 100644 --- a/submit-api/src/submit_api/services/submission_review.py +++ b/submit-api/src/submit_api/services/submission_review.py @@ -4,6 +4,7 @@ from flask import current_app +from submit_api.enums.activity_type import ActivityActionType from submit_api.enums.item_status import ItemStatus from submit_api.exceptions import UnprocessableEntityError, ResourceNotFoundError from submit_api.models import Item as ItemModel, PackageVersion, UpdateRequest @@ -18,6 +19,7 @@ from submit_api.models.submission_review_entry import SubmissionReviewEntryType from submit_api.models.update_request import UpdateRequestType from submit_api.schemas.submission import CreateSubmissionRequestSchema +from submit_api.services.activity_log_service import ActivityLogService from submit_api.services.package import PackageService from submit_api.services.submission import SubmissionService from submit_api.utils.token_info import TokenInfo @@ -169,6 +171,9 @@ def approve_submission(cls, item_id, session): approval_processor(item, session) cls._update_package_status(item.package_id, session) cls._update_item_submissions_status(SubmissionStatus.APPROVED, session, item=item) + if item.type.name == SubmissionItemType.MANAGEMENT_PLAN_FORM.value: + cls._log_activity_mp_review(item, session, approved=True) + current_app.logger.info(f"Submission item {item.id} approved.") return item @@ -188,6 +193,7 @@ def approve_consultation_record(cls, item, session): } session.add(item) session.add(package_metadata) + cls._log_activity_consultation_check(item, session, success=True) current_app.logger.info(f"Consultation record approved for item {item.id}.") current_app.logger.info(f"Starting MP review for package {item.package_id}.") @@ -196,6 +202,38 @@ def approve_consultation_record(cls, item, session): return item + @staticmethod + def _log_activity_consultation_check(item, session, success=True): + """Log activity for passing or failing the consultation check.""" + action_type = ( + ActivityActionType.PASSED_CONSULTATION_CHECK.value + if success else + ActivityActionType.FAILED_CONSULTATION_CHECK.value + ) + + ActivityLogService.log_activity( + entity_id=item.id, + action=action_type, + entity_version=item.package.version_id, + session=session + ) + + @staticmethod + def _log_activity_mp_review(item, session, approved=True): + """Log activity for approving or rejecting the Management Plan review.""" + action_type = ( + ActivityActionType.MP_APPROVED.value + if approved else + ActivityActionType.MP_REVIEW_REJECTED.value + ) + + ActivityLogService.log_activity( + entity_id=item.id, + action=action_type, + entity_version=item.package.version_id, + session=session + ) + @classmethod def reject_submission(cls, item_id, session): """Reject submission item.""" @@ -227,6 +265,7 @@ def reject_consultation_record(cls, item, session): cls._update_submissions_status(item, SubmissionStatus.REJECTED, session) update_request_data = cls._prepare_update_request_data(item) cls._create_update_request(update_request_data, session) + cls._log_activity_consultation_check(item, session, success=False) session.flush() return item From 94d474b84ad19ecc908ec469c13e72b40cadf0ce Mon Sep 17 00:00:00 2001 From: saravanpa-aot Date: Thu, 6 Feb 2025 00:27:54 -0800 Subject: [PATCH 2/3] Added more activity logs --- submit-api/docker-compose.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/submit-api/docker-compose.yml b/submit-api/docker-compose.yml index 1bf8503f..f0df65ae 100644 --- a/submit-api/docker-compose.yml +++ b/submit-api/docker-compose.yml @@ -13,6 +13,39 @@ services: - 54332:5432/tcp restart: unless-stopped + submit-api-db-test: + image: postgres + volumes: + - db-data:/var/lib/postgresql/data3 + environment: + - POSTGRES_USER=admin + - POSTGRES_PASSWORD:admin + - POSTGRES_HOST_AUTH_METHOD=trust + ports: + - 54333:5432/tcp + restart: unless-stopped + + keycloak: + image: quay.io/keycloak/keycloak:12.0.2 + ports: + - "8081:8081" + environment: + - KEYCLOAK_USER=admin + - KEYCLOAK_PASSWORD=admin + command: -b 0.0.0.0 -Djboss.http.port=8081 -Dkeycloak.migration.action=import -Dkeycloak.migration.provider=dir -Dkeycloak.migration.dir=/tmp/keycloak/test -Dkeycloak.migration.strategy=OVERWRITE_EXISTING + healthcheck: + test: + [ + "CMD", + "curl", + "--fail", + "http://localhost:8081/auth/realms/demo || exit 1", + ] + interval: 30s + timeout: 10s + retries: 10 + volumes: + - ./setup:/tmp/keycloak/test/ volumes: db-data: From 8b263b63a0cc6faeb7b2030a2bcd9e86c9fd9d46 Mon Sep 17 00:00:00 2001 From: saravanpa-aot Date: Thu, 6 Feb 2025 09:33:59 -0800 Subject: [PATCH 3/3] Remvoed the extra logging --- submit-api/src/submit_api/services/submission_review.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/submit-api/src/submit_api/services/submission_review.py b/submit-api/src/submit_api/services/submission_review.py index 1a64c327..4d87deb7 100644 --- a/submit-api/src/submit_api/services/submission_review.py +++ b/submit-api/src/submit_api/services/submission_review.py @@ -171,8 +171,6 @@ def approve_submission(cls, item_id, session): approval_processor(item, session) cls._update_package_status(item.package_id, session) cls._update_item_submissions_status(SubmissionStatus.APPROVED, session, item=item) - if item.type.name == SubmissionItemType.MANAGEMENT_PLAN_FORM.value: - cls._log_activity_mp_review(item, session, approved=True) current_app.logger.info(f"Submission item {item.id} approved.") return item