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