44 lines
1.8 KiB
Python
44 lines
1.8 KiB
Python
from typing import Optional, List
|
||
from django.db.models import QuerySet
|
||
from django.core.cache import cache
|
||
from .models import Article, Category, Comment
|
||
|
||
def get_published_articles(category_slug: Optional[str] = None) -> QuerySet[Article]:
|
||
"""
|
||
Возвращает опубликованные статьи с возможностью фильтрации по категории.
|
||
Результат кэшируется на 5 минут.
|
||
"""
|
||
cache_key = f"articles_list_{category_slug or 'all'}"
|
||
articles = cache.get(cache_key)
|
||
if articles is None:
|
||
qs = Article.objects.filter(is_published=True).select_related('category')
|
||
if category_slug:
|
||
qs = qs.filter(category__slug=category_slug)
|
||
articles = qs.order_by('-time_create')
|
||
cache.set(cache_key, articles, 300) # 5 минут
|
||
return articles
|
||
|
||
def get_article_by_slug(slug: str) -> Optional[Article]:
|
||
"""Получение статьи по slug с учётом публикации."""
|
||
try:
|
||
return Article.objects.get(slug=slug, is_published=True)
|
||
except Article.DoesNotExist:
|
||
return None
|
||
|
||
def increment_article_views(article: Article) -> None:
|
||
"""Увеличивает счётчик просмотров статьи."""
|
||
article.views_count += 1
|
||
article.save(update_fields=['views_count'])
|
||
|
||
def add_comment_to_article(article: Article, data: dict) -> Comment:
|
||
"""Создание комментария к статье (без модерации)."""
|
||
comment = Comment.objects.create(
|
||
article=article,
|
||
author_name=data['author_name'],
|
||
author_email=data['author_email'],
|
||
content=data['content']
|
||
)
|
||
# Здесь можно отправить уведомление администратору
|
||
return comment
|
||
|