feat: воркер связывания placement и post

This commit is contained in:
Artem Tsyrulnikov
2025-12-15 19:32:49 +03:00
parent 71e5a38efc
commit fd51c9ad1f
5 changed files with 141 additions and 0 deletions

View File

@@ -28,6 +28,7 @@ from .creative.tg_create_creative_4 import tg_create_creative_4
from .creative.update_creative import update_creative
from .placement.create_placement import create_placement
from .placement.delete_placement import delete_placement
from .placement.fetch_placement_post_cycle import fetch_placement_post_cycle
from .placement.get_placement import get_placement
from .placement.get_placements import get_placements
from .placement.update_placement import update_placement
@@ -375,6 +376,7 @@ class Usecase:
create_placement = create_placement
update_placement = update_placement
delete_placement = delete_placement
fetch_placement_post_cycle = fetch_placement_post_cycle
handle_subscription = handle_subscription
handle_unsubscription = handle_unsubscription
get_views_history = get_views_history

View File

@@ -0,0 +1,53 @@
import logging
from typing import TYPE_CHECKING
from src import domain
if TYPE_CHECKING:
from .. import Usecase
log = logging.getLogger(__name__)
async def fetch_placement_post_cycle(self: 'Usecase', interval_seconds: int) -> None:
log.info('Starting fetch_placement_post_cycle')
# Получаем все placement без привязанного поста
placements_without_post = (
await domain.Placement.filter(
post_id__isnull=True,
)
.prefetch_related('placement_channel')
.all()
)
if not placements_without_post:
log.debug('No placements without posts found')
return
log.info(f'Found {len(placements_without_post)} placements without posts')
updated_count = 0
for placement in placements_without_post:
try:
matching_post = await domain.Post.filter(
channel_id=placement.placement_channel_id,
text__contains=placement.invite_link,
deleted_from_channel_at__isnull=True,
).first()
if matching_post:
placement.post = matching_post
await placement.save()
updated_count += 1
log.info(
f'Linked post {matching_post.id} (message_id={matching_post.message_id}) '
f'to placement {placement.id}'
)
except Exception as e:
log.exception(f'Error processing placement {placement.id}: {e}')
continue
log.info(f'Fetch placement post cycle completed. Updated {updated_count} placements')