Initial commit

This commit is contained in:
2026-08-11 16:43:12 +03:30
commit e1d830f6a9
127 changed files with 4454 additions and 0 deletions

52
support/admin.py Normal file
View File

@@ -0,0 +1,52 @@
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',)
def save_model(self, request, obj, form, change):
"""
طبق سند معماری، ارتباط Support→Notifications فقط از طریق رویداد
TicketReplied‌ه، نه رفرنس مدل. چون پاسخ پشتیبانی (sender='support')
از پنل ادمین ثبت می‌شه، رویداد دقیقاً همین‌جا ساطع می‌شه — همون
الگوی notify() که در payment/views.py (PaymentWebhookView) هنگام
پرداخت موفق (status=paid) صدا زده می‌شه.
"""
is_new = obj.pk is None
super().save_model(request, obj, form, change)
if is_new and obj.sender == 'support':
from notifications.services import notify
notify(
user_id=obj.ticket.user_id,
type='ticket_replied',
title='پاسخ جدید برای تیکت شما',
body=obj.text[:200],
related_id=obj.ticket_id,
)