Source code for services.posts.category
from typing import List
from django.db.models import QuerySet
from apps.posts.models import Post
from apps.users.models import Category
from core.settings import POSTS_CONFIGS
from services.posts.exceptions import CategoriesDontExistException, TooManyCategoriesException
[docs]
class PostCategoryService:
@classmethod
def _validate_categories(cls, categories_ids: List[int]) -> QuerySet[Category]:
categories = Category.objects.filter(pk__in=categories_ids)
max_categories = POSTS_CONFIGS.get("MAX_POST_CATEGORIES", 1)
if not categories.exists():
raise CategoriesDontExistException
if categories.count() > max_categories:
raise TooManyCategoriesException
return categories
[docs]
@classmethod
def set_categories(cls, post: Post, categories_ids: List[int]) -> None:
"""
Set categories list to post instance after validation
:param post: Post instance
:param categories_ids: categories id list
"""
categories = cls._validate_categories(categories_ids)
# Check is category was changed
if categories.values_list("pk", flat=True) != post.categories.values_list("pk", flat=True):
post.categories.set(categories)