uchill/backend/apps/materials/signals.py

52 lines
1.9 KiB
Python

"""
Сигналы для материалов.
"""
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
import logging
logger = logging.getLogger(__name__)
@receiver(post_save, sender='materials.Material')
def update_storage_quota_on_material_save(sender, instance, created, **kwargs):
"""
Обновление квоты хранилища при создании/обновлении материала.
"""
from .services import StorageService
from .models import StorageQuota
if instance.file and instance.owner:
if created:
# Новый материал - добавляем использование
StorageService.add_file_usage(instance.owner, instance.file_size or 0)
else:
# Обновление материала - пересчитываем квоту
quota, created = StorageQuota.objects.get_or_create(user=instance.owner)
quota.recalculate()
@receiver(post_delete, sender='materials.Material')
def update_storage_quota_on_material_delete(sender, instance, **kwargs):
"""
Обновление квоты хранилища при удалении материала.
"""
from .services import StorageService
if instance.file and instance.owner:
StorageService.remove_file_usage(instance.owner, instance.file_size or 0)
@receiver(post_save, sender='subscriptions.Subscription')
def sync_storage_quota_on_subscription_change(sender, instance, created, **kwargs):
"""
Синхронизация квоты хранилища при изменении подписки.
"""
from .services import StorageService
if instance.status == 'active' and instance.user:
StorageService.sync_quota_with_subscription(instance.user)
logger.info(f'Storage quota synced for user {instance.user.id} after subscription change')