Source code for services.posts.media
from typing import Any, Dict, List
from django.conf import settings
from django.db.models import F
from apps.posts.constants import ContentTypeChoices
from apps.posts.models import Post, PostMedia
from tasks.posts import compress_image, send_video_service
[docs]
class PostMediaService:
"""Post Media Service"""
[docs]
@classmethod
def create(cls, post: Post, media_list: List):
"""
Method for create media
:param post: Post object
:param media_list: List of image and video
"""
created_media = cls._create_post_media(post, media_list)
cls.compress_media(created_media)
return created_media
@classmethod
def _compress_image(cls, media: PostMedia) -> None:
if settings.IS_TESTING:
compress_image(media.id)
else:
compress_image.delay(media.id)
@classmethod
def _compress_video(cls, media: PostMedia) -> None:
if settings.IS_TESTING:
send_video_service(media.id)
else:
send_video_service.delay(media.id)
@classmethod
def _create_post_media(cls, post: Post, media_list: List) -> List[PostMedia]:
"""
Method for bulk create media
:param post: Post object
:param media_list: List of image and video
"""
media_objects = []
for item in media_list:
media = PostMedia(post=post, **item)
media_objects.append(media)
return PostMedia.objects.bulk_create(media_objects)
[docs]
@classmethod
def compress_media(cls, medias: List[PostMedia]) -> None:
for media in medias:
if media.type == ContentTypeChoices.VIDEO:
cls._compress_video(media)
elif media.type == ContentTypeChoices.IMAGE:
cls._compress_image(media)
[docs]
@classmethod
def update(cls, post_media: PostMedia, data: Dict[str, Any]) -> PostMedia:
"""
Update post
:param post_media: PostMedia instance
:param data: Validated data
"""
if post_media.type == "image" and "original" in data:
old_original = F("original")
if old_original != data["original"]:
# The 'original' field has been updated
# You can take any desired action here
cls._compress_image(post_media)
for attr, value in data.items():
setattr(post_media, attr, value)
post_media.save()
return post_media
[docs]
@classmethod
def set_formatted_path(cls, post_media: PostMedia, upload_video_path: str, upload_preview_path: str) -> PostMedia:
"""
Set proccessed video and preview from Video service
:param post_media: PostMedia instance
:param upload_video_path: Path to formatted video
:param upload_preview_path: Path to preview
"""
data = {"formatted_path": upload_video_path, "preview_path": upload_preview_path}
instance = cls.update(post_media, data)
# PostService(post_media.post).check_on_publish()
return instance