from typing import List from auth.auth_view import RegisteredAuthorizedView from media_plan.schemas import ( ApproverUserResponseSchema, approver_user_response_schema, ApprovalRequestResponseSchema, approval_request_schema, approval_request_response_schema, submit_approval_schema, ) from media_plan.services.media_plan_service import MediaPlanService from flask_apispec import marshal_with, doc, use_kwargs from media_plan.validators import ProjectMediaPlanValidator @doc(tags=['ApproverUsers']) class ApproverUsersView(RegisteredAuthorizedView): media_plan_service = MediaPlanService() validator = ProjectMediaPlanValidator() @doc(description='Get all users that can be approvers for this project') @marshal_with(approver_user_response_schema(many=True), code=200, description='Users list returned') @marshal_with(schema=None, code=401, description='User is not authenticated') def get(self, project_id: int, media_plan_id: int) -> List[ApproverUserResponseSchema]: self.permissions.can_access_project(project_id) self.validator.validate_project_media_plan(project_id, media_plan_id) return self.media_plan_service.get_approver_users(media_plan_id) @doc(tags=['ApprovalRequest']) class ApprovalRequestView(RegisteredAuthorizedView): media_plan_service = MediaPlanService() validator = ProjectMediaPlanValidator() @doc(description='Create campaigns approval request, send email to user for approval') @use_kwargs(approval_request_schema) @marshal_with(schema=approval_request_response_schema, code=201, description="Approval request created") @marshal_with(schema=None, code=404, description='Reviewer not found') @marshal_with(schema=None, code=404, description='Project not found') @marshal_with(schema=None, code=401, description='User is not authenticated') def post(self, params, project_id: int, media_plan_id: int) -> ApprovalRequestResponseSchema: self.permissions.can_access_project(project_id) self.validator.validate_project_media_plan(project_id, media_plan_id) self.permissions.can_create_approval_request(media_plan_id, params) return self.media_plan_service.create_approval_request(media_plan_id, params) @doc(tags=['SubmitApproval']) class SubmitApprovalView(RegisteredAuthorizedView): media_plan_service = MediaPlanService() validator = ProjectMediaPlanValidator() @doc(description='Submit approval request') @use_kwargs(submit_approval_schema) @marshal_with(schema=None, code=204, description='Operation successful') @marshal_with(schema=None, code=400, description='No approval request for campaign') @marshal_with(schema=None, code=401, description='User is not authenticated') @marshal_with(schema=None, code=403, description='User is not an approver') @marshal_with(schema=None, code=404, description='Project not found') @marshal_with(schema=None, code=404, description='Campaign not found') def post(self, params, project_id: int, media_plan_id): self.permissions.can_access_project(project_id) self.validator.validate_project_media_plan(project_id, media_plan_id) self.permissions.can_submit_approval_request(media_plan_id) self.media_plan_service.submit_approval_request(media_plan_id, params) return self.no_content()