|
| 1 | +from __future__ import annotations |
| 2 | + |
| 3 | +from fastapi_sqlalchemy import db |
| 4 | + |
| 5 | +from userdata_api.exceptions import ObjectNotFound |
| 6 | +from userdata_api.models.db import Info, Param |
| 7 | +from userdata_api.schemas.admin import UserCardGet, UserCardUpdate |
| 8 | +from userdata_api.schemas.user import UserInfo, UserInfoUpdate |
| 9 | + |
| 10 | +from .user import patch_user_info as user_patch |
| 11 | + |
| 12 | + |
| 13 | +async def patch_user_info(new: UserCardUpdate, user_id: int, user: dict[str, int | list[dict[str, str | int]]]) -> None: |
| 14 | + """ |
| 15 | + Обновить информацию о пользователе в соотетствии с переданным токеном. |
| 16 | +
|
| 17 | + Метод обновляет только информацию из источников `admin`. |
| 18 | +
|
| 19 | + Для обновления от имени админа нужен скоуп `userdata.info.admin` |
| 20 | +
|
| 21 | + :param new: модель запроса, в ней то, на что будет изменена информация о пользователе |
| 22 | + :param user_id: Айди пользователя |
| 23 | + :param user: Сессия пользователя выполняющего запрос |
| 24 | + :return: get_user_info для текущего пользователя с переданными правами |
| 25 | + """ |
| 26 | + update_info = [] |
| 27 | + if new.full_name is not None: |
| 28 | + update_info.append(UserInfo(category="Личная информация", param="Полное имя", value=new.full_name)) |
| 29 | + if new.student_card_number is not None: |
| 30 | + update_info.append( |
| 31 | + UserInfo(category="Учёба", param="Номер студенческого билета", value=new.student_card_number) |
| 32 | + ) |
| 33 | + if update_info: |
| 34 | + update_request = UserInfoUpdate(items=update_info, source="admin") |
| 35 | + await user_patch(update_request, user_id, user) |
| 36 | + |
| 37 | + |
| 38 | +async def get_user_info(user_id: int, user: dict[str, int | list[dict[str, str | int]]]) -> UserCardGet: |
| 39 | + """ |
| 40 | + Получить профсоюзную информацию пользователя для админки. |
| 41 | +
|
| 42 | + :param user_id: Айди пользователя, информацию о котором запрашиваем |
| 43 | + :param user: Сессия пользователя, выполняющего запрос (должен иметь права администратора) |
| 44 | + :return: Словарь с данными пользователя: |
| 45 | + - user_id: ID пользователя |
| 46 | + - full_name: Полное имя (из параметра "Полное имя") |
| 47 | + - student_card_number: Номер студенческого билета (из параметра "Номер студенческого билета") |
| 48 | + - union_card_number: Номер профсоюзного билета (из параметра "Номер профсоюзного билета") |
| 49 | + - is_union_member: Статус мэтчинга (из параметра "Членство в профсоюзе") |
| 50 | + - last_check_timestamp: Дата последней проверки |
| 51 | + """ |
| 52 | + users = db.session.query(Info).filter(Info.owner_id == user_id).first() |
| 53 | + if not users: |
| 54 | + raise ObjectNotFound(Info, user_id) |
| 55 | + full_name = ( |
| 56 | + db.session.query(Info) |
| 57 | + .join(Info.param) |
| 58 | + .filter(Info.owner_id == user_id, Param.name == "Полное имя") |
| 59 | + .one_or_none() |
| 60 | + ) |
| 61 | + is_union_member = ( |
| 62 | + db.session.query(Info) |
| 63 | + .join(Info.param) |
| 64 | + .filter(Info.owner_id == user_id, Param.name == "Членство в профсоюзе") |
| 65 | + .one_or_none() |
| 66 | + ) |
| 67 | + student_card_number = ( |
| 68 | + db.session.query(Info) |
| 69 | + .join(Info.param) |
| 70 | + .filter(Info.owner_id == user_id, Param.name == "Номер студенческого билета") |
| 71 | + .one_or_none() |
| 72 | + ) |
| 73 | + union_card_number = ( |
| 74 | + db.session.query(Info) |
| 75 | + .join(Info.param) |
| 76 | + .filter(Info.owner_id == user_id, Param.name == "Номер профсоюзного билета") |
| 77 | + .one_or_none() |
| 78 | + ) |
| 79 | + result = { |
| 80 | + "user_id": user_id, |
| 81 | + "full_name": full_name.value if full_name else None, |
| 82 | + "student_card_number": student_card_number.value if student_card_number else None, |
| 83 | + "union_card_number": union_card_number.value if union_card_number else None, |
| 84 | + "is_union_member": is_union_member.value if is_union_member else "false", |
| 85 | + } |
| 86 | + return result |
0 commit comments