83 lines
No EOL
3.3 KiB
Python
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 |