fix
This commit is contained in:
@@ -1,7 +1,9 @@
|
|||||||
import datetime
|
|
||||||
import logging
|
import logging
|
||||||
|
import uuid
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
from tortoise import timezone
|
||||||
|
|
||||||
from src import domain, dto
|
from src import domain, dto
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
@@ -122,6 +124,35 @@ async def get_placements_analytics(
|
|||||||
else {}
|
else {}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Collect (channel_id, message_id) pairs for batch next post lookup
|
||||||
|
channel_message_pairs = [
|
||||||
|
(pp.post.channel_id, pp.post.message_id)
|
||||||
|
for p in placements
|
||||||
|
for pp in p.placement_posts
|
||||||
|
if pp.post and pp.post.published_at
|
||||||
|
]
|
||||||
|
next_posts_map = (
|
||||||
|
await self.database.get_next_posts_after_batch(channel_message_pairs)
|
||||||
|
if channel_message_pairs
|
||||||
|
else {}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Calculate time_on_top for each placement_post
|
||||||
|
time_on_top_map: dict[uuid.UUID, int] = {}
|
||||||
|
now = timezone.now()
|
||||||
|
for placement in placements:
|
||||||
|
for pp in placement.placement_posts:
|
||||||
|
post = pp.post
|
||||||
|
if not post or not post.published_at:
|
||||||
|
continue
|
||||||
|
published_at = post.published_at
|
||||||
|
key = (post.channel_id, post.message_id)
|
||||||
|
next_post = next_posts_map.get(key)
|
||||||
|
if next_post and next_post.published_at:
|
||||||
|
time_on_top_map[pp.id] = int((next_post.published_at - published_at).total_seconds())
|
||||||
|
else:
|
||||||
|
time_on_top_map[pp.id] = int((now - published_at).total_seconds())
|
||||||
|
|
||||||
results: list[dto.PlacementAnalyticsOutput] = []
|
results: list[dto.PlacementAnalyticsOutput] = []
|
||||||
for placement in placements:
|
for placement in placements:
|
||||||
placement_post = placement.placement_posts[0] if placement.placement_posts else None
|
placement_post = placement.placement_posts[0] if placement.placement_posts else None
|
||||||
@@ -200,7 +231,7 @@ async def get_placements_analytics(
|
|||||||
views_count=views_count,
|
views_count=views_count,
|
||||||
cpf=cpf_value,
|
cpf=cpf_value,
|
||||||
cpm=cpm_value,
|
cpm=cpm_value,
|
||||||
time_on_top=placement_post.time_on_top if placement_post else None,
|
time_on_top=time_on_top_map.get(placement_post.id) if placement_post else None,
|
||||||
time_in_feed=None,
|
time_in_feed=None,
|
||||||
invite_link=placement.invite_link,
|
invite_link=placement.invite_link,
|
||||||
invite_link_created_at=placement.invite_link_created_at,
|
invite_link_created_at=placement.invite_link_created_at,
|
||||||
|
|||||||
Reference in New Issue
Block a user