from sqladmin import Admin, ModelView from sqladmin.authentication import AuthenticationBackend from fastapi import Request from wtforms import TextAreaField from wtforms.widgets import TextArea from .database import engine from .models import Unloading, Product, UnloadCheck, TestLoad, TestCheck, ProdTransfer class JSONTextAreaWidget(TextArea): def __call__(self, field, **kwargs): kwargs["class"] = "json-textarea" return super().__call__(field, **kwargs) class UnloadingAdmin(ModelView, model=Unloading): column_list = [Unloading.guid, Unloading.name, Unloading.created_at, Unloading.computer_name] column_searchable_list = [Unloading.name, Unloading.guid, Unloading.computer_name] column_sortable_list = [Unloading.created_at, Unloading.unloading_time_seconds] form_overrides = {"warnings": TextAreaField} form_widget_args = {"warnings": {"widget": JSONTextAreaWidget(), "rows": 5}} can_create = True can_edit = True can_delete = True can_view_details = True class ProductAdmin(ModelView, model=Product): column_list = [Product.guid, Product.name] column_searchable_list = [Product.name, Product.guid] can_create = False # Продукты создаются через триггер can_edit = True can_delete = False can_view_details = True class UnloadCheckAdmin(ModelView, model=UnloadCheck): column_list = [UnloadCheck.id, UnloadCheck.product_guid, UnloadCheck.fio, UnloadCheck.date, UnloadCheck.is_completed] column_searchable_list = [UnloadCheck.fio, UnloadCheck.product_guid] class TestLoadAdmin(ModelView, model=TestLoad): column_list = [TestLoad.id, TestLoad.product_guid, TestLoad.fio, TestLoad.date, TestLoad.is_completed] class TestCheckAdmin(ModelView, model=TestCheck): column_list = [TestCheck.id, TestCheck.product_guid, TestCheck.fio, TestCheck.date, TestCheck.is_completed] class ProdTransferAdmin(ModelView, model=ProdTransfer): column_list = [ProdTransfer.id, ProdTransfer.product_guid, ProdTransfer.fio, ProdTransfer.date, ProdTransfer.is_completed] # Простая аутентификация (можно заменить на более сложную) class AdminAuth(AuthenticationBackend): async def login(self, request: Request) -> bool: form = await request.form() username = form.get("username") password = form.get("password") # Простая проверка (в production используйте безопасную аутентификацию) if username == "admin" and password == "admin": request.session.update({"token": "admin-token"}) return True return False async def logout(self, request: Request) -> bool: request.session.clear() return True async def authenticate(self, request: Request) -> bool: token = request.session.get("token") if token == "admin-token": return True return False def setup_admin(app): authentication_backend = AdminAuth(secret_key="secret-key") admin = Admin(app=app, engine=engine, authentication_backend=authentication_backend) admin.add_view(UnloadingAdmin) admin.add_view(ProductAdmin) admin.add_view(UnloadCheckAdmin) admin.add_view(TestLoadAdmin) admin.add_view(TestCheckAdmin) admin.add_view(ProdTransferAdmin) return admin