Files
MathApp/subscription/receivers.py
Zareian ab5e53730a Audit fixes 2026-10-03: seed keeps admin edits, plan cache, refresh limit, payment and tutor guards
- seed_content no longer undoes admin work: a SeedRecord ledger (content/seed_sync.py)
  stops deleted/renamed/re-worded content from being recreated and keeps admin-edited
  lesson text; new rows in the seed files still arrive (migration content.0010)
- plan list cache is invalidated on Plan save (receiver used a stale 'v1' key)
- token refresh per-IP cap 30/hour -> 600/hour (TOKEN_REFRESH_IP_RATE)
- a failed gateway result only changes a pending order (forged NOK no longer
  overwrites refunded/canceled)
- tutor gets the correct answer only after the student has answered
- support reply notification moved to a TicketMessage post_save signal
- global daily cap on paid AI questions (AI_GLOBAL_DAILY_MAX, default 3000)
- Bazaar verify uses only the order's SKU; bazaar orders require a SKU
- /api/health warns on the committed signing key; deploy.sh saves local commits;
  400 for bad ?unit= / ?period=; account delete keeps the referrer's Conversion
- earlier today: no stub answers outside DEBUG, ?grade= removed, logged fallbacks

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 16:05:27 +03:30

17 lines
1.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""باطل‌کردنِ کشِ لیستِ پلن‌ها با هر تغییرِ Plan (از ادمین)."""
from django.core.cache import cache
from django.db.models.signals import post_delete, post_save
from django.dispatch import receiver
from .models import Plan
# کلید فقط یک‌جا تعریف می‌شود (views). تا ۲۰۲۶-۱۰-۰۳ این‌جا یک نسخه‌ی جدا ('v1') بود که
# با v3 شدنِ کلیدِ views جا ماند: ذخیره‌ی پلن در ادمین کش را پاک نمی‌کرد و اپ تا یک ساعت
# قیمتِ قدیم را نشان می‌داد در حالی که سفارش با قیمتِ تازه ساخته می‌شد (بازتولید شد).
from .views import PLANS_CACHE_KEY
@receiver(post_save, sender=Plan, dispatch_uid='subscription_invalidate_plans_cache_on_save')
@receiver(post_delete, sender=Plan, dispatch_uid='subscription_invalidate_plans_cache_on_delete')
def _invalidate_plans_cache(sender, **kwargs):
cache.delete(PLANS_CACHE_KEY)