Files
MathApp/support/admin.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

34 lines
1.1 KiB
Python

from django.contrib import admin
from .models import BugReport, Ticket, TicketMessage
class TicketMessageInline(admin.TabularInline):
model = TicketMessage
extra = 0
readonly_fields = ('created_at',)
@admin.register(BugReport)
class BugReportAdmin(admin.ModelAdmin):
list_display = ('id', 'user_id', 'title', 'status', 'linked_ticket_id', 'created_at')
list_filter = ('status',)
search_fields = ('title',)
@admin.register(Ticket)
class TicketAdmin(admin.ModelAdmin):
list_display = ('id', 'user_id', 'subject', 'category', 'status', 'priority', 'created_at')
list_filter = ('status', 'priority', 'category')
search_fields = ('subject',)
inlines = [TicketMessageInline]
@admin.register(TicketMessage)
class TicketMessageAdmin(admin.ModelAdmin):
list_display = ('id', 'ticket', 'sender', 'created_at')
list_filter = ('sender',)
# اعلانِ پاسخِ پشتیبانی در support/receivers.py است (سیگنال روی مدل)، نه این‌جا؛ از صفحه‌ی
# تیکت (inline) هم که ذخیره شود اعلان می‌رود.