- 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>
34 lines
1.1 KiB
Python
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) هم که ذخیره شود اعلان میرود.
|