156 lines
5.6 KiB
Python
156 lines
5.6 KiB
Python
from django.contrib import admin
|
||
from .models import SSHCredential, Project, SSHLog, Customer, Invoice, InvoiceItem
|
||
from .system_settings import SystemSettings
|
||
|
||
@admin.register(SystemSettings)
|
||
class SystemSettingsAdmin(admin.ModelAdmin):
|
||
list_display = ('__str__', 'backup_enabled', 'backup_frequency', 'updated_at')
|
||
fieldsets = (
|
||
('Yedekleme Ayarları', {
|
||
'fields': ('backup_enabled', 'backup_frequency', 'backup_hour', 'backup_minute',
|
||
'backup_day_of_week', 'backup_day_of_month', 'backup_retention_days',
|
||
'backup_compression', 'backup_format', 'backup_directory')
|
||
}),
|
||
('S3 Depolama', {
|
||
'fields': ('use_s3_storage', 's3_access_key', 's3_secret_key',
|
||
's3_bucket_name', 's3_region')
|
||
}),
|
||
('Bildirim Ayarları', {
|
||
'fields': ('email_notifications', 'notification_email')
|
||
}),
|
||
('SSH Ayarları', {
|
||
'fields': ('ssh_key_path', 'ssh_key_passphrase')
|
||
}),
|
||
('Crontab Bilgisi', {
|
||
'fields': ('backup_crontab_expression', 'updated_at'),
|
||
'classes': ('collapse',)
|
||
})
|
||
)
|
||
readonly_fields = ('backup_crontab_expression', 'updated_at')
|
||
|
||
def has_add_permission(self, request):
|
||
# Sadece bir kayıt olabilir
|
||
return SystemSettings.objects.count() == 0
|
||
|
||
def has_delete_permission(self, request, obj=None):
|
||
# Silme işlemi engellenir
|
||
return False
|
||
|
||
@admin.register(SSHCredential)
|
||
class SSHCredentialAdmin(admin.ModelAdmin):
|
||
list_display = ('hostname', 'username', 'port', 'is_online', 'last_check')
|
||
list_filter = ('is_online', 'created_at')
|
||
search_fields = ('hostname', 'username')
|
||
readonly_fields = ('is_online', 'last_check', 'created_at')
|
||
fieldsets = (
|
||
('Bağlantı Bilgileri', {
|
||
'fields': ('hostname', 'username', 'password', 'port')
|
||
}),
|
||
('Durum Bilgisi', {
|
||
'fields': ('is_online', 'last_check', 'created_at'),
|
||
'classes': ('collapse',)
|
||
}),
|
||
)
|
||
|
||
@admin.register(Project)
|
||
class ProjectAdmin(admin.ModelAdmin):
|
||
list_display = ('name', 'folder_name', 'url', 'ssh_credential', 'created_at')
|
||
list_filter = ('ssh_credential', 'created_at')
|
||
search_fields = ('name', 'folder_name', 'url')
|
||
readonly_fields = ('created_at', 'updated_at')
|
||
fieldsets = (
|
||
('Temel Bilgiler', {
|
||
'fields': ('name', 'folder_name', 'ssh_credential')
|
||
}),
|
||
('Domain Bilgisi', {
|
||
'fields': ('url',),
|
||
'description': 'Nginx konfigürasyonu için domain adı (Örnek: example.com)'
|
||
}),
|
||
('Zaman Bilgileri', {
|
||
'fields': ('created_at', 'updated_at'),
|
||
'classes': ('collapse',)
|
||
}),
|
||
)
|
||
|
||
def get_full_path(self, obj):
|
||
return obj.get_full_path()
|
||
get_full_path.short_description = 'Tam Yol'
|
||
|
||
@admin.register(SSHLog)
|
||
class SSHLogAdmin(admin.ModelAdmin):
|
||
list_display = ('ssh_credential', 'log_type', 'command', 'status', 'created_at')
|
||
list_filter = ('log_type', 'status', 'created_at')
|
||
search_fields = ('command', 'output')
|
||
readonly_fields = ('created_at',)
|
||
fieldsets = (
|
||
('Log Detayları', {
|
||
'fields': ('ssh_credential', 'log_type', 'command', 'status')
|
||
}),
|
||
('Çıktı', {
|
||
'fields': ('output',),
|
||
'classes': ('wide',)
|
||
}),
|
||
('Zaman Bilgisi', {
|
||
'fields': ('created_at',),
|
||
'classes': ('collapse',)
|
||
}),
|
||
)
|
||
|
||
def get_queryset(self, request):
|
||
return super().get_queryset(request).select_related('ssh_credential')
|
||
|
||
def has_add_permission(self, request):
|
||
return False # Log kayıtları manuel olarak eklenemez
|
||
|
||
def has_change_permission(self, request, obj=None):
|
||
return False # Log kayıtları değiştirilemez
|
||
|
||
class InvoiceItemInline(admin.TabularInline):
|
||
model = InvoiceItem
|
||
extra = 1
|
||
fields = ('project', 'description', 'amount')
|
||
|
||
def get_formset(self, request, obj=None, **kwargs):
|
||
formset = super().get_formset(request, obj, **kwargs)
|
||
form = formset.form
|
||
form.base_fields['description'].widget.attrs['style'] = 'width: 300px'
|
||
return formset
|
||
|
||
|
||
@admin.register(Invoice)
|
||
class InvoiceAdmin(admin.ModelAdmin):
|
||
list_display = ('invoice_number', 'customer', 'issue_date', 'due_date', 'status', 'total_amount')
|
||
list_filter = ('status', 'issue_date', 'payment_method')
|
||
search_fields = ('invoice_number', 'customer__name', 'customer__company_name')
|
||
readonly_fields = ('invoice_number', 'total_amount', 'created_at', 'updated_at')
|
||
inlines = [InvoiceItemInline]
|
||
date_hierarchy = 'issue_date'
|
||
|
||
fieldsets = (
|
||
('Fatura Bilgileri', {
|
||
'fields': ('invoice_number', 'customer', 'issue_date', 'due_date', 'status', 'payment_method')
|
||
}),
|
||
('Tutar Bilgileri', {
|
||
'fields': ('total_amount',)
|
||
}),
|
||
('Ek Bilgiler', {
|
||
'fields': ('notes', 'payment_notes'),
|
||
'classes': ('collapse',)
|
||
}),
|
||
('Sistem Bilgileri', {
|
||
'fields': ('created_at', 'updated_at'),
|
||
'classes': ('collapse',)
|
||
})
|
||
)
|
||
|
||
def get_queryset(self, request):
|
||
return super().get_queryset(request).select_related('customer')
|
||
|
||
@admin.register(InvoiceItem)
|
||
class InvoiceItemAdmin(admin.ModelAdmin):
|
||
list_display = ('invoice', 'description', 'project', 'amount')
|
||
list_filter = ('invoice__status',)
|
||
search_fields = ('description', 'invoice__invoice_number', 'project__name')
|
||
|
||
def get_queryset(self, request):
|
||
return super().get_queryset(request).select_related('invoice', 'project') |