feat: version 0.9.30 - cache invalidation fixes
🔧 Fixed cache invalidation for featured materials: - Enhanced invalidate_shout_related_cache with featured keys - Fixed set_featured/set_unfeatured functions with async cache invalidation - Materials now correctly appear/disappear from main page on feature/unfeature ✅ Code Quality: Python Standards Compliance - Ruff linting & formatting checks passed - MyPy type checking passed - All functions have proper type hints and docstrings - Tests passing successfully Version bump: 0.9.30
This commit is contained in:
17
CHANGELOG.md
17
CHANGELOG.md
@@ -1,5 +1,22 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [0.9.30] - 2025-10-02
|
||||||
|
|
||||||
|
### 🔧 Fixed
|
||||||
|
- **Ревалидация кеша featured материалов**: Критическое исправление инвалидации кеша при изменении featured статуса
|
||||||
|
- Добавлены ключи кеша для featured материалов в `invalidate_shout_related_cache`
|
||||||
|
- Исправлена функция `set_featured`: добавлена инвалидация кеша лент
|
||||||
|
- Исправлена функция `set_unfeatured`: добавлена инвалидация кеша лент
|
||||||
|
- Теперь материалы корректно появляются/исчезают с главной страницы при фичеринге/расфичеринге
|
||||||
|
- Улучшена производительность через асинхронную инвалидацию кеша
|
||||||
|
|
||||||
|
### ✅ Code Quality
|
||||||
|
- **Python Standards Compliance**: Код соответствует стандартам 003-python-standards.mdc
|
||||||
|
- Пройдены проверки Ruff (linting & formatting)
|
||||||
|
- Пройдены проверки MyPy (type checking)
|
||||||
|
- Все функции имеют типы и докстринги
|
||||||
|
- Тесты проходят успешно
|
||||||
|
|
||||||
## [0.9.29] - 2025-10-01
|
## [0.9.29] - 2025-10-01
|
||||||
|
|
||||||
### 🔧 Fixed
|
### 🔧 Fixed
|
||||||
|
|||||||
10
cache/cache.py
vendored
10
cache/cache.py
vendored
@@ -513,6 +513,10 @@ async def invalidate_shout_related_cache(shout: Shout, author_id: int) -> None:
|
|||||||
"unrated", # неоцененные
|
"unrated", # неоцененные
|
||||||
"recent", # последние
|
"recent", # последние
|
||||||
"coauthored", # совместные
|
"coauthored", # совместные
|
||||||
|
# 🔧 Добавляем ключи с featured материалами
|
||||||
|
"featured", # featured публикации
|
||||||
|
"featured:recent", # недавние featured
|
||||||
|
"featured:top", # топ featured
|
||||||
}
|
}
|
||||||
|
|
||||||
# Добавляем ключи авторов
|
# Добавляем ключи авторов
|
||||||
@@ -523,6 +527,12 @@ async def invalidate_shout_related_cache(shout: Shout, author_id: int) -> None:
|
|||||||
cache_keys.update(f"topic_{t.id}" for t in shout.topics)
|
cache_keys.update(f"topic_{t.id}" for t in shout.topics)
|
||||||
cache_keys.update(f"topic_shouts_{t.id}" for t in shout.topics)
|
cache_keys.update(f"topic_shouts_{t.id}" for t in shout.topics)
|
||||||
|
|
||||||
|
# 🔧 Добавляем ключи featured материалов для каждой темы
|
||||||
|
for topic in shout.topics:
|
||||||
|
cache_keys.update(
|
||||||
|
[f"topic_{topic.id}:featured", f"topic_{topic.id}:featured:recent", f"topic_{topic.id}:featured:top"]
|
||||||
|
)
|
||||||
|
|
||||||
await invalidate_shouts_cache(list(cache_keys))
|
await invalidate_shouts_cache(list(cache_keys))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "publy-panel",
|
"name": "publy-panel",
|
||||||
"version": "0.9.28",
|
"version": "0.9.30",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "Publy, a modern platform for collaborative text creation, offers a user-friendly interface for authors, editors, and readers, supporting real-time collaboration and structured feedback.",
|
"description": "Publy, a modern platform for collaborative text creation, offers a user-friendly interface for authors, editors, and readers, supporting real-time collaboration and structured feedback.",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import asyncio
|
||||||
import time
|
import time
|
||||||
import traceback
|
import traceback
|
||||||
from typing import Any
|
from typing import Any
|
||||||
@@ -274,6 +275,11 @@ async def set_featured(session: Session, shout_id: int) -> None:
|
|||||||
for topic in s.topics:
|
for topic in s.topics:
|
||||||
revalidation_manager.mark_for_revalidation(topic.id, "topics")
|
revalidation_manager.mark_for_revalidation(topic.id, "topics")
|
||||||
|
|
||||||
|
# 🔧 Инвалидируем ключи кеша лент для обновления featured статусов
|
||||||
|
from cache.cache import invalidate_shout_related_cache
|
||||||
|
|
||||||
|
await invalidate_shout_related_cache(s, s.created_by)
|
||||||
|
|
||||||
logger.info(f"Публикация {shout_id} получила статус featured, кеш помечен для ревалидации")
|
logger.info(f"Публикация {shout_id} получила статус featured, кеш помечен для ревалидации")
|
||||||
|
|
||||||
|
|
||||||
@@ -303,6 +309,12 @@ def set_unfeatured(session: Session, shout_id: int) -> None:
|
|||||||
for topic in shout.topics:
|
for topic in shout.topics:
|
||||||
revalidation_manager.mark_for_revalidation(topic.id, "topics")
|
revalidation_manager.mark_for_revalidation(topic.id, "topics")
|
||||||
|
|
||||||
|
# 🔧 Инвалидируем ключи кеша лент для обновления featured статусов
|
||||||
|
from cache.cache import invalidate_shout_related_cache
|
||||||
|
|
||||||
|
# Используем asyncio.create_task для асинхронного вызова
|
||||||
|
asyncio.create_task(invalidate_shout_related_cache(shout, shout.created_by))
|
||||||
|
|
||||||
logger.info(f"Публикация {shout_id} потеряла статус featured, кеш помечен для ревалидации")
|
logger.info(f"Публикация {shout_id} потеряла статус featured, кеш помечен для ревалидации")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user