99 lines
3.1 KiB
Python
99 lines
3.1 KiB
Python
from django.contrib import admin
|
|
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
|
|
from django.contrib.auth.forms import AdminUserCreationForm, UserChangeForm
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from .models import Key, Point, Server, User
|
|
|
|
|
|
class UserCreationForm(AdminUserCreationForm):
|
|
class Meta(AdminUserCreationForm.Meta):
|
|
model = User
|
|
|
|
|
|
class UserEditForm(UserChangeForm):
|
|
class Meta(UserChangeForm.Meta):
|
|
model = User
|
|
|
|
|
|
@admin.register(User)
|
|
class UserAdmin(BaseUserAdmin):
|
|
form = UserEditForm
|
|
add_form = UserCreationForm
|
|
fieldsets = (
|
|
(None, {'fields': ('username', 'password')}),
|
|
(_('Personal info'), {'fields': ('first_name', 'last_name')}),
|
|
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
|
|
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
|
|
)
|
|
list_display = ('username', 'first_name', 'last_name', 'is_staff')
|
|
search_fields = ('username', 'first_name', 'last_name')
|
|
|
|
|
|
class ServerInline(admin.StackedInline):
|
|
model = Server
|
|
extra = 0
|
|
fields = (
|
|
'role', 'address', 'ssh_port', 'root_password', 'default_root_password', 'public_key', 'known_hosts', 'uname',
|
|
)
|
|
readonly_fields = fields
|
|
can_delete = False
|
|
|
|
def has_add_permission(self, request, obj=None):
|
|
return False
|
|
|
|
|
|
@admin.register(Point)
|
|
class PointAdmin(admin.ModelAdmin):
|
|
list_display = ('name', 'owner', 'status', 'domain', 'created_at')
|
|
list_filter = ('status',)
|
|
search_fields = ('name', 'servers__address')
|
|
readonly_fields = (
|
|
'owner', 'name', 'status', 'error', 'health_error', 'checked_at', 'task_started_at', 'task_heartbeat',
|
|
'created_at',
|
|
)
|
|
inlines = [ServerInline]
|
|
|
|
|
|
@admin.register(Server)
|
|
class ServerAdmin(admin.ModelAdmin):
|
|
list_display = ('address', 'role', 'point', 'ssh_port', 'has_fingerprint')
|
|
list_filter = ('role',)
|
|
search_fields = ('address', 'point__name')
|
|
exclude = ('private_key',)
|
|
readonly_fields = ('point', 'role', 'public_key', 'uname')
|
|
actions = ('reset_fingerprint',)
|
|
|
|
@admin.display(boolean=True, description='отпечаток')
|
|
def has_fingerprint(self, server):
|
|
return bool(server.known_hosts)
|
|
|
|
@admin.action(description='Сбросить отпечаток ssh (после переустановки ОС)')
|
|
def reset_fingerprint(self, request, queryset):
|
|
for server in queryset:
|
|
server.reset_fingerprint()
|
|
self.message_user(request, f'Сброшено отпечатков: {len(queryset)}')
|
|
|
|
|
|
@admin.register(Key)
|
|
class KeyAdmin(admin.ModelAdmin):
|
|
"""Только просмотр: ключи выпускаются и отзываются через панель точки (services), иначе база и панель разойдутся.
|
|
|
|
uuid и ссылка подписки не показываются: это доступ в сеть клиента.
|
|
"""
|
|
|
|
list_display = ('name', 'point', 'created_at')
|
|
list_filter = ('point',)
|
|
search_fields = ('name', 'point__name')
|
|
fields = ('name', 'point', 'created_at')
|
|
readonly_fields = fields
|
|
|
|
def has_add_permission(self, request):
|
|
return False
|
|
|
|
def has_change_permission(self, request, obj=None):
|
|
return False
|
|
|
|
def has_delete_permission(self, request, obj=None):
|
|
return False
|