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(), ) )