transfer_tdms_tcs/backend/backend_transfer_tdms_tcs/app/admin.py
2026-02-11 20:49:50 +03:00

83 lines
No EOL
3.3 KiB
Python

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