first commit
This commit is contained in:
162
backup/admin.py
Normal file
162
backup/admin.py
Normal file
@@ -0,0 +1,162 @@
|
||||
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(
|
||||
'<span style="background-color: {}; color: white; padding: 3px 10px; border-radius: 3px; font-weight: bold;">{}</span>',
|
||||
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
|
||||
Reference in New Issue
Block a user