s3_url added
This commit is contained in:
@@ -5,6 +5,8 @@ from typing import Any
|
|||||||
from aiogram.types import (
|
from aiogram.types import (
|
||||||
InlineKeyboardButton,
|
InlineKeyboardButton,
|
||||||
InlineKeyboardMarkup,
|
InlineKeyboardMarkup,
|
||||||
|
InputMediaAudio,
|
||||||
|
InputMediaDocument,
|
||||||
InputMediaPhoto,
|
InputMediaPhoto,
|
||||||
InputMediaVideo,
|
InputMediaVideo,
|
||||||
)
|
)
|
||||||
@@ -122,7 +124,7 @@ class TelegramBot(TelegramBase, TelegramBotWriter):
|
|||||||
if not media_items:
|
if not media_items:
|
||||||
raise ValueError('No media items to send')
|
raise ValueError('No media items to send')
|
||||||
|
|
||||||
group: list[InputMediaPhoto | InputMediaVideo] = []
|
group: list[InputMediaAudio | InputMediaDocument | InputMediaPhoto | InputMediaVideo] = []
|
||||||
for index, item in enumerate(media_items):
|
for index, item in enumerate(media_items):
|
||||||
item_caption = caption if index == 0 else None
|
item_caption = caption if index == 0 else None
|
||||||
if item.media_type == 'photo':
|
if item.media_type == 'photo':
|
||||||
@@ -132,10 +134,9 @@ class TelegramBot(TelegramBase, TelegramBotWriter):
|
|||||||
else:
|
else:
|
||||||
raise ValueError(f'Unsupported media type for group: {item.media_type}')
|
raise ValueError(f'Unsupported media type for group: {item.media_type}')
|
||||||
|
|
||||||
# Type ignore: aiogram expects Union type but we only use Photo/Video
|
|
||||||
messages = await self.bot.send_media_group(
|
messages = await self.bot.send_media_group(
|
||||||
chat_id=chat_id, media=group, reply_to_message_id=reply_to_message_id
|
chat_id=chat_id, media=group, reply_to_message_id=reply_to_message_id
|
||||||
) # type: ignore[arg-type]
|
)
|
||||||
# Return message_id of first message (with caption)
|
# Return message_id of first message (with caption)
|
||||||
return messages[0].message_id
|
return messages[0].message_id
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import json
|
import json
|
||||||
|
import typing
|
||||||
|
|
||||||
from pydantic import BaseModel, field_validator
|
from pydantic import BaseModel, field_validator
|
||||||
from pydantic_settings import BaseSettings, SettingsConfigDict
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
||||||
@@ -24,7 +25,7 @@ class AppConfig(BaseModel):
|
|||||||
if isinstance(v, list):
|
if isinstance(v, list):
|
||||||
return v
|
return v
|
||||||
if isinstance(v, str):
|
if isinstance(v, str):
|
||||||
return json.loads(v)
|
return typing.cast(list[str], json.loads(v))
|
||||||
raise ValueError('ORIGINS must be a JSON array string')
|
raise ValueError('ORIGINS must be a JSON array string')
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ class CreativeMediaItem(pydantic.BaseModel):
|
|||||||
media_type: str
|
media_type: str
|
||||||
media_file_id: str
|
media_file_id: str
|
||||||
position: int
|
position: int
|
||||||
|
s3_url: str | None = None
|
||||||
|
|
||||||
|
|
||||||
class CreativeMediaInput(pydantic.BaseModel):
|
class CreativeMediaInput(pydantic.BaseModel):
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ async def _replace_media_items(
|
|||||||
media_type=media.media_type,
|
media_type=media.media_type,
|
||||||
media_file_id=media.media_file_id,
|
media_file_id=media.media_file_id,
|
||||||
position=media.position,
|
position=media.position,
|
||||||
|
s3_url=self.s3.public_url(media.media_s3_key) if media.media_s3_key else None,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return created
|
return created
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ async def get_creative(self: 'Usecase', input: dto.GetCreativeInput) -> dto.Crea
|
|||||||
media_type=item.media_type,
|
media_type=item.media_type,
|
||||||
media_file_id=item.media_file_id,
|
media_file_id=item.media_file_id,
|
||||||
position=item.position,
|
position=item.position,
|
||||||
|
s3_url=self.s3.public_url(item.media_s3_key) if item.media_s3_key else None,
|
||||||
)
|
)
|
||||||
for item in media_items
|
for item in media_items
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ async def get_creatives(self: 'Usecase', input: dto.GetCreativesInput) -> list[d
|
|||||||
media_type=item.media_type,
|
media_type=item.media_type,
|
||||||
media_file_id=item.media_file_id,
|
media_file_id=item.media_file_id,
|
||||||
position=item.position,
|
position=item.position,
|
||||||
|
s3_url=self.s3.public_url(item.media_s3_key) if item.media_s3_key else None,
|
||||||
)
|
)
|
||||||
for item in media_items
|
for item in media_items
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ from src import domain, dto
|
|||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .. import Usecase
|
from .. import Usecase
|
||||||
|
from .. import S3Storage
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -50,7 +51,7 @@ async def update_creative(
|
|||||||
await _replace_media_items(self, creative.id, workspace_id, media_items)
|
await _replace_media_items(self, creative.id, workspace_id, media_items)
|
||||||
|
|
||||||
placements_count = await self.database.count_placement_posts_by_creative(creative.id)
|
placements_count = await self.database.count_placement_posts_by_creative(creative.id)
|
||||||
creative_media = await _get_media_items(creative)
|
creative_media = await _get_media_items(creative, self.s3)
|
||||||
|
|
||||||
return dto.CreativeOutput(
|
return dto.CreativeOutput(
|
||||||
id=creative.id,
|
id=creative.id,
|
||||||
@@ -119,7 +120,7 @@ async def _replace_media_items(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def _get_media_items(creative: domain.Creative) -> list[dto.CreativeMediaItem]:
|
async def _get_media_items(creative: domain.Creative, s3_storage: S3Storage) -> list[dto.CreativeMediaItem]:
|
||||||
media_rel = creative.media_items
|
media_rel = creative.media_items
|
||||||
if hasattr(media_rel, 'all'):
|
if hasattr(media_rel, 'all'):
|
||||||
items = await media_rel.all().order_by('position')
|
items = await media_rel.all().order_by('position')
|
||||||
@@ -130,6 +131,7 @@ async def _get_media_items(creative: domain.Creative) -> list[dto.CreativeMediaI
|
|||||||
media_type=item.media_type,
|
media_type=item.media_type,
|
||||||
media_file_id=item.media_file_id,
|
media_file_id=item.media_file_id,
|
||||||
position=item.position,
|
position=item.position,
|
||||||
|
s3_url=s3_storage.public_url(item.media_s3_key) if item.media_s3_key else None,
|
||||||
)
|
)
|
||||||
for item in items
|
for item in items
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -185,6 +185,7 @@ async def build_placement_creative(
|
|||||||
media_type=item.media_type,
|
media_type=item.media_type,
|
||||||
media_file_id=item.media_file_id,
|
media_file_id=item.media_file_id,
|
||||||
position=item.position,
|
position=item.position,
|
||||||
|
s3_url=self.s3.public_url(item.media_s3_key) if item.media_s3_key else None,
|
||||||
)
|
)
|
||||||
for item in media_items
|
for item in media_items
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -388,9 +388,10 @@ type CreativeButton struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type CreativeMediaItem struct {
|
type CreativeMediaItem struct {
|
||||||
MediaType string `json:"media_type"`
|
MediaType string `json:"media_type"`
|
||||||
MediaFileID string `json:"media_file_id"`
|
MediaFileID string `json:"media_file_id"`
|
||||||
Position int `json:"position"`
|
Position int `json:"position"`
|
||||||
|
S3URL *string `json:"s3_url,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type CreativeMediaInput struct {
|
type CreativeMediaInput struct {
|
||||||
|
|||||||
Reference in New Issue
Block a user