import logging import uuid from typing import TYPE_CHECKING from src import domain, dto if TYPE_CHECKING: from .. import Usecase log = logging.getLogger(__name__) async def update_placement( self: 'Usecase', placement_id: uuid.UUID, input: dto.UpdatePlacementInput, user_id: uuid.UUID, workspace_id: uuid.UUID, ) -> dto.PlacementOutput: context = await self.ensure_workspace_permission(workspace_id, user_id, domain.PermissionKey.PLACEMENTS_WRITE) placement = await self.database.get_placement(workspace_id, placement_id) if not placement: log.warning('Placement %s not found for user %s', placement_id, user_id) raise domain.PlacementNotFound(placement_id) context.ensure_project_permission(domain.PermissionKey.PLACEMENTS_WRITE, placement.project_id) if input.placement_date is not None: placement.wanted_placement_date = input.placement_date if input.cost is not None: placement.cost = input.cost if input.comment is not None: placement.comment = input.comment if input.status is not None: placement.status = input.status await self.database.update_placement(placement) ad_post_url = placement.post.url if placement.post else None subscriptions_count = await self.database.count_subscriptions_by_placement(placement.id) return dto.PlacementOutput( id=placement.id, project_id=placement.project_id, project_channel_title=placement.project.channel.title, placement_channel_id=placement.placement_channel_id, placement_channel_title=placement.placement_channel.title, creative_id=placement.creative_id, creative_name=placement.creative.name, placement_date=placement.wanted_placement_date, cost=placement.cost, comment=placement.comment, ad_post_url=ad_post_url, invite_link_type=placement.project.purchase_invite_type_default, invite_link=placement.invite_link, status=placement.status, subscriptions_count=subscriptions_count, created_at=placement.created_at, )