- Создан модуль calendarEventDragDrop.js с классами DragDropState и CalendarUtils - Реализовано перетаскивание событий между календарями через модальное окно - Добавлена кнопка 'Переместить все' для массового перемещения - Модальное окно отображает источник и цель перемещения - Поддержка legacy-календарей (company/department/personal) - Добавлены стили для подсветки drop-target (папки и календари) - Backend: исправлена обработка null значений в serializer - Backend: добавлен endpoint list_raw для получения немодерируемых событий - Использованы стандартные Bootstrap стили для модалов - Исправлено всплытие событий dragover/drop (stopPropagation) - Эмодзи иконки для типов календарей (����) - Toast уведомления об успехе/ошибках перемещения
75 lines
2.2 KiB
Python
75 lines
2.2 KiB
Python
# backend/calendar_app/cache.py
|
||
"""Утилиты для управления кешем календаря."""
|
||
|
||
from django.core.cache import cache
|
||
|
||
|
||
def invalidate_calendar_cache(calendar_id=None, user_id=None):
|
||
"""Инвалидация кеша календаря.
|
||
|
||
Args:
|
||
calendar_id: ID календаря (опционально)
|
||
user_id: ID пользователя (опционально)
|
||
"""
|
||
patterns = []
|
||
|
||
if calendar_id:
|
||
# Кеш конкретного календаря
|
||
patterns.extend(
|
||
[
|
||
f"calendar:events:{calendar_id}:*",
|
||
f"calendar:detail:{calendar_id}",
|
||
f"calendar:subscriptions:{calendar_id}:*",
|
||
]
|
||
)
|
||
else:
|
||
# Все события и календари
|
||
patterns.extend(
|
||
[
|
||
"calendar:events:*",
|
||
"calendar:list:*",
|
||
"calendar:subscriptions:*",
|
||
]
|
||
)
|
||
|
||
if user_id:
|
||
# Кеш пользователя
|
||
patterns.extend(
|
||
[
|
||
f"calendar:user:{user_id}:*",
|
||
f"calendar:my_calendars:{user_id}",
|
||
]
|
||
)
|
||
|
||
# Удаляем по паттернам
|
||
for pattern in patterns:
|
||
# Django cache не поддерживает wildcards напрямую,
|
||
# поэтому используем delete с точным ключом
|
||
cache.delete(pattern.replace(":*", ""))
|
||
|
||
|
||
def invalidate_event_cache(event_id=None):
|
||
"""Инвалидация кеша событий.
|
||
|
||
Args:
|
||
event_id: ID события (опционально)
|
||
"""
|
||
if event_id:
|
||
cache.delete(f"calendar:event:{event_id}")
|
||
else:
|
||
# Инвалидация всех событий
|
||
cache.delete("calendar:events")
|
||
|
||
|
||
def invalidate_subscription_cache(user_id=None):
|
||
"""Инвалидация кеша подписок.
|
||
|
||
Args:
|
||
user_id: ID пользователя (опционально)
|
||
"""
|
||
if user_id:
|
||
cache.delete(f"calendar:subscriptions:user:{user_id}")
|
||
cache.delete(f"calendar:my_calendars:{user_id}")
|
||
else:
|
||
cache.delete("calendar:subscriptions")
|