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