Files
mypointvpn/src/App/admin.py
T

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