from quickbot import ( QuickBot, BotEntity, Entity, EntityForm, EntityList, FieldEditButton, EntityField, CommandCallbackContext, ContextData, CallbackCommand, ) from quickbot.model.user import UserBase from quickbot.model.descriptors import Filter from quickbot.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 = QuickBot( 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(), ) )