mirror of
https://github.com/koloideal/DutyLog.git
synced 2026-06-10 10:25:29 +03:00
update
This commit is contained in:
@@ -36,6 +36,30 @@ class ResidentsDAO:
|
||||
result = await self.session.execute(select(Resident))
|
||||
return list(result.scalars().all())
|
||||
|
||||
async def search_by_room_number(self, room_number: int) -> list[Resident]:
|
||||
from dutylog.infrastructure.database.models.room import Room
|
||||
result = await self.session.execute(
|
||||
select(Resident)
|
||||
.join(Room, Resident.room == Room.id)
|
||||
.where(Room.number == room_number)
|
||||
)
|
||||
return list(result.scalars().all())
|
||||
|
||||
async def search_by_name(self, query: str) -> list[Resident]:
|
||||
result = await self.session.execute(
|
||||
select(Resident).where(Resident.real_name.ilike(f"%{query}%"))
|
||||
)
|
||||
return list(result.scalars().all())
|
||||
|
||||
async def get_busy_residents_with_users(self) -> list[tuple[Resident, int]]:
|
||||
result = await self.session.execute(
|
||||
select(Resident)
|
||||
.where(Resident.is_busy == True)
|
||||
.where(Resident.user_entity.is_not(None))
|
||||
)
|
||||
residents = result.scalars().all()
|
||||
return [(r, r.user_entity) for r in residents if r.user_entity]
|
||||
|
||||
async def create(self, resident: Resident) -> Resident:
|
||||
self.session.add(resident)
|
||||
await self.session.commit()
|
||||
|
||||
@@ -74,5 +74,32 @@ class ResidentsRepository:
|
||||
async def get_all_residents(self) -> list[Resident]:
|
||||
return await self.residents_dao.get_all()
|
||||
|
||||
async def search_residents(
|
||||
self, query: str, users_repository
|
||||
) -> tuple[list[Resident], str]:
|
||||
if query.isdigit():
|
||||
room_number = int(query)
|
||||
residents = await self.residents_dao.search_by_room_number(room_number)
|
||||
if residents:
|
||||
return residents, f"комнате {room_number}"
|
||||
|
||||
residents = await self.residents_dao.search_by_name(query)
|
||||
if residents:
|
||||
return residents, f"имени '{query}'"
|
||||
|
||||
busy_residents_data = await self.residents_dao.get_busy_residents_with_users()
|
||||
matched_residents = []
|
||||
|
||||
for resident, user_id in busy_residents_data:
|
||||
user = await users_repository.get_user_by_id(user_id)
|
||||
if user and user.username:
|
||||
if query.lower() in user.username.lower():
|
||||
matched_residents.append(resident)
|
||||
|
||||
if matched_residents:
|
||||
return matched_residents, f"username '@{query}'"
|
||||
|
||||
return [], query
|
||||
|
||||
async def delete_resident(self, resident_id: int) -> None:
|
||||
await self.residents_dao.delete(resident_id)
|
||||
|
||||
Reference in New Issue
Block a user