from auth.auth_view import RegisteredAuthorizedView from media_plan.schemas import ( MediaPlanDetailsResponseSchema, media_plan_details_response_schema, MediaPlanResponseSchema, media_plan_response_schema, create_update_media_plan_request_schema ) from flask_apispec import marshal_with, doc, use_kwargs from media_plan.services.media_plan_service import MediaPlanService from media_plan.validators import ProjectMediaPlanValidator @doc(tags=['MediaPlanDetails']) class MediaPlanDetailsView(RegisteredAuthorizedView): media_plan_service = MediaPlanService() validator = ProjectMediaPlanValidator() @doc(description='Retrieve media plan') @marshal_with(media_plan_details_response_schema, code=200, description='JSON with media plan.') @marshal_with(schema=None, code=401, description='User is not authenticated.') def get(self, project_id: int, media_plan_id: int): self.permissions.can_access_project(project_id) self.validator.validate_project_media_plan(project_id, media_plan_id) media_plan = self.media_plan_service.get_media_plan(media_plan_id) return MediaPlanDetailsResponseSchema(media_plan) @doc(description='Delete media plan') @marshal_with(media_plan_details_response_schema, code=204, description='Success media plan deletion.') @marshal_with(schema=None, code=401, description='User is not authenticated.') def delete(self, project_id: int, media_plan_id: int): self.permissions.can_update_media_plan(project_id) self.validator.validate_project_media_plan(project_id, media_plan_id) self.media_plan_service.delete_media_plan(project_id, media_plan_id) return self.no_content() @doc(description='Update media plan') @use_kwargs(create_update_media_plan_request_schema) @marshal_with(media_plan_response_schema, code=200, description='Media plan has been updated successfully.') @marshal_with(schema=None, code=401, description='User is not authenticated.') @marshal_with(schema=None, code=403, description='User does not have permission to update media plan.') @marshal_with(schema=None, code=404, description='Media plan is not found.') def put(self, params, project_id: int, media_plan_id: int): self.permissions.can_update_media_plan(project_id) self.validator.validate_project_media_plan(project_id, media_plan_id) self.validator.validate_name(project_id, params.name, media_plan_id) return self.media_plan_service.update_media_plan(project_id, media_plan_id, params) @doc(tags=['MediaPlan']) class MediaPlanView(RegisteredAuthorizedView): media_plan_service = MediaPlanService() validator = ProjectMediaPlanValidator() @doc(description='Retrieve project media plans') @marshal_with(media_plan_response_schema(many=True), code=200, description='List with media plans') @marshal_with(schema=None, code=401, description='User is not authenticated.') def get(self, project_id: int): self.permissions.can_access_project(project_id) media_plans = self.media_plan_service.get_media_plans_for_project(project_id) return [MediaPlanResponseSchema(plan) for plan in media_plans] @doc(description='Create media plan for project') @use_kwargs(create_update_media_plan_request_schema) @marshal_with(media_plan_response_schema, code=201, description='Media plan created') @marshal_with(schema=None, code=401, description='User is not authenticated.') @marshal_with(schema=None, code=403, description='Max number of media plans for project exceeded') def post(self, params, project_id: int): self.permissions.can_update_media_plan(project_id) self.validator.validate_name(project_id, params.name) return self.media_plan_service.create_media_plan(project_id, params)