from django.contrib import admin from django.utils.html import format_html from django.contrib import messages from django.utils import timezone from .models import DatabaseBackup from .views import BackupManager @admin.register(DatabaseBackup) class DatabaseBackupAdmin(admin.ModelAdmin): list_display = ['name', 'status_badge', 'backup_type', 'file_size_display', 'created_by', 'created_at', 'completed_at'] list_filter = ['status', 'backup_type', 'created_at'] search_fields = ['name', 'notes', 'error_message'] readonly_fields = ['file_path', 'file_size', 'status', 'created_by', 'created_at', 'completed_at', 'error_message', 'file_size_display_field'] fieldsets = ( ('Temel Bilgiler', { 'fields': ('name', 'backup_type', 'status', 'notes') }), ('Yedek Dosya Bilgileri', { 'fields': ('file_path', 'file_size_display_field') }), ('Zaman Bilgileri', { 'fields': ('created_by', 'created_at', 'completed_at') }), ('Hata Bilgileri', { 'fields': ('error_message',), 'classes': ('collapse',) }), ) actions = ['create_new_backup', 'restore_selected_backup', 'delete_backup_files'] def status_badge(self, obj): """Durum için renkli badge gösterir""" colors = { 'pending': '#FFA500', 'in_progress': '#2196F3', 'completed': '#4CAF50', 'failed': '#F44336', } color = colors.get(obj.status, '#999') return format_html( '{}', color, obj.get_status_display() ) status_badge.short_description = 'Durum' def file_size_display(self, obj): """Dosya boyutunu gösterir""" return obj.get_file_size_display() file_size_display.short_description = 'Dosya Boyutu' def file_size_display_field(self, obj): """Read-only field için dosya boyutu""" return obj.get_file_size_display() file_size_display_field.short_description = 'Dosya Boyutu' def save_model(self, request, obj, form, change): """Model kaydedilirken created_by alanını otomatik doldur""" if not change: # Yeni kayıt obj.created_by = request.user super().save_model(request, obj, form, change) def create_new_backup(self, request, queryset): """Yeni bir yedek oluşturur""" # Yeni bir backup objesi oluştur timestamp = timezone.now().strftime('%Y-%m-%d %H:%M:%S') backup = DatabaseBackup.objects.create( name=f"Manuel Yedek - {timestamp}", backup_type='manual', created_by=request.user, status='pending' ) # Yedekleme işlemini başlat manager = BackupManager() success, message = manager.create_backup(backup) if success: self.message_user(request, message, messages.SUCCESS) else: self.message_user(request, message, messages.ERROR) create_new_backup.short_description = "Yeni Yedek Oluştur" def restore_selected_backup(self, request, queryset): """Seçili yedeği geri yükler""" if queryset.count() != 1: self.message_user( request, "Lütfen geri yüklemek için sadece bir yedek seçin", messages.WARNING ) return backup = queryset.first() if backup.status != 'completed': self.message_user( request, "Sadece tamamlanmış yedekler geri yüklenebilir", messages.WARNING ) return if not backup.file_path: self.message_user( request, "Yedek dosya yolu bulunamadı", messages.ERROR ) return manager = BackupManager() success, message = manager.restore_backup(backup.file_path) if success: self.message_user(request, message, messages.SUCCESS) else: self.message_user(request, message, messages.ERROR) restore_selected_backup.short_description = "Seçili Yedeği Geri Yükle" def delete_backup_files(self, request, queryset): """Seçili yedeklerin dosyalarını siler""" deleted_count = 0 error_count = 0 manager = BackupManager() for backup in queryset: if backup.file_path: success, message = manager.delete_backup_file(backup.file_path) if success: backup.file_path = None backup.file_size = None backup.save() deleted_count += 1 else: error_count += 1 if deleted_count > 0: self.message_user( request, f"{deleted_count} yedek dosyası silindi", messages.SUCCESS ) if error_count > 0: self.message_user( request, f"{error_count} yedek dosyası silinemedi", messages.WARNING ) delete_backup_files.short_description = "Yedek Dosyalarını Sil" def has_delete_permission(self, request, obj=None): """Silme iznini kontrol et - Tüm admin kullanıcıları silebilir""" return request.user.is_staff