142 lines
3.4 KiB
Python
142 lines
3.4 KiB
Python
from qbot import (
|
|
QBotApp,
|
|
BotEntity,
|
|
Entity,
|
|
EntityForm,
|
|
EntityList,
|
|
FieldEditButton,
|
|
EntityField,
|
|
CommandCallbackContext,
|
|
ContextData,
|
|
CallbackCommand,
|
|
)
|
|
from qbot.model.user import UserBase
|
|
from qbot.model.descriptors import Filter
|
|
from qbot.model.role import RoleBase
|
|
|
|
from aiogram.types import InlineKeyboardButton
|
|
from datetime import datetime
|
|
from sqlmodel import BigInteger, Field, Relationship
|
|
from typing import Optional
|
|
|
|
|
|
class User(UserBase):
|
|
|
|
bot_entity_descriptor = Entity(
|
|
icon="👤",
|
|
full_name="User",
|
|
full_name_plural="Users",
|
|
item_repr=lambda d, e: e.name,
|
|
default_list=EntityList(
|
|
show_add_new_button=False,
|
|
static_filters=[Filter("roles", "contains", value=RoleBase.SUPER_USER)],
|
|
filtering=True,
|
|
filtering_fields=["name"],
|
|
),
|
|
default_form=EntityForm(
|
|
show_delete_button=False,
|
|
show_edit_button=False,
|
|
form_buttons=[
|
|
[
|
|
FieldEditButton("name"),
|
|
FieldEditButton("is_active"),
|
|
],
|
|
[
|
|
FieldEditButton("lang"),
|
|
FieldEditButton("roles"),
|
|
],
|
|
],
|
|
item_repr=lambda d, e: f"{e.name}\n{
|
|
'is active' if e.is_active else 'is not active'
|
|
}\nlang: {e.lang.localized()}\nroles: [{
|
|
', '.join([r.localized() for r in e.roles]) if e.roles else 'none'
|
|
}]",
|
|
),
|
|
)
|
|
|
|
|
|
class Entity(BotEntity):
|
|
|
|
bot_entity_descriptor = Entity(
|
|
icon="📦",
|
|
full_name="Entity",
|
|
full_name_plural="Entities",
|
|
item_repr=lambda d, e: e.name,
|
|
default_list=EntityList(
|
|
filtering=True,
|
|
filtering_fields=["name"],
|
|
order_by="name",
|
|
),
|
|
default_form=EntityForm(
|
|
form_buttons=[
|
|
[
|
|
FieldEditButton("name"),
|
|
FieldEditButton("user"),
|
|
],
|
|
[
|
|
FieldEditButton("creation_dt"),
|
|
],
|
|
],
|
|
),
|
|
)
|
|
|
|
id: int = EntityField(
|
|
caption="ID",
|
|
sm_descriptor=Field(
|
|
primary_key=True,
|
|
),
|
|
is_visible=False,
|
|
)
|
|
|
|
name: str = EntityField(
|
|
caption="Name",
|
|
)
|
|
|
|
creation_dt: datetime = EntityField(
|
|
caption="Creation date",
|
|
dt_type="datetime",
|
|
)
|
|
|
|
user_id: int | None = EntityField(
|
|
sm_descriptor=Field(
|
|
sa_type=BigInteger,
|
|
foreign_key="user.id",
|
|
ondelete="RESTRICT",
|
|
nullable=True,
|
|
),
|
|
is_visible=False,
|
|
)
|
|
|
|
user: Optional[User] = EntityField(
|
|
sm_descriptor=Relationship(
|
|
sa_relationship_kwargs={
|
|
"lazy": "selectin",
|
|
"foreign_keys": "Entity.user_id",
|
|
}
|
|
),
|
|
caption="User",
|
|
)
|
|
|
|
|
|
app = QBotApp(
|
|
user_class=User,
|
|
)
|
|
|
|
|
|
@app.command(
|
|
name="menu",
|
|
caption="Main menu",
|
|
show_in_bot_commands=True,
|
|
clear_navigation=True,
|
|
)
|
|
async def menu(context: CommandCallbackContext):
|
|
context.message_text = "Main menu"
|
|
context.keyboard_builder.row(
|
|
InlineKeyboardButton(
|
|
text="Entities",
|
|
callback_data=ContextData(
|
|
command=CallbackCommand.MENU_ENTRY_ENTITIES,
|
|
).pack(),
|
|
)
|
|
)
|