# management/admin.py # -*- coding: utf-8 -*- from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from .models import ( CustomUser, AdminLevel2, Panel, License, EndUser, Plan, Subscription, Payment, DiscountCode, TelegramUser, SecurityToken, PushSubscription, PaymentMethod, PaymentSetting, PaymentDetail ) # تنظیمات ادمین برای مدل CustomUser @admin.register(CustomUser) class CustomUserAdmin(BaseUserAdmin): list_display = ('username', 'email', 'role', 'is_staff') list_filter = ('role', 'is_staff', 'is_superuser', 'is_active') search_fields = ('username', 'email') ordering = ('username',) fieldsets = BaseUserAdmin.fieldsets + ( ('اطلاعات نقش', {'fields': ('role', 'marzban_admin_id')}), ) # تنظیمات ادمین برای مدل AdminLevel2 @admin.register(AdminLevel2) class AdminLevel2Admin(admin.ModelAdmin): # FIXED: 'marzban_api_token' does not exist in the model list_display = ('user', 'telegram_chat_id', 'license_expiry_date') search_fields = ('user__username',) # تنظیمات ادمین برای مدل Panel @admin.register(Panel) class PanelAdmin(admin.ModelAdmin): # FIXED: 'url' and 'api_token' do not exist. Used correct fields. list_display = ('name', 'owner', 'marzban_host') search_fields = ('name', 'owner__username') # تنظیمات ادمین برای مدل License @admin.register(License) class LicenseAdmin(admin.ModelAdmin): # FIXED: Used correct field names from the model ('key', 'owner', etc.) list_display = ('key', 'owner', 'is_active', 'created_at', 'expiry_date') list_filter = ('is_active',) search_fields = ('key', 'owner__username') # تنظیمات ادمین برای مدل EndUser @admin.register(EndUser) class EndUserAdmin(admin.ModelAdmin): list_display = ('username', 'panel', 'marzban_user_id') search_fields = ('username', 'marzban_user_id') list_filter = ('panel',) # تنظیمات ادمین برای مدل Plan @admin.register(Plan) class PlanAdmin(admin.ModelAdmin): list_display = ('name', 'panel', 'price', 'duration_days', 'data_limit_gb', 'is_active') list_filter = ('is_active', 'panel') search_fields = ('name',) # تنظیمات ادمین برای مدل Subscription @admin.register(Subscription) class SubscriptionAdmin(admin.ModelAdmin): list_display = ('end_user', 'plan', 'status', 'start_date', 'end_date', 'remaining_data_gb') # FIXED: 'is_trial' does not exist in the model list_filter = ('status', 'plan', 'panel') search_fields = ('end_user__username',) date_hierarchy = 'start_date' # تنظیمات ادمین برای مدل Payment @admin.register(Payment) class PaymentAdmin(admin.ModelAdmin): list_display = ('subscription', 'admin', 'amount', 'status', 'created_at') # IMPROVED: Filtering on image/text fields is not useful. Using status instead. list_filter = ('status', 'admin') search_fields = ('subscription__end_user__username',) date_hierarchy = 'created_at' # تنظیمات ادمین برای مدل DiscountCode @admin.register(DiscountCode) class DiscountCodeAdmin(admin.ModelAdmin): list_display = ('code', 'admin', 'discount_percentage', 'is_active') list_filter = ('is_active',) search_fields = ('code', 'admin__username',) # تنظیمات ادمین برای مدل TelegramUser @admin.register(TelegramUser) class TelegramUserAdmin(admin.ModelAdmin): list_display = ('username', 'chat_id', 'admin_id') search_fields = ('username', 'chat_id') # تنظیمات ادمین برای مدل SecurityToken @admin.register(SecurityToken) class SecurityTokenAdmin(admin.ModelAdmin): list_display = ('admin_id', 'token', 'expiration_date') search_fields = ('admin_id', 'token') # تنظیمات ادمین برای مدل PushSubscription @admin.register(PushSubscription) class PushSubscriptionAdmin(admin.ModelAdmin): list_display = ('user', 'created_at') search_fields = ('user__username',) # تنظیمات ادمین برای مدل PaymentMethod @admin.register(PaymentMethod) class PaymentMethodAdmin(admin.ModelAdmin): list_display = ('name', 'is_active', 'can_be_managed_by_level3') list_filter = ('is_active', 'can_be_managed_by_level3') # تنظیمات ادمین برای مدل PaymentSetting @admin.register(PaymentSetting) class PaymentSettingAdmin(admin.ModelAdmin): list_display = ('admin_level_3', 'payment_method', 'is_active') list_filter = ('is_active', 'payment_method') search_fields = ('admin_level_3__user__username',) # تنظیمات ادمین برای مدل PaymentDetail @admin.register(PaymentDetail) class PaymentDetailAdmin(admin.ModelAdmin): list_display = ('admin_level_3', 'card_number', 'wallet_address') search_fields = ('admin_level_3__user__username',)