feat: воркер связывания placement и post
This commit is contained in:
@@ -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
|
||||
|
||||
53
src/usecase/placement/fetch_placement_post_cycle.py
Normal file
53
src/usecase/placement/fetch_placement_post_cycle.py
Normal 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')
|
||||
Reference in New Issue
Block a user