mirror of
https://github.com/koloideal/DutyLog.git
synced 2026-06-10 10:25:29 +03:00
commit
This commit is contained in:
@@ -9,6 +9,9 @@ from dutylog.application.bot.admin_dialogs.residents_management import (
|
|||||||
resident_info_window,
|
resident_info_window,
|
||||||
resident_logout_confirm_window,
|
resident_logout_confirm_window,
|
||||||
resident_delete_confirm_window,
|
resident_delete_confirm_window,
|
||||||
|
resident_rebind_floor_window,
|
||||||
|
resident_rebind_room_window,
|
||||||
|
resident_rebind_confirm_window,
|
||||||
create_resident_name_window,
|
create_resident_name_window,
|
||||||
create_resident_floor_window,
|
create_resident_floor_window,
|
||||||
create_resident_room_window,
|
create_resident_room_window,
|
||||||
@@ -66,6 +69,9 @@ admin_menu_dialog = Dialog(
|
|||||||
resident_info_window,
|
resident_info_window,
|
||||||
resident_logout_confirm_window,
|
resident_logout_confirm_window,
|
||||||
resident_delete_confirm_window,
|
resident_delete_confirm_window,
|
||||||
|
resident_rebind_floor_window,
|
||||||
|
resident_rebind_room_window,
|
||||||
|
resident_rebind_confirm_window,
|
||||||
add_hours_select_window,
|
add_hours_select_window,
|
||||||
remove_hours_select_window,
|
remove_hours_select_window,
|
||||||
add_hours_custom_window,
|
add_hours_custom_window,
|
||||||
|
|||||||
@@ -211,6 +211,118 @@ async def on_delete_resident_cancel(
|
|||||||
await dialog_manager.switch_to(AdminMenuSG.resident_info)
|
await dialog_manager.switch_to(AdminMenuSG.resident_info)
|
||||||
|
|
||||||
|
|
||||||
|
async def on_rebind_resident(
|
||||||
|
callback: CallbackQuery,
|
||||||
|
button: Button,
|
||||||
|
dialog_manager: DialogManager,
|
||||||
|
):
|
||||||
|
await dialog_manager.switch_to(AdminMenuSG.resident_rebind_floor)
|
||||||
|
|
||||||
|
|
||||||
|
@inject
|
||||||
|
async def get_rebind_floors_data(
|
||||||
|
floors_repository: FromDishka[FloorsRepository],
|
||||||
|
**kwargs,
|
||||||
|
):
|
||||||
|
all_floors = await floors_repository.get_all_floors()
|
||||||
|
all_floors.sort(key=lambda f: f.number)
|
||||||
|
|
||||||
|
return {
|
||||||
|
"floors": [(f.id, f"Этаж {f.number}") for f in all_floors],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def on_rebind_floor_selected(
|
||||||
|
callback: CallbackQuery,
|
||||||
|
widget: Select,
|
||||||
|
dialog_manager: DialogManager,
|
||||||
|
item_id: str,
|
||||||
|
):
|
||||||
|
dialog_manager.dialog_data["rebind_floor_id"] = int(item_id)
|
||||||
|
await dialog_manager.switch_to(AdminMenuSG.resident_rebind_room)
|
||||||
|
|
||||||
|
|
||||||
|
@inject
|
||||||
|
async def get_rebind_rooms_data(
|
||||||
|
dialog_manager: DialogManager,
|
||||||
|
rooms_repository: FromDishka[RoomsRepository],
|
||||||
|
**kwargs,
|
||||||
|
):
|
||||||
|
floor_id = dialog_manager.dialog_data.get("rebind_floor_id")
|
||||||
|
|
||||||
|
if not floor_id:
|
||||||
|
return {"rooms": []}
|
||||||
|
|
||||||
|
rooms = await rooms_repository.get_rooms_by_floor(floor_id)
|
||||||
|
rooms.sort(key=lambda r: r.number)
|
||||||
|
|
||||||
|
return {
|
||||||
|
"rooms": [(r.id, str(r.number)) for r in rooms],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def on_rebind_room_selected(
|
||||||
|
callback: CallbackQuery,
|
||||||
|
widget: Select,
|
||||||
|
dialog_manager: DialogManager,
|
||||||
|
item_id: str,
|
||||||
|
):
|
||||||
|
dialog_manager.dialog_data["rebind_room_id"] = int(item_id)
|
||||||
|
await dialog_manager.switch_to(AdminMenuSG.resident_rebind_confirm)
|
||||||
|
|
||||||
|
|
||||||
|
@inject
|
||||||
|
async def get_rebind_confirm_data(
|
||||||
|
dialog_manager: DialogManager,
|
||||||
|
residents_repository: FromDishka[ResidentsRepository],
|
||||||
|
rooms_repository: FromDishka[RoomsRepository],
|
||||||
|
**kwargs,
|
||||||
|
):
|
||||||
|
resident_id = dialog_manager.dialog_data.get("selected_resident_id")
|
||||||
|
new_room_id = dialog_manager.dialog_data.get("rebind_room_id")
|
||||||
|
|
||||||
|
resident = await residents_repository.get_resident_by_id(resident_id) if resident_id else None
|
||||||
|
new_room = await rooms_repository.get_room_by_id(new_room_id) if new_room_id else None
|
||||||
|
old_room = await rooms_repository.get_room_by_id(resident.room) if resident else None
|
||||||
|
|
||||||
|
resident_name = resident.real_name if resident and resident.real_name else "???"
|
||||||
|
old_room_number = old_room.number if old_room else "???"
|
||||||
|
new_room_number = new_room.number if new_room else "???"
|
||||||
|
|
||||||
|
return {
|
||||||
|
"resident_name": resident_name,
|
||||||
|
"old_room_number": old_room_number,
|
||||||
|
"new_room_number": new_room_number,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@inject
|
||||||
|
async def on_rebind_confirm(
|
||||||
|
callback: CallbackQuery,
|
||||||
|
button: Button,
|
||||||
|
dialog_manager: DialogManager,
|
||||||
|
residents_repository: FromDishka[ResidentsRepository],
|
||||||
|
):
|
||||||
|
resident_id = dialog_manager.dialog_data.get("selected_resident_id")
|
||||||
|
new_room_id = dialog_manager.dialog_data.get("rebind_room_id")
|
||||||
|
|
||||||
|
if resident_id and new_room_id:
|
||||||
|
resident = await residents_repository.get_resident_by_id(resident_id)
|
||||||
|
if resident:
|
||||||
|
await residents_repository.update_resident_room(resident_id, new_room_id)
|
||||||
|
await callback.answer("✅ Резидент перепривязан к новой комнате!")
|
||||||
|
|
||||||
|
await dialog_manager.switch_to(AdminMenuSG.resident_info)
|
||||||
|
|
||||||
|
|
||||||
|
async def on_rebind_cancel(
|
||||||
|
callback: CallbackQuery,
|
||||||
|
button: Button,
|
||||||
|
dialog_manager: DialogManager,
|
||||||
|
):
|
||||||
|
await dialog_manager.switch_to(AdminMenuSG.resident_info)
|
||||||
|
|
||||||
|
|
||||||
async def on_resident_name_input(
|
async def on_resident_name_input(
|
||||||
message: Message,
|
message: Message,
|
||||||
widget: MessageInput,
|
widget: MessageInput,
|
||||||
@@ -462,6 +574,11 @@ resident_info_window = Window(
|
|||||||
on_click=lambda c, b, m: m.switch_to(AdminMenuSG.remove_hours_select),
|
on_click=lambda c, b, m: m.switch_to(AdminMenuSG.remove_hours_select),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
Button(
|
||||||
|
Const("🔄 Перепривязать к комнате"),
|
||||||
|
id="rebind_resident_btn",
|
||||||
|
on_click=on_rebind_resident,
|
||||||
|
),
|
||||||
Button(
|
Button(
|
||||||
Const("🚪 Разлогинить"),
|
Const("🚪 Разлогинить"),
|
||||||
id="logout_resident_btn",
|
id="logout_resident_btn",
|
||||||
@@ -643,3 +760,63 @@ resident_delete_confirm_window = Window(
|
|||||||
),
|
),
|
||||||
state=AdminMenuSG.resident_delete_confirm,
|
state=AdminMenuSG.resident_delete_confirm,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
resident_rebind_floor_window = Window(
|
||||||
|
Const("<blockquote>🏢 <b>Перепривязка резидента</b></blockquote>\n\nВыберите новый этаж:"),
|
||||||
|
Group(
|
||||||
|
Select(
|
||||||
|
Format("{item[1]}"),
|
||||||
|
id="rebind_floor_select",
|
||||||
|
item_id_getter=lambda x: x[0],
|
||||||
|
items="floors",
|
||||||
|
on_click=on_rebind_floor_selected,
|
||||||
|
),
|
||||||
|
width=2,
|
||||||
|
),
|
||||||
|
SwitchTo(
|
||||||
|
Const("◀️ Отмена"),
|
||||||
|
id="cancel_rebind_floor",
|
||||||
|
state=AdminMenuSG.resident_info,
|
||||||
|
),
|
||||||
|
state=AdminMenuSG.resident_rebind_floor,
|
||||||
|
getter=get_rebind_floors_data,
|
||||||
|
)
|
||||||
|
|
||||||
|
resident_rebind_room_window = Window(
|
||||||
|
Const("<blockquote>🚪 <b>Перепривязка резидента</b></blockquote>\n\nВыберите новую комнату:"),
|
||||||
|
Group(
|
||||||
|
Select(
|
||||||
|
Format("{item[1]}"),
|
||||||
|
id="rebind_room_select",
|
||||||
|
item_id_getter=lambda x: x[0],
|
||||||
|
items="rooms",
|
||||||
|
on_click=on_rebind_room_selected,
|
||||||
|
),
|
||||||
|
width=3,
|
||||||
|
),
|
||||||
|
SwitchTo(
|
||||||
|
Const("◀️ Назад"),
|
||||||
|
id="back_to_rebind_floor",
|
||||||
|
state=AdminMenuSG.resident_rebind_floor,
|
||||||
|
),
|
||||||
|
state=AdminMenuSG.resident_rebind_room,
|
||||||
|
getter=get_rebind_rooms_data,
|
||||||
|
)
|
||||||
|
|
||||||
|
resident_rebind_confirm_window = Window(
|
||||||
|
Format("<blockquote>✅ <b>Подтверждение перепривязки</b></blockquote>\n\nПерепривязать резидента <b>{resident_name}</b> из комнаты <code>{old_room_number}</code> в комнату <code>{new_room_number}</code>?"),
|
||||||
|
Row(
|
||||||
|
Button(
|
||||||
|
Const("✅ Да"),
|
||||||
|
id="confirm_rebind",
|
||||||
|
on_click=on_rebind_confirm,
|
||||||
|
),
|
||||||
|
Button(
|
||||||
|
Const("❌ Нет"),
|
||||||
|
id="cancel_rebind",
|
||||||
|
on_click=on_rebind_cancel,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
state=AdminMenuSG.resident_rebind_confirm,
|
||||||
|
getter=get_rebind_confirm_data,
|
||||||
|
)
|
||||||
|
|||||||
@@ -19,6 +19,9 @@ class AdminMenuSG(StatesGroup):
|
|||||||
resident_info = State()
|
resident_info = State()
|
||||||
resident_logout_confirm = State()
|
resident_logout_confirm = State()
|
||||||
resident_delete_confirm = State()
|
resident_delete_confirm = State()
|
||||||
|
resident_rebind_floor = State()
|
||||||
|
resident_rebind_room = State()
|
||||||
|
resident_rebind_confirm = State()
|
||||||
add_hours_select = State()
|
add_hours_select = State()
|
||||||
remove_hours_select = State()
|
remove_hours_select = State()
|
||||||
add_hours_custom = State()
|
add_hours_custom = State()
|
||||||
|
|||||||
@@ -43,6 +43,16 @@ class ResidentsRepository:
|
|||||||
real_name=real_name,
|
real_name=real_name,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
async def update_resident_room(
|
||||||
|
self,
|
||||||
|
resident_id: int,
|
||||||
|
room_id: int,
|
||||||
|
) -> Resident | None:
|
||||||
|
return await self.residents_dao.update(
|
||||||
|
resident_id,
|
||||||
|
room=room_id,
|
||||||
|
)
|
||||||
|
|
||||||
async def add_active_hours(self, resident_id: int, hours: int) -> Resident | None:
|
async def add_active_hours(self, resident_id: int, hours: int) -> Resident | None:
|
||||||
resident = await self.residents_dao.get_by_id(resident_id)
|
resident = await self.residents_dao.get_by_id(resident_id)
|
||||||
if resident:
|
if resident:
|
||||||
|
|||||||
Reference in New Issue
Block a user